shell.exec、編輯檔案、擷取 URL,並
載入社群技能——其中任何一項都可能 rm -rf 一個磁碟區、讀取一個
.env,或外洩到一個攻擊者主機。本配方用防火牆
把那個介面鎖死:拒絕破壞性 shell、
驗證你確實允許的呼叫的引數、圍隔 egress,並
為真正有風險的操作保留一個人類。其中沒有任何一項觸及你
代理的程式碼——政策存在於閘道中,並在下次呼叫時強制執行。
下方的一切都在主控台中設定(Firewall → Posture /
Policies)。那些管理路由使用你的主控台工作階段,而非一把中繼
金鑰。只有你代理發出的
/v1/* 呼叫攜帶一把 sk-orca-… 金鑰。
政策編輯需要 Developer 角色。1. 從觀察開始,而非封鎖——安全編碼代理基準
別盲目撰寫規則。給代理它的sk-orca-… 金鑰,然後開啟
Firewall → Posture 並套用 balanced
自主等級。在一次交易中,這會稽核每次
工具呼叫、標記 PII,並拒絕
破壞性 shell——所以最糟的動作在你從真實流量
學習其餘代理行為時就已被圍隔。
讓它運行,然後讀取 Firewall → Discovered tools:工作區
看過的每個工具,標記為 covered(有規則套用)或 gap
(沒有任何規則套用)。那份清單就是你的允許清單草稿。當動態
看起來正確時,移動到 tight(預設拒絕)或撰寫下方的目標政策。
2. 拒絕破壞性 shell——不可協商的底線
對一個編碼代理而言,單一最重要的規則是不可有破壞性 shell。balanced 與 tight 自主等級已經把它作為
Block destructive shell 預設集出貨,它會具現化真實、
可編輯的 deny 規則,涵蓋工作區直接的工具名稱
(shell.*、bash、cmd.*、powershell.*、exec.*)以及
一個已註冊伺服器曝露的 MCP 命名空間形式(*.shell.*、
*.cmd.*、…)。
如果你寧願把它的範圍限定得比「拒絕所有 shell」更緊,撰寫一條
只拒絕破壞性命令並稽核其餘的規則。一條規則
匹配於一個工具名稱 glob 加上一個可選的引數判定式
(對照呼叫引數的 JSONPath):
拒絕 rm -rf 但允許其他 shell 呼叫
拒絕 rm -rf 但允許其他 shell 呼叫
在 Firewall → Policies 中,在你的預設值之上加入一條規則:
- Tool glob:
shell.exec - Args match(JSONPath 子句):
- Verdict:
deny
eq、contains、regex、
in、cidr_match、gt、lt。一個其 $.command 匹配
regex 的呼叫會被封鎖;其餘一切落到下一條規則。封鎖的樣子
封鎖的樣子
在 inbound 介面上被拒絕的呼叫回傳 HTTP 400,帶有
錯誤代碼
firewall_blocked 以及一條指明工具與
原因的訊息。一個透過 MCP 閘道派發的呼叫會回來作為一個
工具錯誤(firewall deny: …),讓模型可以反應而不是
崩潰。Inbound 封鎖在上游模型呼叫之前觸發,所以它們
不消耗模型權杖。3. 在你保留的工具上驗證引數
允許一個工具不等於允許它的每個引數。同一個 JSONPath 判定式既能限定一個 deny 的範圍,也能讓你約束一個 被允許呼叫的形狀——這樣db.query 就無法攜帶一個 DROP,而 file.write 也無法
逃出一個目錄。
封鎖一個 SQL DROP
Glob
db.query,子句
{"path":"$.sql","op":"regex","value":"(?i)\\bdrop\\b"},裁決
deny。遮蔽引數中的一個密鑰
裁決
sanitize 會在呼叫被轉送之前,從工具呼叫的
引數遮蔽匹配到的子字串。它絕不觸及一個工具回傳的內容;
在 inbound 介面上(那裡尚無呼叫時引數)它會
升級為一個封鎖。4. 控制 egress——圍隔代理能觸及之處
一個能擷取 URL 的編碼代理可能被引導進 SSRF(觸及 雲端中繼資料或一個內部10.x 主機)或被用來外洩。
tight 自主等級出貨一個 SSRF 預設集,它拒絕擷取形狀的
工具名稱(http_fetch、web_search、fetch_url、request,以及
它們的 <server>.* 形式)。
對於目的地層級的控制,撰寫一條 egress 規則。Egress 規則
以 host 或 CIDR 配上 allow / deny 條目來限定範圍,在
egress 介面上評估:
沒有預設集出貨基於 CIDR 的 egress 規則——SSRF 預設集匹配
擷取形狀的工具名稱。上方的 host/CIDR 拒絕清單是你自己
撰寫的一個。關於完整模式,參見 停止外洩。
5. 為一個人類保留有風險的操作(HITL)
有些操作既不該被自動允許也不該被自動拒絕——一次部署、一次git push、一次破壞性遷移。對於那些,使用
pending_approval 裁決。呼叫會被保留,代理會得到一個帶審批 id 的「保留中」
回應,而一位審查者在頻道外解決它:
- 撰寫一條規則(例如 glob
deploy.*,裁決pending_approval)。 - 被保留的呼叫回傳 HTTP 400
firewall_approval_pending,帶一個 審批 id。 - 一位審查者從主控台(Developer+)或透過一個 HMAC 簽署的 webhook 回呼批准它。
- 代理輪詢該審批,然後帶著一個一次性的
X-OrcaRouter-Firewall-Approval標頭重新提交原始呼叫——閘道便 讓它通過那一次。
6. 治理它載入的技能與 MCP 伺服器
編碼代理會在執行期拉入能力——社群技能、BYO MCP 伺服器。防火牆在閘道處治理兩者:- 技能會被掃描進一個風險帶並帶一個強制執行模式
(
allow/quarantine/block)。一個自動偵測到的技能會被 隔離——保留待審批——直到一位審查者放行它。參見 技能。 - 你註冊的 MCP 伺服器會把每個
tools/call透過閘道 派發,閘道會在派發前於mcp介面上評估每一個。 憑證以加密儲存;一次健康探測回報ok/degraded/down。參見 MCP 伺服器與 加固一個 MCP 代理。
7. 驗證與觀察
在你依賴一個政策之前,乾跑它。Test 分頁會對照 目前政策評估一個樣本工具呼叫,並顯示裁決、 匹配到的規則與原因——沒有東西被派發,沒有東西被持久化。 一旦上線,Firewall → Events / Runs 就是每次評估的記錄, 可按裁決、介面、工具與 run 篩選,而 anomaly feed 會對照工作區習得的基準標記速率/成本飆升、retry_loop 以及從未見過的工具路徑。
重點回顧
防火牆參考
完整的政策平面——介面、裁決、解析、自主。
防火牆規則
匹配語言:glob、引數子句、egress、序列。
危險的工具呼叫
本配方所防禦的威脅。
過度代理權
為何權限過度的代理是核心的代理風險。
自主代理配方
端對端鎖死一個完全自主的代理迴圈。
停止外洩
深入的 egress 與致命三要素模式。
