跳轉到主要內容
指名一個工具並拒絕它很直接:它為每一次呼叫扼殺該工具。多數時候 該工具沒問題,而一種呼叫形狀才是問題——shell.exec 沒問題,直到 指令是 rm -rf;db.query 沒問題,直到它擊中 prod。那個區別就是 一個引數子句所表達的:一個 jsonpath 工具引數 判定式,匹配一個代理傳入的,所以裁決只在那個危險呼叫上觸發, 而讓其餘的不受打擾。 本頁是一份食譜——為最常出現的情況準備的少數幾個複製貼上 args_match_json 食譜。關於完整的子句文法、運算子表與失敗關閉 語意,參見驗證引數規則綱要參考。

1. 一個 jsonpath 工具引數子句如何運作

一條規則的 args_match_json 是一個 JSON 編碼的字串,攜帶一組 子句,全部一起做 AND。解碼後的值是一個物件, {"clauses": [ … ]},其中每個子句是一個 { path, op, value } 三元組:
  • path——工具引數物件上的一個小型 JSONPath 子集:$.command$.foo.bar$.items[0],或 $ 代表整個物件。沒有萬用字元、 篩選器、切片或遞迴下降。
  • op——一個封閉集合之一:eqcontainsregexincidr_matchgtlt
  • value——要對照比較的字面值(一個字串、數字、布林值,或 ——對 in 而言——一個 JSON 陣列)。
一個子句與規則的 tool_name_glob 做 AND:只在工具名稱匹配每個 子句都成立時規則才觸發。完全省略 args_match_json(或將它留作一個 空的 "{}"),規則就僅靠 glob 匹配。
子句失敗關閉——影響規則,而非請求。 如果一個 path 不解析、引數 格式錯誤,或一個值是錯誤的類型,該子句評估為,而規則就是不 觸發——呼叫落到下一條規則或預設裁決。一個壞掉的子句絕不自動 拒絕。將你的硬後盾撰寫為一個普通的 glob deny,而不是一個你倚賴 以某種方式失敗的子句。

2. 食譜:封鎖一個破壞性指令

典型情況。一般允許 shell.exec,只在指令看起來具破壞性時拒絕它。 一個在 $.command 上的 regex 子句就辦到:
{
  "label": "block destructive shell commands",
  "tool_name_glob": "*.exec",
  "verdict": "deny",
  "args_match_json": "{\"clauses\":[{\"path\":\"$.command\",\"op\":\"regex\",\"value\":\"rm -rf|mkfs|dd if=\"}]}"
}
Regex 是 Go RE2——線性時間、無反向參照、無災難性回溯——所以它們 在每一次工具呼叫上執行都是安全的。一個非字串的 $.command(或一個 缺失的)絕不匹配,所以一個格式錯誤的呼叫會落空而不是被錯誤封鎖。
當你匹配一個固定子字串時,偏好 contains 而非 regex——它讀起來 更簡單,且不會被一個未跳脫的元字元絆倒。只在你真正需要交替或 錨點時才去拿 regex

3. 食譜:對一個指名環境拒絕一個工具

db.query 執行,但只對著安全連線——在目標是 prod 或一個 replica 時拒絕它。in 運算子將解析後的值對照一個 JSON 陣列的 任何元素匹配:
{
  "label": "no agent queries against prod",
  "tool_name_glob": "db.query",
  "verdict": "deny",
  "args_match_json": "{\"clauses\":[{\"path\":\"$.connection\",\"op\":\"in\",\"value\":[\"prod\",\"replica\"]}]}"
}
in必須是一個 JSON 陣列——當你儲存規則時一個非陣列會被拒絕。 元素以純量相等比較,所以數字與字串各自匹配自己的類型。

4. 食譜:拒絕一個私有 IP 或 metadata 目的地

當一個工具把一個目標 IP 作為引數時,cidr_match 測試它是否落入一個 CIDR——「一個代理擷取 10.x 或 cloud metadata 位址」的那種 SSRF 形狀:
{
  "label": "deny tool calls aimed at RFC-1918",
  "tool_name_glob": "*",
  "verdict": "deny",
  "args_match_json": "{\"clauses\":[{\"path\":\"$.target_ip\",\"op\":\"cidr_match\",\"value\":\"10.0.0.0/8\"}]}"
}
引數值必須解析為一個落入該 CIDR 之中的 IP 字面值;一個主機名稱或 一個非 IP 字串絕不匹配。
cidr_match 只審查一個已經在工具引數中的值。要治理一個工具在 網路層實際觸及的目的地——host/CIDR 允許與拒絕清單——請改用 egress 介面上一個專用的egress 規則。 兩者是互補的:進來路上的引數審查、出去路上的 egress 控制。

