tool_name_glob)和哪些引數(args_match 子句,在
JSONPath 欄位上)。本頁是兩者的精確
語法——一個模式匹配什麼、不匹配什麼,以及每個
操作符如何強制類型——以便你在控制台撰寫的規則行為與你
在此讀到的完全一致。
頭號使用情境:把一個粗鈍的「封鎖 shell.exec」轉變成一個外科手術式的
「只在命令看起來像 rm -rf 時封鎖 shell.exec」。glob
挑選工具系列;引數操作符挑選其中危險的呼叫。
1. 此語法適用於何處
兩種形式都在防火牆規則上撰寫,在控制台中位於/console/firewall(寫入需要 Developer+)。你從不直接呼叫
匹配器——閘道在每次工具呼叫時對照解析後的政策
評估它。一條規則當其表面、其 tool_name_glob、其可選的技能 glob,以及其
args_match 子句全部匹配時才匹配;第一個匹配者勝出。
2. 工具名稱 glob 語法
tool_name_glob 是一個刻意小巧、可預測的語法——而非完整
正規表示式。模式以區分大小寫匹配(MCP 工具名稱
慣例上是小寫加點,所以大小寫摺疊會在你從 Discovered tools
分頁複製名稱時讓你意外)。
* (或空)— 匹配每個工具
* (或空)— 匹配每個工具
一個空模式或一個裸
* 匹配所有工具。在一個
全捕捉規則上使用它,或改為依賴政策的 default_verdict。foo.* — 前綴匹配
foo.* — 前綴匹配
shell.* 匹配 shell.exec、shell.read、shell.write。它
不匹配裸的 shell(點是必需的——前綴 glob
只涵蓋命名空間化的子項)。*.exec — 後綴匹配
*.exec — 後綴匹配
*.exec 匹配命名空間化的 shell.exec 以及裸的、
未命名空間化的 exec(供應商原生函式呼叫和
非命名空間化的 MCP 伺服器在裸動詞下暴露工具,所以
後綴規則涵蓋兩種形狀)。後綴錨定在點
或字串開頭,所以 *.exec 不匹配 shell.execute。*.X.* — 中間(中綴)匹配
*.X.* — 中間(中綴)匹配
*.shell.* 匹配任何 <server>.shell.<verb> 形狀——
local.shell.exec、byo.shell.run。它要求中綴
每一側至少一個字元,所以 *.shell.* 不
匹配裸的 shell 或單獨的 .shell.。只有對稱的
*.X.* 形狀被視為中綴;像 foo.*.bar 這樣的
混合模式會落入精確匹配。其他任何 — 精確匹配
其他任何 — 精確匹配
任何不是上述四個萬用字元形狀之一的模式
(包括字面工具名稱,或像
foo.*.bar 這樣的畸形組合)
都被當成精確、區分大小寫的字串比較。3. JSONPath 引數子句
args_match 是一組子句,每個是一個 {path, op, value} 三元組。
path 是進入工具呼叫引數物件的一個 JSONPath;op 是
七個操作符之一;value 是要比較的對象。一條規則中的所有子句都被
AND 連接在一起——每個子句都必須匹配,規則才會觸發。
支援的 JSONPath 子集
| 形狀 | 匹配 |
|---|---|
$.foo | 一個頂層鍵。 |
$.foo.bar | 一個巢狀鍵。 |
$.foo[0] | 按索引取得的陣列元素。 |
$.arr[1].k | 索引再鍵(上述的組合)。 |
$.*)、過濾器
($.foo[?(...)])、切片($.foo[0:2]),或遞迴下降($..foo)。
路徑上失敗封閉。如果一個子句的路徑解析為空——
鍵缺失、引數不是有效的 JSON,或值對操作符是
錯誤類型——該子句評估為假,規則不
觸發,評估落入下一條規則或政策
預設值。畸形引數從不自動拒絕,也從不讓引擎崩潰。
4. 引數操作符
七個操作符,一個封閉集合。控制台驗證器和即時引擎共用 完全相同的詞彙,所以一個能儲存的子句就是一個能執行的子句。| 操作符 | 比較 | 類型規則 |
|---|---|---|
eq | 精確相等。 | 型別化:string↔string、bool↔bool 或 number↔number。混合類型從不匹配。 |
contains | 子字串包含。 | 兩側都必須是字串;其他任何東西都是非匹配。空值匹配任何字串。 |
regex | 一個 RE2 模式(線性時間,無反向引用)對著一個字串。 | value 和解析的引數都必須是字串。無效模式停用該子句(從不匹配)。 |
in | 成員資格——value 等於清單的任一元素。 | value 必須是一個 JSON 陣列;每個元素以 eq 語意比較。 |
cidr_match | 解析的值是給定網路內的一個 IP。 | value 是一個 CIDR 字串(IPv4 或 IPv6,例如 10.0.0.0/8、fd00::/8);引數必須解析為一個 IP。 |
gt | 大於,數值。 | 兩側都必須強制為數字。一個看起來像數字的字串不被強制——它是類型不匹配(非匹配)。 |
lt | 小於,數值。 | 與 gt 相同的僅數值規則。 |
5. 一個演練範例
封鎖一次破壞性的資料庫匯出,但只在它瞄準一個生產 連線、經由私有網路主機時:db.* 把規則範圍化到資料庫工具系列;
三個子句 AND 在一起,所以裁決(比如說一個 deny)只
在語句是破壞性的且連線是兩個命名的
prod 目標之一且其主機落在私有 10.0.0.0/8 範圍內時觸發。一個
對著公開 IP 上的 dev 連線的 db.query 會毫髮無傷地越過這條規則。
6. Egress(主機 / CIDR)規則
上面的cidr_match 操作符匹配一個工具在其
引數中報告的 IP。那不同於一條 egress 表面規則,後者評估
一個工具實際觸及的外向目的地,用一個主機/CIDR 允許或
拒絕清單——主要的 SSRF 和資料外洩
防禦。Egress 規則使用相同的 CIDR 記法但位於 egress
表面;egress 清單格式參見防火牆規則。
沒有預設值為你出貨 CIDR egress 規則——
tight 自主等級拒絕
常見的擷取形狀工具名稱(http_fetch、fetch_url、
web_search、request),而非網路範圍。當你需要把 egress
釘到特定目的地時,撰寫你自己的主機/CIDR 拒絕規則。7. 快速參考
Glob 形狀
* 全部 · foo.* 前綴 · *.exec 後綴(+ 裸動詞)· *.X.*
中綴 · 其他任何 精確。區分大小寫。JSONPath
$.foo · $.foo.bar · $.foo[0] · $.arr[1].k。無萬用字元、
過濾器、切片或遞迴下降。字串操作符
eq(型別化)· contains(子字串)· regex(RE2)·
in(清單成員資格)。數值與網路操作符
gt / lt(僅數值,無字串強制)· cidr_match
(IPv4/IPv6 在範圍內)。相關
防火牆規則
完整的規則模型——表面、排序、淨化器、序列和
egress 清單。
危險的工具呼叫
這些子句防禦的威脅,以及如何把規則範圍化到它。
裁決詞彙表
一旦規則匹配,
allow、audit、deny、sanitize 等做什麼。為何被攔下?
將特定封鎖追溯到觸發的規則和子句。
