跳轉到主要內容
一個編碼代理是你工作區中槓桿最高的東西,也是 最危險的。它運行 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(預設拒絕)或撰寫下方的目標政策。
balanced 是建議的起始姿態;permissive 什麼都不 封鎖但仍然記錄一切;tight 是預設拒絕加上 secrets 與 SSRF 預設集。參見 基準以了解每一個確切 具現化了什麼。

2. 拒絕破壞性 shell——不可協商的底線

對一個編碼代理而言,單一最重要的規則是不可有破壞性 shellbalancedtight 自主等級已經把它作為 Block destructive shell 預設集出貨,它會具現化真實、 可編輯的 deny 規則,涵蓋工作區直接的工具名稱 (shell.*bashcmd.*powershell.*exec.*)以及 一個已註冊伺服器曝露的 MCP 命名空間形式(*.shell.**.cmd.*、…)。 如果你寧願把它的範圍限定得比「拒絕所有 shell」更緊,撰寫一條 只拒絕破壞性命令並稽核其餘的規則。一條規則 匹配於一個工具名稱 glob 加上一個可選的引數判定式 (對照呼叫引數的 JSONPath):
Firewall → Policies 中,在你的預設值之上加入一條規則:
  • Tool glob: shell.exec
  • Args match(JSONPath 子句):
{
  "clauses": [
    { "path": "$.command", "op": "regex", "value": "(?i)\\brm\\s+-[a-z]*[rf]" }
  ]
}
  • Verdict: deny
引數運算子是一個封閉集——eqcontainsregexincidr_matchgtlt。一個其 $.command 匹配 regex 的呼叫會被封鎖;其餘一切落到下一條規則。
inbound 介面上被拒絕的呼叫回傳 HTTP 400,帶有 錯誤代碼 firewall_blocked 以及一條指明工具與 原因的訊息。一個透過 MCP 閘道派發的呼叫會回來作為一個 工具錯誤firewall deny: …),讓模型可以反應而不是 崩潰。Inbound 封鎖在上游模型呼叫之前觸發,所以它們 不消耗模型權杖。
關於完整的匹配 語言(工具 glob、引數子句、序列、成本上限),參見 防火牆規則

3. 在你保留的工具上驗證引數

允許一個工具不等於允許它的每個引數。同一個 JSONPath 判定式既能限定一個 deny 的範圍,也能讓你約束一個 被允許呼叫的形狀——這樣 db.query 就無法攜帶一個 DROP,而 file.write 也無法 逃出一個目錄。

封鎖一個 SQL DROP

Glob db.query,子句 {"path":"$.sql","op":"regex","value":"(?i)\\bdrop\\b"},裁決 deny

遮蔽引數中的一個密鑰

裁決 sanitize 會在呼叫被轉送之前,從工具呼叫的 引數遮蔽匹配到的子字串。它絕不觸及一個工具回傳的內容; 在 inbound 介面上(那裡尚無呼叫時引數)它會 升級為一個封鎖。
防火牆會淨化工具呼叫的引數,而非工具的結果。要從一開始就 阻止一個密鑰進入請求,把 Secrets Blocker 防護欄附加到金鑰——那 會在模型看見之前篩查提示文字本身。這兩個平面 組合運作:防護欄篩查文字,防火牆治理動作。

4. 控制 egress——圍隔代理能觸及之處

一個能擷取 URL 的編碼代理可能被引導進 SSRF(觸及 雲端中繼資料或一個內部 10.x 主機)或被用來外洩。 tight 自主等級出貨一個 SSRF 預設集,它拒絕擷取形狀的 工具名稱http_fetchweb_searchfetch_urlrequest,以及 它們的 <server>.* 形式)。 對於目的地層級的控制,撰寫一條 egress 規則。Egress 規則 以 host 或 CIDR 配上 allow / deny 條目來限定範圍,在 egress 介面上評估:
{ "deny": ["169.254.169.254", "10.0.0.0/8", "*.internal"] }
那會在一個工具回報的、落在私有範圍、雲端中繼資料 IP 或一個內部主機名上的任何外送目的地上觸發——讓 公開目的地通過,同時圍隔危險的那些。
沒有預設集出貨基於 CIDR 的 egress 規則——SSRF 預設集匹配 擷取形狀的工具名稱。上方的 host/CIDR 拒絕清單是你自己 撰寫的一個。關於完整模式,參見 停止外洩

5. 為一個人類保留有風險的操作(HITL)

有些操作既不該被自動允許不該被自動拒絕——一次部署、一次 git push、一次破壞性遷移。對於那些,使用 pending_approval 裁決。呼叫會被保留,代理會得到一個帶審批 id 的「保留中」 回應,而一位審查者在頻道外解決它:
  1. 撰寫一條規則(例如 glob deploy.*,裁決 pending_approval)。
  2. 被保留的呼叫回傳 HTTP 400 firewall_approval_pending,帶一個 審批 id。
  3. 一位審查者從主控台(Developer+)或透過一個 HMAC 簽署的 webhook 回呼批准它。
  4. 代理輪詢該審批,然後帶著一個一次性的 X-OrcaRouter-Firewall-Approval 標頭重新提交原始呼叫——閘道便 讓它通過那一次。
先在影子模式中上線任何新政策。政策會 完全像在生產環境中那樣評估並記錄,但每個強制執行的裁決都會 被降級為 audit,帶一個 [shadow] would … 原因——這樣你就能 在它可能弄壞一次建構之前,證明它在你預期之處觸發。

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 與致命三要素模式。