1. 防火墙规则 schema 一览
每条规则都携带同样的字段。只有verdict 总是必需的——其他一切都收窄该
规则匹配什么或配置所选判定,而一个缺失的匹配器是空真。
| 字段 | 用途 |
|---|---|
priority | 评估顺序——更低的先运行。 |
verdict | 规则匹配时的动作(必需)。 |
stage | 要限定到的 执行面;空 = 全部。 |
tool_name_glob | 针对工具名的 Glob。 |
args_match_json | JSONPath 参数谓词,作为一个 JSON 编码字符串。 |
egress_json | Host / CIDR 白名单-黑名单(egress 规则),作为一个 JSON 编码字符串。 |
sanitize_json | 脱敏配置(当 verdict = sanitize 时),作为一个 JSON 编码字符串。 |
cap_cost_cents | 以美元分计的运行成本上限(当 verdict = cap_cost 时)。 |
sequence_json | 有序多步链谓词(序列规则),作为一个 JSON 编码字符串。 |
label / notes | 人类名称和理由——显示在事件中,被引擎忽略。 |
default_verdict。
2. priority —— 评估顺序
一个整数序数。更低的先运行;两条相同优先级的规则由规则 id(插入顺序)
打破平局。把你特定的划分放在你宽泛的兜底之上——一个优先级 10 的针对一个
受信任工具的 allow 胜过一个优先级 100 的 deny *。
3. verdict —— 动作
那一个必需字段。当一条规则匹配时,它的判定决定对该调用发生什么:
| 判定 | 效果 |
|---|---|
allow | 放行该调用,会被记录。 |
audit | 放行并记录以供审查——通常的 default_verdict。 |
deny | 拦截该调用。 |
sanitize | 从工具参数中脱敏匹配的子串,然后转发。 |
pending_approval | 为一名人工审查者挂起该调用。 |
cap_cost | 一旦一次智能体运行累积的花费越过一个上限就拒绝。 |
deny 在 inbound 执行面上返回 HTTP 400 firewall_blocked,或在
mcp 执行面上返回一个工具错误。一个被挂起的调用返回 HTTP 400
firewall_approval_pending,带一个智能体轮询的 id。在
影子模式 下,每个执行性判定都被降级为
audit,原因前缀为 [shadow] would …。关于完整的表和拦截形态参见
判定。
4. stage —— 执行面
把规则钉到防火墙的执行面之一。把它留空,该规则就适用于所有执行面:
inbound —— 声明的工具定义
inbound —— 声明的工具定义
一个智能体在请求上向模型声明的工具。在模型甚至还没能选中它之前就拦截
一个危险工具。
response —— 模型发出的 tool_calls
response —— 模型发出的 tool_calls
模型在其回复中发出的
tool_calls。mcp —— tools/call 派发
mcp —— tools/call 派发
通过 防火墙 MCP 网关 路由的一次
tools/call。egress —— 出站目的地
egress —— 出站目的地
一个工具触及的出站 host / IP / CIDR——SSRF 与数据外泄的执行面。
某些判定 + 执行面搭配在保存时被拒绝,因为该判定无法在那里触发:
cap_cost
是一个派发前的运行成本上限,在 response 和 egress 上是惰性的;
pending_approval 只在 inbound 上挂起,所以一个明确的 response/egress
钉住被拒绝。编辑器隐藏这些组合;API 拒绝它们。参见
执行面。5. tool_name_glob —— 哪个工具
针对工具名的一个小而大小写敏感的 glob——shell.* 针对一整个家族、*.delete
针对一个跨服务器的动词、http_fetch 针对一个精确工具。空或 * 匹配每一个
工具。一个可选的技能名 glob(相同语法)在所属技能上 AND 一个第二条件,
所以你能信任来自一个内置技能的工具,并对来自一个社区技能的它设门。
完整的语法——前缀、后缀、中缀、精确,以及绊倒人的那些边界——是它自己的
参考:Glob 模式语法。
6. args_match_json —— 用什么参数
glob 回答哪个工具;args_match_json 回答用什么参数——即”拦截
shell.exec”与”只在命令是 rm -rf 时拦截 shell.exec”之间的差别。它的值
是一个携带一组 JSONPath 子句、全部 AND的 JSON 编码字符串。解码后,
该子句对象看起来像:
"args_match_json": "{\"clauses\":[{\"path\":\"$.command\",\"op\":\"regex\",\"value\":\"rm -rf\"}]}"。
运算符是 eq、contains、regex、in、cidr_match、gt 和 lt。一个
缺失的 args_match_json 是空真——该规则仅靠 glob 匹配。完整的谓词语言、
路径语法,以及一个损坏子句的故障关闭行为在
验证参数 和
参数 cookbook 中。
7. egress_json —— 哪些目的地
用于 egress 执行面:一个持有 host / CIDR 白名单-黑名单的 JSON 编码
字符串,对照一个工具触及的出站目的地匹配。解码后,该对象看起来像:
deny 列表定义什么被拦截,而 allow 从其中划出
例外。
8. sanitize_json —— 脱敏参数
当 verdict = sanitize 时使用:一个点名哪些预设 / 自定义正则在清理后的调用
被转发之前从工具参数中脱敏匹配子串的 JSON 编码字符串——用于剥除一个
智能体掉进一个参数里的密钥或 PII 值而不拦截整个动作。解码后,该对象看起来
像:
9. cap_cost_cents —— 一个花费上限
当 verdict = cap_cost 时使用:一个逐规则的运行成本上限,一个以美元分
计的整数。当该规则匹配时,一旦该智能体运行累积的花费越过该上限,该调用就
被拒绝——一个针对失控循环的断路器,在事件中解析为 allow 或 deny。该上限
必须是明确且非负的,而该规则不能被钉到 response 或 egress(在那里判定
是惰性的)。完整行为在 封顶成本。
10. 一条完整的规则
把字段拼到一起——拒绝shell.exec,但只在命令看起来具破坏性时,限定到模型
发出的工具调用:
shell.exec,单个子句收窄到一个
破坏性命令,而判定拒绝。任何其命令不匹配该正则的 shell.exec 落到下一条
规则或策略默认。把一个密钥绑定到该策略(密钥上的 firewall_policy_id),
它在下一次调用时上线——无需重新部署。
11. 字段如何组合
一条有效规则最少需要什么?
一条有效规则最少需要什么?
一个
verdict。其他一切都是可选的:一个空的 stage 匹配所有执行面、
一个空的 tool_name_glob(或 *)匹配每一个工具,而一个缺失的
args_match_json 匹配任何参数。一个裸的 { "verdict": "audit" } 是一个
有效的兜底。匹配器是 AND 还是 OR?
匹配器是 AND 还是 OR?
它们 AND。一条规则只在它的执行面、工具 glob、技能 glob、参数子句和
egress 范围全部成立时触发。要表达 OR,写多条规则。
哪些字段与哪个判定搭配?
哪些字段与哪个判定搭配?
sanitize_json 只为 sanitize 判定读取;cap_cost_cents 只为
cap_cost;egress_json 只在 egress 执行面上。控制台在保存时验证这些
搭配,所以一条显示一种行为却永远无法执行它的规则无法被持久化。如果两条规则都匹配会怎样?
如果两条规则都匹配会怎样?
更低的
priority 胜出(平局由规则 id 打破)——首个匹配生效,而评估
在那里停止。参见 规则优先级。相关
创建策略
编写你的第一条策略并绑定一个密钥。
Glob 语法
完整的工具名 glob 语法。
判定
每个判定以及一次拦截是什么样。
验证参数
深入讲解 JSONPath 参数子句。
管理策略
编辑、版本化和还原策略。
防火墙规则
完整的匹配引擎参考。
