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——一個封閉集合之一:eq、contains、regex、in、cidr_match、gt、lt。value——要對照比較的字面值(一個字串、數字、布林值,或 ——對in而言——一個 JSON 陣列)。
tool_name_glob 做 AND:只在工具名稱匹配且每個
子句都成立時規則才觸發。完全省略 args_match_json(或將它留作一個
空的 "{}"),規則就僅靠 glob 匹配。
子句失敗關閉——影響規則,而非請求。 如果一個 path 不解析、引數
格式錯誤,或一個值是錯誤的類型,該子句評估為假,而規則就是不
觸發——呼叫落到下一條規則或預設裁決。一個壞掉的子句絕不自動
拒絕。將你的硬後盾撰寫為一個普通的 glob
deny,而不是一個你倚賴
以某種方式失敗的子句。2. 食譜:封鎖一個破壞性指令
典型情況。一般允許shell.exec,只在指令看起來具破壞性時拒絕它。
一個在 $.command 上的 regex 子句就辦到:
$.command(或一個
缺失的)絕不匹配,所以一個格式錯誤的呼叫會落空而不是被錯誤封鎖。
3. 食譜:對一個指名環境拒絕一個工具
讓db.query 執行,但只對著安全連線——在目標是 prod 或一個
replica 時拒絕它。in 運算子將解析後的值對照一個 JSON 陣列的
任何元素匹配:
in 值必須是一個 JSON 陣列——當你儲存規則時一個非陣列會被拒絕。
元素以純量相等比較,所以數字與字串各自匹配自己的類型。
4. 食譜:拒絕一個私有 IP 或 metadata 目的地
當一個工具把一個目標 IP 作為引數時,cidr_match 測試它是否落入一個
CIDR——「一個代理擷取 10.x 或 cloud metadata 位址」的那種 SSRF
形狀:
5. 食譜:為一個數值引數設上限
gt 與 lt 比較數字。用它們來拒絕一個荒謬的批次大小、一個超大的
limit,或任何失控的計數——這裡,拒絕一個目標超過 100 列的批次
刪除:
"500" 是一個類型
不符且不匹配,所以規則不會在一個字串型的引數上觸發。把該引數
保持為數值,或在工具看見它之前正規化它。
6. 食譜:組合子句(AND)
一條規則中的所有子句一起做 AND,所以你能將一個裁決收窄到一個 非常特定的呼叫——例如,只在shell.exec 是一個破壞性指令且它
指向一個 prod 主機時才拒絕它:
args_match_json 內沒有 OR——在不同優先
順序撰寫兩條規則(或兩個 glob)。引擎按優先順序走訪規則,而第一個
匹配者勝出,所以把窄的規則放在前面。參見
規則優先順序。
7. 為匹配到的形狀挑選裁決
一個子句決定哪些呼叫匹配;規則的verdict 決定發生什麼。deny 是
食譜的預設值,但同一個子句可以攜帶一個較柔和的裁決:
sanitize — 遮罩一個引數中的密鑰
sanitize — 遮罩一個引數中的密鑰
當匹配到的引數攜帶一個密鑰或 PII 而非一個危險指令時,
sanitize
會從工具引數中遮罩匹配到的子字串並轉送清理後的呼叫。它只
遮罩引數——絕不遮罩工具回傳的內容。參見
淨化回應。pending_approval — 為人類保留匹配到的呼叫
pending_approval — 為人類保留匹配到的呼叫
將正好那個高風險形狀保留待審查,而不是直接封鎖它:一位審查者
頻道外批准或拒絕,而代理重新提交被批准的呼叫一次。參見
審批。
audit — 暫時只是看見它
audit — 暫時只是看見它
將裁決設為
audit 以記錄匹配到的呼叫而不封鎖,同時你調校子句。
與影子模式搭配,以在一個
deny 改變任何東西之前對照即時流量衡量它。8. 在你依賴它之前測試子句
主控台 Test 分頁會對照一個樣本工具呼叫乾跑一個政策,並傳回 裁決、匹配到的規則與原因——不派發、不持久化任何東西。貼上一個 真實的引數物件,並確認子句在你意指的呼叫上觸發、且只在那些 上面,因為一個無法解析一個值的子句會靜默地不觸發。參見 測試規則。子句在儲存時被嚴格驗證——未知運算子、壞 path、一個非陣列的
in 值、一個無法編譯的 regex,以及無效的 CIDR 全都會被拒絕,所以
一個格式錯誤的子句一開始就無法被持久化。9. 誰能撰寫引數子句
所有這些都在主控台中於你的工作階段下執行 (/api/workspace/firewall/*):
| 動作 | 角色 |
|---|---|
| 讀取政策、預設集、discovered tools | Member |
| 建立/編輯/刪除規則 | Developer+ |
| Test 沙盒(乾跑一個政策) | Developer+ |
| 讀取事件與執行彙整 | Developer+ |
相關
驗證引數
完整的引數匹配使用情境。
封鎖工具
依名稱拒絕一整個工具——不需要子句。
Egress 控制
治理外送 host / IP / CIDR 目的地。
規則綱要
一條規則能攜帶的每個欄位。
規則優先順序
第一個匹配者勝出——窄的排在寬的之前。
危險的工具呼叫
這些食譜處理的威脅。