5. 食譜:為一個數值引數設上限

gtlt 比較數字。用它們來拒絕一個荒謬的批次大小、一個超大的 limit,或任何失控的計數——這裡,拒絕一個目標超過 100 列的批次 刪除:
{
  "label": "block large bulk deletes",
  "tool_name_glob": "*.bulk_delete",
  "verdict": "deny",
  "args_match_json": "{\"clauses\":[{\"path\":\"$.count\",\"op\":\"gt\",\"value\":100}]}"
}
兩側都必須是數字——一個看起來像數字的字串"500" 是一個類型 不符且匹配,所以規則不會在一個字串型的引數上觸發。把該引數 保持為數值,或在工具看見它之前正規化它。

6. 食譜:組合子句(AND)

一條規則中的所有子句一起做 AND,所以你能將一個裁決收窄到一個 非常特定的呼叫——例如,shell.exec 是一個破壞性指令它 指向一個 prod 主機時才拒絕它:
{
  "label": "destructive shell on a prod host",
  "tool_name_glob": "*.exec",
  "verdict": "deny",
  "args_match_json": "{\"clauses\":[{\"path\":\"$.command\",\"op\":\"regex\",\"value\":\"rm -rf|drop table\"},{\"path\":\"$.host\",\"op\":\"in\",\"value\":[\"db-prod-1\",\"db-prod-2\"]}]}"
}
改為需要一個 OR?單一 args_match_json 內沒有 OR——在不同優先 順序撰寫兩條規則(或兩個 glob)。引擎按優先順序走訪規則,而第一個 匹配者勝出,所以把窄的規則放在前面。參見 規則優先順序

7. 為匹配到的形狀挑選裁決

一個子句決定哪些呼叫匹配;規則的 verdict 決定發生什麼。deny 是 食譜的預設值,但同一個子句可以攜帶一個較柔和的裁決:
當匹配到的引數攜帶一個密鑰或 PII 而非一個危險指令時,sanitize 會從工具引數中遮罩匹配到的子字串並轉送清理後的呼叫。它只 遮罩引數——絕不遮罩工具回傳的內容。參見 淨化回應
將正好那個高風險形狀保留待審查,而不是直接封鎖它:一位審查者 頻道外批准或拒絕,而代理重新提交被批准的呼叫一次。參見 審批
將裁決設為 audit 以記錄匹配到的呼叫而不封鎖,同時你調校子句。 與影子模式搭配,以在一個 deny 改變任何東西之前對照即時流量衡量它。

8. 在你依賴它之前測試子句

主控台 Test 分頁會對照一個樣本工具呼叫乾跑一個政策,並傳回 裁決、匹配到的規則與原因——不派發、不持久化任何東西。貼上一個 真實的引數物件,並確認子句在你意指的呼叫上觸發、且只在那些 上面,因為一個無法解析一個值的子句會靜默地不觸發。參見 測試規則
子句在儲存時被嚴格驗證——未知運算子、壞 path、一個非陣列的 in 值、一個無法編譯的 regex,以及無效的 CIDR 全都會被拒絕,所以 一個格式錯誤的子句一開始就無法被持久化。

9. 誰能撰寫引數子句

所有這些都在主控台中於你的工作階段下執行 (/api/workspace/firewall/*):
動作角色
讀取政策、預設集、discovered toolsMember
建立/編輯/刪除規則Developer+
Test 沙盒(乾跑一個政策)Developer+
讀取事件與執行彙整Developer+
撰寫或變更一個引數子句是一項 Developer+ 寫入。Test 沙盒也是 Developer+——它能對照一個草稿政策預覽,而它的裁決追蹤會暴露 政策名稱與規則標籤,所以它坐落在那條線的寫入側,而非讀取側。

相關

驗證引數

完整的引數匹配使用情境。

封鎖工具

依名稱拒絕一整個工具——不需要子句。

Egress 控制

治理外送 host / IP / CIDR 目的地。

規則綱要

一條規則能攜帶的每個欄位。

規則優先順序

第一個匹配者勝出——窄的排在寬的之前。

危險的工具呼叫

這些食譜處理的威脅。