先把 MCP 的四个角色分开

  • MCP Client:代表用户发现和调用工具。
  • MCP Server:暴露 tools、resources 或 prompts,也是受保护资源服务器。
  • Authorization Server:认证用户、征得授权并签发 token。
  • Downstream API:例如 GitHub、Notion、数据库或支付服务。

最危险的错误是把这些角色混在一起:拿“签发给 GitHub 的 token”当作“MCP Server 自己的登录凭证”,或者把 MCP 客户端 token 继续传给下游。当前 MCP 授权草案要求基于 OAuth 2.1,并通过 RFC 9728 Protected Resource Metadata 发现授权服务器。详见 MCP Authorization

一条合格的 HTTP 授权链路

  1. 客户端访问 MCP endpoint,未授权时收到 401 和资源元数据提示。
  2. 客户端读取 Protected Resource Metadata,发现对应授权服务器。
  3. 公共客户端发起 Authorization Code + PKCE,使用 S256
  4. 请求中携带 resource,把 token 绑定到目标 MCP Server。
  5. MCP Server 验证签名、issuer、audience、scope、过期时间和撤销状态。
  6. 调用下游 API 时使用服务端单独获得的下游 token,不复用客户端 token。

为什么 token passthrough 必须禁止

如果服务端接受任何 Bearer token 并直接转发,就会绕过 audience、限流、审计和授权边界,形成 confused deputy(混淆代理)问题。正确设计是两段独立信任:

MCP Client --[token: audience=mcp.example]--> MCP Server
MCP Server --[separate token: audience=api.vendor]--> Downstream API

MCP 官方安全文档明确把 token passthrough 列为禁止的反模式,并要求服务端验证 token 是否确实签发给自己。参见 Security Best Practices

工具权限必须比“读/写”更细

工具类型默认策略额外控制
搜索、读取公开数据可低摩擦授权限速、结果大小限制
读取私人文档按资源和租户授权数据脱敏、访问审计
创建草稿允许但不自动发布保存目标与内容摘要
发送、发布、付款每次人工确认展示收件人、金额和最终参数
删除、权限变更默认拒绝或强审批二次确认、可恢复、告警

提示词注入不会被 OAuth 自动解决

OAuth 证明“谁有权调用”,不证明“模型为什么决定调用”。网页、邮件和文档里的恶意文字仍可能诱导 Agent 外发数据或执行工具。因此还需要:

  • 把外部内容视为不可信数据,不把其中指令提升为系统规则。
  • 工具参数由代码校验,禁止模型自由拼接 shell、SQL 和任意 URL。
  • 读操作与写操作分离,高风险动作必须人工确认。
  • 限制每次任务的工具、目录、域名、行数、金额和调用次数。
  • 对返回内容做数据泄露检测,避免把密钥和私人文档发给不相关工具。

Streamable HTTP 还要防 DNS rebinding 与 SSRF

HTTP MCP Server 应验证 Origin,本地服务只绑定 loopback,不要默认监听 0.0.0.0。客户端读取授权元数据或远程资源时,要限制协议、重定向、私网 IP 和云元数据地址。规范对 Streamable HTTP 的安全要求见 Transports

日志应该记录什么、绝不能记录什么

建议记录不要记录
用户内部ID、client ID、tool 名称、结果状态完整 access/refresh token
scope、audience、耗时、审批结果Authorization 头、Cookie、密码
参数摘要或哈希、数据分类、错误码完整私人文档和敏感工具返回

上线前的最小安全测试

  • 用签发给其他 audience 的 token 调用,必须拒绝。
  • 过期、撤销、scope 不足和签名错误的 token 都必须拒绝。
  • 伪造 redirect URI、state 和 PKCE verifier,授权流程必须失败。
  • 让恶意网页要求读取密钥并外发,工具策略必须阻断。
  • 测试内网 URL、重定向链、路径穿越和跨租户资源 ID。
  • 模拟重复请求,付款、发送、删除工具必须具备幂等或确认保护。

MCP 规范仍在演进,文章依据的是 2026-08-08 可见的 draft 与安全指南;实施时应锁定协议版本并持续跟踪 changelog。第一次接触 MCP,可先阅读 Claude MCP 配置与原理教程