安全与认证
7.1 MCP安全模型
MCP的安全责任分布在不同层面:| 层面 | 负责方 | 内容 |
|---|---|---|
| 传输安全 | 传输层 | HTTPS加密、证书验证 |
| 身份认证 | OAuth 2.1 + Server | 验证调用方身份 |
| 权限控制 | Server | 控制不同用户的工具访问权限 |
| 数据隐私 | Server + Host | 不泄露敏感数据给AI模型 |
| 工具安全 | Host | 高风险工具调用需用户确认 |
7.2 OAuth 2.1认证
MCP规范基于 OAuth 2.1(draft-ietf-oauth-v2-1-13)定义远程Server的认证机制。这不是MCP发明的新认证方案,而是完全基于现有OAuth标准和相关RFC规范。涉及的RFC标准
| RFC | 名称 | 在MCP中的作用 |
|---|---|---|
| draft-ietf-oauth-v2-1-13 | OAuth 2.1 | 核心授权框架 |
| RFC 7636 (PKCE) | Proof Key for Code Exchange | 防止授权码拦截攻击(MCP强制要求S256方法) |
| RFC 8414 | Authorization Server Metadata | Client自动发现授权服务器的端点和能力 |
| RFC 7591 | Dynamic Client Registration | Client首次连接时自动注册 |
| RFC 9728 | Protected Resource Metadata | Server声明自己的认证要求和关联的授权服务器 |
| RFC 8707 | Resource Indicators | Client指定请求token的目标资源 |
完整认证流程
PKCE (Proof Key for Code Exchange)
MCP强制要求PKCE,且必须使用S256 方法(不允许 plain)。PKCE防止授权码被中间人拦截后滥用:
Token类型
MCP使用 Bearer Token。access_token在HTTP请求头中传递:7.3 Server端认证实现
7.4 权限控制
不同工具需要不同权限级别:工具级权限矩阵
建议为每个工具定义明确的权限要求:| 权限级别 | 说明 | 示例工具 |
|---|---|---|
| 公开 | 无需认证 | search_products, get_categories |
| 登录 | 需要有效的access_token | get_order, list_orders |
| 所有者 | 只能操作自己的数据 | create_return, update_profile |
| 管理员 | 需要管理员权限 | update_inventory, manage_promotions |
7.5 数据隐私
原则: Server返回的数据会被AI模型处理。不要在工具返回中包含不应该被AI”看到”的敏感信息。| 可以返回 | 不应返回 |
|---|---|
| 商品名、价格、库存 | 用户密码、支付凭证 |
| 订单状态、物流信息 | 完整信用卡号 |
| 公开的公司信息 | 内部成本价、利润率 |
| 脱敏后的用户信息 | 完整身份证号 |
Resource的Annotations辅助隐私控制
通过Annotations的audience 字段控制资源的目标受众:
audience: ["assistant"] 表示该资源仅供AI模型处理,不应直接展示给用户。Host可以据此决定是否在UI中隐藏该资源。
7.6 传输安全
远程Server(Streamable HTTP)
- 强制HTTPS: 生产环境必须使用TLS加密
- 证书验证: Client应验证Server的TLS证书
- CORS: 如果Client是浏览器应用,Server需配置适当的CORS策略
本地Server(stdio)
stdio本地Server天然安全(不暴露网络),但仍需注意:- 不要硬编码数据库密码在代码中,用环境变量
- 限制文件系统访问范围(配合Roots机制)
- 日志不要记录敏感数据
- Server进程以最小权限运行
7.7 安全检查清单
开发MCP Server时,对照以下清单确保安全:- 远程Server是否使用HTTPS
- 是否实现了OAuth 2.1认证(含PKCE S256)
- 敏感工具是否检查了用户权限
- 返回数据是否经过脱敏处理
- 环境变量是否用于存储密钥
- 日志中是否排除了敏感信息
- 是否对输入参数进行了验证和清理
- 是否实现了请求频率限制
下一章: 测试与调试 — MCP Inspector使用指南