先把 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 授权链路
- 客户端访问 MCP endpoint,未授权时收到 401 和资源元数据提示。
- 客户端读取 Protected Resource Metadata,发现对应授权服务器。
- 公共客户端发起 Authorization Code + PKCE,使用
S256。 - 请求中携带
resource,把 token 绑定到目标 MCP Server。 - MCP Server 验证签名、issuer、audience、scope、过期时间和撤销状态。
- 调用下游 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 APIMCP 官方安全文档明确把 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 配置与原理教程。