跳转到主要内容
一个编码智能体是你工作区中杠杆率最高的东西,也是最危险的。它运行 shell.exec、编辑文件、抓取 URL,并加载社区技能——其中任何一项都可能 rm -rf 一个卷、读取一个 .env,或外泄到一个攻击者主机。本配方用 防火墙 锁定那个执行面:拒绝破坏性 shell、校验你 确实允许的调用的参数、围栏 egress,并把真正高风险的操作挂起交给人工。 这一切都不触及你智能体的代码——策略存在于网关,并在下一次调用时执行。
下面的一切都在控制台中配置(Firewall → Posture / Policies)。那些 管理路由使用你的控制台会话,而非一个中继密钥。只有你智能体发出的 /v1/* 调用携带一个 sk-orca-… 密钥。策略编辑需要 Developer 角色。

1. 从观察开始,而不是拦截——安全编码智能体基线

不要盲目地编写规则。给智能体它的 sk-orca-… 密钥,然后打开 Firewall → Posture 并应用 balanced 自治级别。在一个事务中, 这会审计每一次工具调用、flag PII,并拒绝破坏性 shell——所以在你从 真实流量中了解该智能体其余行为的同时,最糟糕的动作已经被围栏了。 让它运行,然后读取 Firewall → Discovered tools:工作区见过的每一个 工具,被标记为 covered(有规则适用)或 gap(没有)。那份列表是 你的允许列表草稿。当信息流看起来对了,就转到 tight(默认拒绝)或编写 下面的定向策略。
balanced 是推荐的起始姿态;permissive 不拦截任何东西但仍记录一切; tight 是默认拒绝加上 secrets 和 SSRF 预设。参见 基线 了解每一个具体实例化 什么。

2. 拒绝破坏性 shell——不可协商的底线

对一个编码智能体最重要的单条规则是没有破坏性 shellbalancedtight 自治级别已经把它作为 Block destructive shell 预设附带,该预设 实例化出真实、可编辑的 deny 规则,覆盖工作区直连工具名 (shell.*bashcmd.*powershell.*exec.*)以及一个已注册 服务器暴露的 MCP 命名空间形式(*.shell.**.cmd.*、…)。 如果你宁愿把它收得比”拒绝所有 shell”更紧,就编写一条只拒绝破坏性 命令、审计其余的规则。一条规则在一个工具名 glob 加上一个可选的 参数谓词(针对调用参数的 JSONPath)上匹配:
Firewall → Policies 中,在你的默认值之上加入一条规则:
  • Tool glob: shell.exec
  • Args match(JSONPath 子句):
{
  "clauses": [
    { "path": "$.command", "op": "regex", "value": "(?i)\\brm\\s+-[a-z]*[rf]" }
  ]
}
  • Verdict: deny
参数运算符是一个封闭集——eqcontainsregexincidr_matchgtlt。一个 $.command 匹配该正则的调用被拦截; 其余一切落到下一条规则。
inbound 执行面上一次被拒绝的调用返回 HTTP 400,带错误码 firewall_blocked 和一条点明工具与原因的消息。一次通过 MCP 网关 派发的调用会作为一次工具错误firewall deny: …)返回,因此模型 能作出反应而不是崩溃。Inbound 拦截在上游模型调用之前触发,因此它们 不消耗模型 token。
参见 防火墙规则 了解完整的匹配语言(工具 glob、参数子句、序列、成本上限)。

3. 对你保留的工具校验参数

允许一个工具不等于允许它的每一个参数。同一个 JSONPath 谓词——它限定 一个 deny 的范围——也让你约束一个被允许调用的形态——这样 db.query 就不能携带一个 DROP,而 file.write 就不能逃出一个目录。

拦截一个 SQL DROP

Glob db.query,子句 {"path":"$.sql","op":"regex","value":"(?i)\\bdrop\\b"},判定 deny

脱敏参数中的密钥

判定 sanitize 会在调用被转发之前从工具调用参数中脱敏匹配的 子串。它绝不触及工具返回的内容;在 inbound 执行面上(还没有调用时 参数)它升级为一次拦截。
防火墙脱敏的是工具调用参数,而不是工具结果。要从一开始就阻止一个 密钥进入请求,把 Secrets Blocker 防护栏 附加到密钥上——它在模型看到之前筛查提示文本本身。两个平面组合在一起: 防护栏筛查文本,防火墙治理动作。

4. 控制 egress——围栏智能体能访问的地方

一个能抓取 URL 的编码智能体可能被引导进 SSRF(命中云元数据或一个 内部 10.x 主机)或被用来外泄。tight 自治级别附带一个 SSRF 预设, 它直接拒绝 fetch 形态的工具名http_fetchweb_searchfetch_urlrequest,以及它们的 <server>.* 形式)。 对于目的地级别的控制,编写一条 egress 规则。Egress 规则用 allow / deny 条目按 host 或 CIDR 限定范围,在 egress 执行面上 评估:
{ "deny": ["169.254.169.254", "10.0.0.0/8", "*.internal"] }
这会对一个工具报告的、落在私有范围、云元数据 IP 或内部主机名上的任何 出站目的地触发——在放行公共目的地的同时围栏危险的那些。
没有预设附带基于 CIDR 的 egress 规则——SSRF 预设匹配的是 fetch 形态的 工具名。上面的 host/CIDR 拒绝列表是你自己编写的。参见 阻止外泄 了解完整模式。

5. 把高风险操作挂起交给人工(HITL)

有些操作既不该被自动允许不该被自动拒绝——一次部署、一次 git push、一次破坏性迁移。对这些,使用 pending_approval 判定。调用 被挂起,智能体得到一个带审批 id 的”已挂起”响应,一名审查者带外解决它:
  1. 编写一条规则(例如 glob deploy.*,判定 pending_approval)。
  2. 被挂起的调用返回 HTTP 400 firewall_approval_pending,带一个 审批 id。
  3. 一名审查者从控制台(Developer+)或经由一个 HMAC 签名的 webhook 回调批准它。
  4. 智能体轮询该审批,然后携带一个一次性的 X-OrcaRouter-Firewall-Approval 头重新提交原始调用——网关便放行 这一次。
先在 shadow mode 中上线任何新策略。策略会完全像在生产中那样评估和 记录,但每个执行性判定都被降级为 audit,原因为 [shadow] would … ——这样你就能在它可能弄坏一次构建之前,先证明它在你预期的内容上触发。

6. 治理它加载的技能和 MCP 服务器

编码智能体在运行时拉入能力——社区技能、自带 MCP 服务器。防火墙在网关 治理二者:
  • 技能被扫描进一个风险等级,带一个执行模式(allow / quarantine / block)。一个自动检测到的技能被隔离——挂起等待审批——直到 一名审查者清查它。参见 技能
  • 你注册的 MCP 服务器会把每一次 tools/call 通过网关派发,网关在 派发前于 mcp 执行面上评估每一个。凭据被加密存储;一个健康探测报告 ok / degraded / down。参见 MCP 服务器加固一个 MCP 智能体

7. 验证与观察

在你依赖一条策略之前,对它做 dry-run。Test 标签页针对当前策略评估 一个样本工具调用,并显示判定、匹配到的规则和原因——什么都不派发, 什么都不持久化。一旦上线,Firewall → Events / Runs 就是每一次评估的 记录,可按判定、执行面、工具和运行过滤,而anomaly feed 会对照工作区 学习到的基线标记速率/成本尖峰、retry_loop 以及前所未见的工具路径。

回顾

防火墙参考

完整的策略平面——执行面、判定、解析、自治。

防火墙规则

匹配语言:glob、参数子句、egress、序列。

危险的工具调用

本配方所防御的威胁。

过度自主

为何过度授权的智能体是核心的智能体风险。

自治智能体配方

端到端锁定一个完全自治的智能体循环。

阻止外泄

深入讲解 egress 与致命三要素模式。