安全与隐私
本页讲解 Anyy 的信任模型:运行时如何为一个能力很强、可拥有 root 权限的助手 划定风险边界,它会脱敏哪些内容,以及哪些数据留在你的机器上、哪些会离开。本页是 全局地图;细节在各链接页面中展开。
Anyy 是 本地优先(local-first) 的。你的会话、记忆、审计轨迹和密钥都保存 在本机的 SQLite 数据库以及 home 目录下的文件里。模型 Provider 是可配置的后端,Anyy 会调用它们——它们不是 Anyy 的身份,而且只有回答当前轮次所需的数据才会 发送给它们。
信任模型
Anyy 被设计为 有意具备很强能力。当你启用某个能力包后,它可以在主机上执行 shell 命令、编辑文件。信任模型并不是把这种能力藏在永久的墙后面,而是在动作真正执行 之前,把它的 后果 讲清楚、并保证可恢复。
支撑这一模型的有三个核心理念:
- 权限不等于风险。 拥有 root 能力并不意味着每个操作都危险。风险取决于操作 实际 做了什么——它会不会破坏连通性、改动凭据、销毁数据,还是仅仅读取状态—— 而不是取决于这个工具 是否有能力 做危险的事。
- 风险判定是确定性的,且归运行时所有。 模型负责挑选工具、填写参数,但它 不 决定一次调用有多危险。运行时中的确定性分类器会检查解析后的参数、路径和 命令结构,归入一个效果类别,再从固定的表里查出处理路径。判定风险 不会 额外 调用模型。
- 属主权限始终显式可用。 确认、ChangePlan、回滚、校验、审计与脱敏的存在,是为了 传达风险并提供恢复手段——它们不是隐藏的能力封禁。坚定的属主始终可以通过相应的 关卡继续执行。
各层在设计上彼此独立:产品身份(Anyy)、Role 身份(SOUL.md 中的人设)、
工作区上下文 与 权限边界 是不同的层。人设文件不能授予工具、不能绕过审批、也
不能重定义产品身份;工作区是存储——不是 安全边界。
理解这一模型最快的办法:问自己“如果这个操作失败了,我能不能自己恢复?”如果能, Anyy 会直接执行;如果它可能导致失去访问能力、或者不可逆,运行时会先停下来询问。
审批与 ChangePlan 作为安全边界
每一个会改变状态或具备 root 能力的操作都会被归入一个 效果类别(effect class), 每个效果类别再映射到固定的 处理路径。这个映射就是安全边界。(面向用户的审批 流程——提示、ChangePlan 卡片、计划审批——参见 审批与 ChangePlans。)
| 效果类别 | 涵盖范围 | 处理路径 |
|---|---|---|
read_only | 读取主机、进程、网络、软件包、服务、日志或文件状态 | 直接执行 |
workspace_write | 普通工作区工件——笔记、报告、生成的文件 | 直接执行 |
anyy_managed_write | 持久化的助手状态(记忆、技能、技能文档) | 审计(执行并记录) |
system_config_write | 持久化的操作系统 / init / 网络 / 运行时配置 | ChangePlan |
service_runtime_change | 启动/停止/重启/启用/禁用某个服务 | 确认(Confirm) |
package_change | 安装 / 移除 / 升级 / 重新配置软件包 | ChangePlan |
credential_or_security_change | 凭据、密钥、鉴权策略、用户账户、SSH 访问 | 强制 ChangePlan |
destructive_or_lockout | 擦除数据、格式化设备、递归删除、关机、锁死访问 | 强制 ChangePlan |
复合 shell 命令会被拆分、逐段判定;命令链中 最强 的效果胜出,因此“读取再管道 给一个破坏性写入”会被当作破坏性操作处理。
ChangePlan 在机制上是什么。 当处理路径为 change_plan 或 force_change_plan 时,
运行时会创建一条 ChangePlan 记录,捕获拟议变更、预期影响、受影响的服务、校验步骤、
回滚步骤、内容 哈希 以及 有效期(默认 10 分钟)。在该计划获批之前,操作无法
执行。
这一边界由运行时的预检(preflight)强制执行,模型无法靠“话术”绕过:
- 需要 ChangePlan 的工具会被 拦截,除非存在一个已获批的计划 ID 和与之匹配的计划 哈希——这两者都由运行时提供,绝不由模型提供。
force_change_plan操作要求计划被 强制批准;普通批准不足以放行。- 执行前,运行时会重新推导计划哈希,若它与已获批计划不再匹配则拒绝执行——因此 “先获批再被改动”的计划不会被执行。
- 普通批准会过期;过期的计划会被拒绝。(强制批准的计划会有意跳过过期检查,但绝不 跳过哈希检查。)
批准授权的是一个 特定的、带哈希的 计划——而不是一张通行证。如果拟议命令在你批准
之后发生变化,哈希校验会失败、执行被拒。批准一个 force_change_plan(用于凭据或
破坏性操作)是你能采取的最强动作;请把它当作一次审慎的、不可逆的决定。
审批可以在当前活跃的任意界面上回应——TUI、CLI、聊天通道或面板——并且 每一次 批准、 拒绝、强制批准、执行、校验与回滚都会写入审计轨迹。参见 审计。
密钥脱敏
Anyy 把凭据类信息视为绝不应出现在你日后会回看的地方。编码规则明确要求: 在日志、错误、调试包、快照和测试夹具中对密钥脱敏。
它的工作方式:
- 一个集中的脱敏器,处处复用。 同一道脱敏处理会作用于日志、审计轨迹、调试包、 工具输出、Provider 错误和通道消息。不存在第二条更弱、会跳过它的路径。
- 基于取值的替换。 脱敏器由运行时当前已知的密钥取值构建。字符串中出现的这些取值
都会被替换为
[REDACTED],并按取值从长到短排序,使最具体的匹配优先生效。短于 4 字节的取值会被忽略,以免破坏普通文本。 - 审计载荷按结构脱敏。 写入审计事件时,其摘要、对象 ID 和载荷 map 会被递归地 (包括嵌套的 map、切片和字符串列表)送入脱敏器,然后才持久化该事件。
- Provider 诊断信息是受限的。 Provider 状态与调试输出只暴露简短、已脱敏的尝试 摘要——绝不包含完整请求体、完整上下文、Provider 载荷或密钥。
密钥是被引用的,不是内联的。工具与 Provider 配置通过引用(env:、file:、secret:)
指向某个密钥,运行时仅在真正需要时才解析其取值。密钥列举接口只返回引用的
名称与元数据——绝不返回底层取值。
脱敏是一种强力的、集中式的尽力而为,而不是密码学保证。它只能遮蔽运行时确实作为密钥 持有的取值。一个从未被登记为密钥的凭据(例如直接内联粘贴进提示词,或被某个外部命令 回显、而运行时无法将其识别为敏感信息)将不会被识别。请把凭据存为密钥引用,而不要 内联。
凭据在物理上的存放位置,参见 凭据与鉴权。
哪些留在本地,哪些会离开
留在你的机器上:
- 权威状态存储——会话、消息、工具调用与结果、审批、ChangePlan、记忆、技能使用记录和 能力缓存——保存在本地 SQLite 中。
- 审计轨迹(SQLite,可选地镜像为本地 JSONL)。
- 密钥,以文件形式保存在 home 目录下。
- 日志、工件和备份。
- 会话持久化:Anyy 在本地保存对话记录,不依赖 Provider 侧的会话状态。
出于必要会离开你的机器:
- 模型 Provider 调用。 为回答一个轮次,Anyy 会把组装好的提示词——系统/产品 身份、相关上下文、近期消息和工具结果——通过网络发送给所配置的模型 Provider。这是 主要离开本机的数据,且只发往你配置的那个 Provider。
- 通道与连接器流量。 如果你启用了聊天通道或外部连接器(邮件、日历、MCP 服务器等), 消息以及这些功能所操作的数据会发往相应服务。
信任模型里没有单独的分析或遥测管道:离开本机的数据,就是 Provider 调用,加上你显式 开启的通道与连接器。各存储的留存与删除细节,以及更完整的“哪些数据会离开本机”拆解, 参见 数据、留存与删除。
网关与面板暴露
Anyy 作为常驻 网关(gateway) 运行,本地客户端连接到它。它的本地传输是
Unix 域套接字。同一套网关配置也包含 TCP/WebSocket 监听器;在当前构建中,如果
省略 gateway.tcp,加载器会默认启用该监听器,监听 0.0.0.0:8765,模式为 open。
在确认有效配置之前,请把它当作已暴露到网络来处理。
一旦超出本地套接字,访问控制就变得重要:
- 网络监听器支持 open、token、pairing(配对) 和 allowlist(允许名单) 模式,用于控制哪些客户端可以连接。
- pairing token 和通道 token 本身就是 敏感状态,被当作密钥对待。
- 上下文 token(运行态会话状态)会被脱敏、仅限 root,并在吊销、登出或重置时清除。
启用的 TCP/WebSocket 监听器若处于 open 模式,会接受任何能连到它的客户端。如果你
只需要本地客户端,请禁用 TCP;若要暴露到局域网,请绑定到明确地址,并在暴露前使用
token、pairing 或 allowlist。请把 pairing/通道 token 当作密码看待。
网关监听器与面板的配置与运维细节——如何设置 token、pairing 和访问模式——在 凭据与鉴权 中说明。
你的数据存放在哪
简而言之:本地 SQLite 数据库是权威存储,密钥、日志、工件和备份以文件形式保存在 home
目录下(~/.anyy/——例如 ~/.anyy/state.db、~/.anyy/secrets/、
~/.anyy/logs/)。JSONL 镜像用于检视、恢复与导出。
这里只是摘要。完整的各存储拆解、留存窗口,以及如何导出或删除每一类数据,参见 数据、留存与删除。
加固清单
让一套 Anyy 部署更稳妥的可执行步骤:
- 检查有效的网关监听器。 如果不需要网络访问,请设置
gateway.tcp.enabled: false。 如果确实要启用 TCP/WebSocket RPC,请审慎地绑定,且绝不在无鉴权的情况下暴露它。 - 在任何网络监听器上要求 token 或 pairing,并配合 allowlist,使只有已知 客户端可以连接。
- 把每一个凭据都存为密钥引用(
env:、file:、secret:),而不要把密钥内联进 提示词、工具配置或命令——内联的取值落在脱敏范围之外。 - 保护好 home 目录。
~/.anyy/中保存着状态数据库、密钥和审计轨迹,请将其 文件系统权限限制为属主。 - 日常使用让 ChangePlan 保持默认(balanced)模式;若你希望更多操作走审查路径, 可选择更严格的模式。
- 把强制批准当作审慎之举。 强制路径用于凭据和破坏性操作——批准前请核对计划中的 命令,并依靠记录的哈希来发现篡改。
- 定期审阅审计轨迹(并在任何强制批准动作之后审阅),以确认实际执行了什么;参见 审计。
- 收窄通道与连接器的范围。 每启用一个通道或连接器,都会扩大离开本机的数据——只 开启你会用到的,并记住 pairing/通道 token 是敏感的。
- 让备份保持在本地并加以保护,因为备份包含你状态的副本;按 数据、留存与删除 中所述管理和清理它们。