15. 策略与审批
角色给出了粗粒度的划分(guest / user / owner)。策略是底下那一层,允许你说:“user 能调 exec,但只能跑只读命令”;或者”任何动到 GitHub MCP 服务的工具都需要我先审批”。策略是把共享智能体做得安全的方式。
15.1 三种效果
每条策略规则在智能体准备调一个工具时会产生三种结果之一:
- Allow —— 调用继续。
- Deny —— 调用被拦下;智能体收到一个错误代替结果,然后决定接下来怎么做。
- Require approval —— 调用暂停;owner 收到包含工具名和参数的通知,必须先 approve 或 reject。
多条规则匹配时,最严格的胜出。
15.2 规则看什么
一条规则可以匹配:
- 工具名 / 资源 ——
file_write、exec,或 MCP 服务 id 比如github。 - 工具参数模式 —— 例如
exec且命令以rm开头。 - 主体角色 —— guest / user / owner。
- 资源路径 —— 对文件工具,即工具要触及的路径。
- 通道 —— 有时希望在 CLI/Web 上比公开 Telegram 上更宽松。
规则会组合。一般先放两条宽泛的默认,然后遇到具体场景再加例外。
15.3 hermit config policy 命令
# 列出某智能体上的规则。
hermit config --agent main policy list
# 拒绝 guest 访问 exec。
hermit config --agent main policy set exec '[{"type":"role","value":"guest"}]' --effect deny
# 对 user 在 GitHub MCP 服务上的访问要求审批。
hermit config --agent main policy set github '[{"type":"role","value":"user"}]' --resource-type mcp --effect require_approval
# 删除一条规则。
hermit config --agent main policy delete exec --effect deny
<resource-key> 通常是工具名(如 exec)、MCP 服务 id(如 github)或 *。Grants 是 JSON 数组,例如 [{"type":"role","value":"guest"}]、[{"type":"role","value":"user"}]、[{"type":"any"}]。
15.4 审批 —— Owner 这一边
当一个工具需要审批时,智能体的回复暂停,owner 会收到通知(Web UI 的 Observe 选项卡,以及配好的通道通知)。通知会显示:
- 请求来自哪个 user / session。
- 智能体想调哪个工具。
- 完整参数。
- 智能体给出的简短理由。
owner 点 approve 或 reject。会话以该决策恢复;智能体把结果当作普通工具结果处理。
待审批会超时(默认几分钟);超时算作 reject。
15.5 合理的默认
适合多数共享智能体的起步策略:
# Guest 不能 exec。
hermit config --agent main policy set exec '[{"type":"role","value":"guest"}]' --effect deny
# Guest 不能用写类 shell / 文件工具。
hermit config --agent main policy set file_write '[{"type":"role","value":"guest"}]' --effect deny
# 外部系统对 user 要审批。
hermit config --agent main policy set github '[{"type":"role","value":"user"}]' --resource-type mcp --effect require_approval
hermit config --agent main policy set slack '[{"type":"role","value":"user"}]' --resource-type mcp --effect require_approval
除非你显式写了针对 owner 的规则,owner 不受约束。(你可以这么做 —— 给自己加一条”破坏性操作要我确认”的规则,有时是明智的。)
15.6 Web 管理界面
Manage → Policies 选项卡显示规则列表,带启用/停用开关和新增表单。
Observe 选项卡顶部显示待审批项。
15.7 角色差异
| Owner | User | Guest | |
|---|---|---|---|
| 查看策略规则 | ✓ | — | — |
| 增删规则 | ✓ | — | — |
| 批准待审请求 | ✓ | — | — |
15.8 How-to 配方
15.8.1 禁止 guest 写文件
hermit config --agent main policy set file_write '[{"type":"role","value":"guest"}]' --effect deny
要做路径特定规则,用 --resource-type file 加一个带 sandbox、mode、path 的 JSON scope。
验证 —— 让智能体往 /etc/hosts 写;应该被拒,智能体能恢复。
15.8.2 任何破坏性 shell 命令都要审批
hermit config --agent main policy set exec '[{"type":"role","value":"user"}]' --effect require_approval
验证 —— 让智能体”删掉临时目录”;你应该看到审批提示。
15.8.3 把公开智能体收紧
对 access-level=public 的智能体,为 guest 角色写 deny 规则,覆盖:exec、file_write、每一个会花钱的 MCP 工具、每一个会在外部系统改状态的 MCP 工具。file_read 只允许在某个公开路径下。
15.9 FAQ
规则拒绝一个调用时,智能体的回复怎么办? 智能体把 deny 当作工具错误,通常会调整 —— 道歉、给替代方案、或告诉你它本来打算做什么。
策略规则能带时限吗? 原生不支持。如果你需要临时放宽,加规则、用智能体、再删规则。
审批通知发到哪里? 默认 Observe 选项卡。如果你配了通知通道(比如发给 owner 的 Telegram 聊天),也会送到那里。各通道 adapter 对审批提示的支持程度不一 —— 见 第 17 章。
15.10 指引
- 在策略之前的粗粒度门控 → 第 13 章 · 访问级别。
- 谁算 guest / user / owner → 第 5 章 · 用户与身份。
- 实时观察工具调用与审批 → 第 20 章 · Web 管理界面。