4.1 安全与授权——OAuth 2.1 与权限控制
小周的 Todo Server 在本地跑得很好。上周他把成果分享给了团队,同事小李说:"能不能部署到服务器上让大家远程用?" 另一个同事立刻反对:"远程访问?安全问题怎么办?"
小周意识到:他必须认真对待安全问题了。
MCP 的安全模型
MCP 的安全建立在几个基本原则之上:
用户同意
AI 使用工具前需要用户明确授权。尤其是写操作、外部系统访问等高风险行为
数据隐私
Server 只能访问被授权的数据。最小权限原则——只暴露必要的工具和数据
工具安全
工具调用有权限边界和审计日志。Tool annotations 提供安全提示(但不可信)
采样控制
Server 不能随意让 AI 执行 LLM 推理。Sampling 请求需要用户审批
OAuth 2.1 授权流程
远程 MCP Server 使用 OAuth 2.1 进行授权。这是 v4 引入的完整授权框架。
角色映射
| OAuth 角色 | MCP 中的对应 |
|---|---|
| Resource Server | MCP Server |
| Client | MCP Client |
| Authorization Server | 可以是 Server 内置,也可以是外部服务 |
授权流程
1. Client 连接 Server
2. Server 返回 401 + WWW-Authenticate 头
3. Client 发现 Authorization Server
4. Client 重定向用户到授权页面
5. 用户登录并授权
6. Authorization Server 返回 Access Token
7. Client 用 Token 访问 Server三方交互序列:
MCP Client
连接→
←401 + metadata
发现 Auth Server→
←authorization_endpoint
动态注册 /register→
←client_id
重定向用户登录→
←access_token
请求(Bearer token)→
←200 + 数据
MCP Server
Auth Server
受保护资源元数据(RFC 9728)
Server 通过 .well-known/oauth-protected-resource 端点发布授权信息:
json
{
"resource_server": "https://my-mcp-server.example.com",
"authorization_servers": ["https://auth.example.com"],
"scopes_supported": ["tools:read", "tools:write", "resources:read"]
}授权服务器元数据
Authorization Server 通过 .well-known/oauth-authorization-server 发布配置:
json
{
"issuer": "https://auth.example.com",
"authorization_endpoint": "https://auth.example.com/authorize",
"token_endpoint": "https://auth.example.com/token",
"registration_endpoint": "https://auth.example.com/register",
"response_types_supported": ["code"],
"code_challenge_methods_supported": ["S256"]
}动态客户端注册(RFC 7591)
MCP Client 不需要预注册——它可以通过 registration_endpoint 动态注册:
json
// POST /register
{
"client_name": "Claude Desktop",
"redirect_uris": ["http://localhost:8080/callback"],
"grant_types": ["authorization_code"],
"token_endpoint_auth_method": "none"
}安全威胁
MCP 面临的主要安全威胁:
| 威胁 | 说明 | 防御 |
|---|---|---|
| Tool Poisoning | 恶意 Server 提供虚假工具描述,诱骗 LLM 执行危险操作 | 人工审核工具列表 |
| Rug Pull | Server 先提供正常工具,获取信任后更改工具行为 | 定期审核、代码审查 |
| 数据泄露 | Server 返回的数据包含敏感信息 | 最小权限、数据脱敏 |
| 指令注入 | Server 返回的内容包含恶意指令 | 沙箱隔离、内容过滤 |
| CSRF | 恶意网页伪造 MCP 请求 | 验证 Origin 头 |
| DNS 重绑定 | 攻击者通过 DNS 绕过 localhost 限制 | 绑定 localhost 或验证域名 |
Tool Annotations 的安全含义
Tool Annotations 提供了安全提示,但不能作为安全依据:
| 注解 | 安全含义 | 注意事项 |
|---|---|---|
readOnlyHint: true | 工具声称只读 | Server 可能撒谎,仍需验证 |
destructiveHint: true | 工具声称有破坏性 | 无论如何都应要求用户确认 |
idempotentHint: true | 工具声称幂等 | 重复调用仍可能产生副作用 |
openWorldHint: true | 工具访问外部系统 | 外部系统的安全性不受 MCP 控制 |
Tool Annotations 是不可信的
这值得再说一遍:Server 可以声称工具是只读的,但实际执行写操作。Annotations 是「标签」不是「保证」。安全决策必须基于代码审查和权限控制,而非工具自身的声明。
最佳实践
Server 开发者
最小权限原则——只暴露必要的工具和数据
审计日志——记录所有工具调用
输入验证——严格验证所有工具参数
速率限制——防止工具被滥用
不要在日志中暴露凭据
Client 开发者
用户确认——高风险操作前要求确认
验证 Server 身份——远程 Server 必须有有效证书
只连接信任的 Server——不连接来源不明的 Server
定期审查工具权限——Server 更新后重新审核
部署者
stdio Server 最安全——本地子进程,网络不可达
HTTP Server 必须启用 TLS——永远不要用明文传输
验证 Origin 头——防止 CSRF 攻击
绑定 localhost——除非确实需要远程访问
本节核心要点
- MCP 安全四原则:用户同意、数据隐私、工具安全、采样控制
- 远程 Server 使用 OAuth 2.1 授权(v4 引入)
- Tool Annotations 是安全提示但不可信,安全决策基于代码审查
- stdio Server 最安全(本地子进程),HTTP Server 需要额外安全措施
- 主要威胁:Tool Poisoning、Rug Pull、数据泄露、指令注入
思考题:如果你要部署一个允许远程访问的 MCP Server,你会采取哪些安全措施?从网络层到应用层列举。
参考思路
网络层:TLS 加密、绑定域名验证、防火墙规则、速率限制。应用层:OAuth 2.1 授权、验证 Origin 头防 CSRF、输入严格校验、审计日志。MCP 层:最小权限工具暴露、Tool Annotations 诚实标注、Elicitation 确认高风险操作。
← 上一节:调试利器 | 目录 | 下一节:高级特性 →