跳转到主要内容
你连接了一个 MCP 服务器,现在你想让网关在一次工具调用到达真实 服务器之前从中剥离一个泄露的密钥——并且阻止那个工具返回的任何 东西把一个凭据(或一个注入载荷)夹带回模型。那是两件不同的工作, 由两个不同的控制处理,而诚实的版本很重要:如果你以为一个旋钮覆盖 两者,你就会交付一个缺口。 本页是 OrcaRouter 上净化 mcp 输出的聚焦指南——防火墙 sanitize 判定实际脱敏什么、它脱敏什么,以及哪个控制治理一个工具返回的 内容。
sanitize 判定脱敏工具调用的参数,绝不是一个工具返回的结果。 它改写你的智能体发送进一个工具的内容。要治理一个工具发回的 内容,你使用模型回复上的一个 output 阶段 防护栏——参见 §3

1. “净化”在 mcp 面上意味着什么

当一个智能体通过 MCP 网关 调用一个工具时, 每一次 tools/call 都在派发前在 mcp 面上被评估。一条匹配的 规则 可以携带可编写的防火墙判定之一 ——allowauditdenysanitizepending_approvalcap_costsanitize 判定是做脱敏的那个:
  • 它在调用的参数(模型传入工具的 JSON)上运行一组密钥形状 检测器。
  • 每个匹配都被替换为一个像 [redacted:openai_key] 的规范化令牌, 而被改写后的参数才是转发到服务器的内容。
  • 工具仍然运行——sanitize 是一个非阻塞、放行的判定。智能体不 崩溃;它只是从不把原始密钥交给工具。
内置检测器覆盖众所周知的密钥形状(AWS 访问密钥、sk- 样式的 API 密钥、Bearer 令牌、US SSN、Luhn 校验有效的卡号、email),而一条 规则可以添加自定义正则,其匹配渲染为 [redacted:custom]
inbound 面上——一个请求声明的声明 tools[],在任何工具被 调用之前——没有调用时的参数可脱敏,因此那里的一个 sanitize 判定 fail closed 并升级为 deny。Sanitize 只在有一个活的参数载荷可改写的 地方才有意义:mcp 和 response 面。

2. 一条具体规则

假设你想让任何参数包含一个 OpenAI 样式密钥的工具调用都被以密钥 被清洗的方式转发,而不是被拦截。在 mcp 面上编写一条带 sanitize 判定的规则,配置为检测那种密钥形状。从控制台执行此操作 (Firewall → 策略 → 规则);写入需要 Developer+ 该规则,概念上:
字段
mcp
tool_name_glob*(或限定到一个服务器,例如 github.*
判定sanitize
Sanitize 预设要启用的密钥检测器
在调用时,一个像这样的参数载荷:
{ "note": "use key sk-AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH for the upstream" }
被以这样转发到服务器:
{ "note": "use key [redacted:openai_key] for the upstream" }
调用成功;密钥永不到达服务器。防火墙事件记录 sanitize 判定、面和 匹配的规则。
当一个工具合法地需要一个参数的大部分,但偶尔有一个密钥在自由 文本中搭便车时,取用 sanitize。当整个调用都危险时,改用 deny (或 pending_approval)——参见 允许列表 MCP 工具

3. 工具结果是不可信的——在模型回复上治理它们

这里是大多数”净化输出”的设置弄错的部分。sanitize 判定只触及 参数。一个工具的结果——一个 MCP 服务器交回的文本或 JSON—— 永不被一个防火墙判定改写。 OrcaRouter 把工具结果内容当作对模型的不可信输入。一个被攻破 或被投毒的 MCP 服务器可以返回一个密钥、一条 PII 记录,或一个伪装 成数据的提示注入载荷。针对那个内容的控制是 output 阶段上的一个 防护栏——模型的回复,在模型已经纳入工具 结果之后评估。
附加一个带 Secrets & API-Key Blocker 预设(类别 secrets)的 防护栏。它拦截 AWS / OpenAI / GitHub 样式的凭据;把它与 Private Keys & Cloud Tokens 配对以处理 PEM 密钥、Slack/Stripe 令牌、Google 密钥和 JWT。一次 output 阶段的拦截返回 guardrail_blocked(HTTP 400)并退还该请求的配额。
PII Shield 预设屏蔽带类型的实体——[EMAIL][SSN][CREDIT_CARD]、……——把匹配的值渲染为标签。Input 阶段的屏蔽在 每个请求上都生效(无论流式与否):它在模型看到之前屏蔽请求。 Output 阶段的屏蔽只在非流式响应上改写模型回复;流式回复 的带内改写在路线图上,因此一条屏蔽规则尚未脱敏一个流式回复。
一个被投毒的结果可以携带 “ignore previous instructions” 样式的 文本。Prompt-Injection Basics 安全预设(关键词/正则)加一条为 注入意图打分的 llm_judge 规则是这里的控制。参见 MCP 工具投毒提示注入
Output 执行与流式。 Output 阶段的拦截在流式和非流式回复上 都被执行——在一个流上,一次拦截会在它匹配时切断该流并发出一个 通用拦截通知。Output 阶段的屏蔽只应用于非流式回复;流式 回复的带内改写在路线图上,因此一条屏蔽规则尚未脱敏一个流式回复。

4. 每个控制住在哪里

两个面的一张紧凑地图,让你把正确的旋钮接到正确的风险:
你想治理……控制在哪里
一次工具调用参数中的密钥防火墙 sanitize 判定(mcp 面)防火墙规则
一个工具结果中的密钥 / PII / 注入output 阶段上的防护栏防护栏
不要试图让 sanitize 覆盖工具结果——它看不到它们。也不要以为一个 input 阶段的防护栏会抓住一个工具在对话途中返回的内容;工具结果 内容在模型的回复上治理,那是 output 阶段。

5. 附加与观察

两个控制都是工作区限定的、有命名的、有序的,并且都以相同的两种 方式附加:
  • 按密钥 —— 在智能体使用的 密钥 上 设置 firewall_policy_id(用于 sanitize 规则)和 guardrail_id (用于 output 策略)。
  • 工作区默认 —— 把一个策略 / 防护栏标记为工作区默认,因此每个 密钥都继承它。
控制台用你的会话/访问令牌配置这一切(管理路由用 UserAuth, 不是中继密钥)。防火墙写入需要 Developer+;防护栏写入需要 Developer+ 上线之后,sanitize 匹配作为防火墙事件出现(判定、面、匹配的规则), 而防护栏匹配出现在防护栏匹配信息流中。这两者有不同的读取门: firewall events 信息流需要 Developer+,而 guardrail match 信息流可由任何工作区成员读取。默认情况下,一个匹配记录它的类型、 动作和阶段,但记录原始匹配内容;只有在你需要子串用于分诊时 才打开 Log raw content

6. 下一步去哪里

允许列表 MCP 工具

默认拒绝一个服务器,只放行你已审查过的工具。

防火墙规则

完整的规则 DSL——判定、globs、args-match、sanitize 配置。

防护栏

内容策略、预设、PII 实体和 output 阶段执行。

MCP 工具投毒

一开始就让工具结果不可信的威胁。
对这两层之间的划分还不熟悉?读 防护栏 vs. 防火墙,然后读 数据外泄 了解 sanitize 和 output 防护栏一起关闭的泄漏路径。