跳轉到主要內容
一個已註冊的 MCP 伺服器會公告它想要的任何工具——而一個代理 會樂於呼叫其中任何一個。安全的姿態是相反的:決定你 實際需要的那一份短清單、恰好允許那些,並拒絕其餘的。 那就是一個允許清單,而在 OrcaRouter 上你用在 mcp 表面上 評估的 tool_name_glob 規則來建構它。 每一次跨越 MCP 閘道tools/call 在它抵達真正的伺服器之前都會透過你的防火牆政策 執行。所以允許清單不是建議性的——一次對 你未允許的工具的呼叫永不派發。
政策編輯是一個主控台動作。/api/workspace/firewall/* 路由以你的工作階段/存取權杖驗證,而非一個轉送 sk-orca-… 金鑰。撰寫規則需要 Developer+ 角色;任何 工作區成員(下至 Viewer)皆可讀取政策與 探索到的工具動態。

1. 為何要為安全 mcp 工具設一個預設拒絕的允許清單

一個拒絕清單——「封鎖危險的工具」——在一個伺服器加上 一個新工具、重新命名一個,或你連接第二個伺服器的那一刻就失效。危險 工具的集合是無止境的;你打算使用的那一組是小而 已知的。一個允許清單反轉了預設,所以未知被拒絕,而非 准入:
  • 新工具預設被拒絕。 一個在你連接它之後長出一個 delete_repo 工具的伺服器,在你把它加入允許清單之前無法被 呼叫。
  • 範圍是每伺服器的。 <server>.<tool> 命名空間讓你能允許 github.create_issue,同時拒絕 github.* 下的其他一切。
  • 一個咽喉要道。 同一個政策治理隨附伺服器與 閘道後方的每個 BYO 伺服器,所以有一個地方能讀取 允許清單。
允許清單與觀察模式自然搭配: 先把它打開,讓真實流量填入 探索到的工具動態,然後把你看到的 工具提升為明確的 allow 規則,並把預設翻轉為 deny。

2. 兩個部分

一個允許清單是一個 default_verdict 加上一組有序的規則。

default_verdict: deny

政策對任何沒有規則匹配的 tools/call 的後備。把它設為 deny,則任何你未明確允許的東西都會被封鎖。(它也 接受 allowaudit——audit 是預設。)

allow 規則

每個工具(或每個 glob)一條規則。每一條攜帶一個 tool_name_glob 與一個 allow 裁決。一個匹配該 glob 的 tools/call 解析為 allow 並派發;其他一切落到 deny 預設。
該 glob 會對照命名空間化的工具名稱匹配——github.create_issueshell.exec* 匹配任何工具(謹慎使用;一條帶有 * 的 allow 規則會抵消整個允許清單)。一個前導的 <server>. 把該 glob 限定 到一個伺服器。

3. 一個具體範例

你連接了一個 github 伺服器,而你只想讓代理讀取開啟 issue——永不刪除或管理任何東西。在主控台中,開啟 Firewall → Policies、把政策的預設裁決設為 deny,並 加上兩條 allow 規則:
順序tool_name_glob裁決
1github.create_issueallow
2github.list_issuesallow
那就是整個允許清單。在預設為 deny 的情況下:
  • github.create_issue → 匹配規則 1 → allow,派發。
  • github.delete_repo → 沒有匹配 → 預設 deny
一個被拒絕的 MCP 呼叫會作為一個工具錯誤firewall deny: …)回到模型——與任何失敗工具回傳的形狀相同——所以 代理能適應而非崩潰。(在 inbound 表面上,一個 deny 反而是 一個 HTTP 400,帶有錯誤碼 firewall_blocked。)
規則是有序的並由上而下評估。不要把一條廣泛的 tool_name_glob: github.* allow 放在你的特定 deny 規則之上—— 第一個匹配獲勝,而那個萬用字元會准入你打算 排除的那些工具。有疑慮時,把允許清單保持狹窄,並倚靠 deny 預設而非萬用字元。

4. 用引數收緊

一個在允許清單上的工具名稱仍可能被以壞引數呼叫。 透過為該規則加上一個 args_match 子句(JSONPath + 一個 像 eqcontainsregexincidr_match 的運算子)來進一步收窄,或 透過在 allow 之上為一個特定引數形狀疊加一條 deny 規則—— 例如,允許 github.create_issue 但在目標 repo 不在一個核准清單上時 deny 它。關於完整的運算子 集合,請見防火牆規則參考
sanitize 會在轉送前隱去一個工具呼叫的引數——它永不 觸及一個工具回傳的內容。關於修剪回傳的內容,那是一個 不同的控制;請見淨化工具輸出

5. 安全地推出

在正式環境中翻轉一個全伺服器的預設拒絕,你冒著弄壞一個 悄悄依賴一個你忘記的工具的代理的風險。兩個設定能降低風險:
一個每政策的旗標,會把強制執行裁決降級為 audit。你的 deny 預設與 deny 規則會記錄 [shadow] would deny … 而非 封鎖,所以你可以在允許清單咬人之前對照真實流量 驗證它。在 強制執行模式中閱讀更多。
一個工作區設定,會把每一次未涵蓋的呼叫記錄為 探索到的工具動態中的一個缺口。在你 撰寫允許清單之前執行它,以準確了解你的代理呼叫哪些工具,然後 把每一個提升為一條明確的 allow 規則。
一旦 shadow 日誌乾淨——沒有合法的呼叫會被拒絕—— 清除 shadow_mode,允許清單就強制執行。

6. 驗證它運作

在強制執行後,確認被拒絕的工具確實被拒絕:
  • Dry-run 一次對照政策的 tools/call(Developer+)以看見 裁決以及哪一條規則——或預設——產生它,而不送出 真實流量。傳入一個工具名稱、表面與範例引數;引擎會 評估它們並回傳裁決軌跡而不記錄一個事件。
  • 觀看事件。 每一次被封鎖的呼叫會記錄一個 Developer+ 能在 主控台中讀取的防火牆事件; 稽核事件頁面涵蓋該動態及其 欄位。
寧願不手動撰寫每一條規則?tight 自主預設會為你 寫一個預設拒絕的政策(加上對破壞性 shell 工具與 fetch 形狀工具名稱的 deny 規則),然後你加回你需要的特定工具。請見 強制執行模式了解每個 自主等級安裝什麼。

相關

連接一個 MCP 伺服器

在你能允許清單它的工具之前先註冊一個伺服器。

防火牆:MCP 伺服器

閘道的執行期行為與每次呼叫的裁決。

防火牆規則參考

完整的規則 DSL——globs、args_match、egress、sanitize。

危險的工具呼叫

一個允許清單被建來遏制的威脅。

Egress 限制

治理一個被允許的工具可以觸及何處。

防護欄 vs. 防火牆

何時該用內容政策 vs. 工具政策。