博客
MCP

发布于 更新于

Shouryamaan 和 Arag

MCP 安全:如何避免 AI Agent 接触 API 密钥

以 Markdown 阅读

提供商密钥不应进入模型上下文、工具参数、工具结果、URL、浏览器代码或日志。MCP 服务器使用独立的上游凭据,模型只能获得经过授权的工具结果。

MCP access token 同样需要保护,但它并不是提供商 token。将其透传给上游 API,会破坏协议规定的 audience 边界。

凭据会在哪里泄露

提示词与上下文

Agent 为诊断配置而读取 .env,随后可能在推理、生成的代码或对话记录中输出其中的值。应尽可能禁止面向模型的文件工具读取密钥存储。进程需要凭据时,应将凭据直接注入该进程,而不是要求模型读取。

工具参数与结果

工具为了照搬上游 API 而接收 apiKey,或返回包含凭据和调试 header 的提供商响应。应将密钥字段从 schema 中彻底移除,由服务端从经过身份验证的会话状态中解析凭据。

URL

查询字符串会出现在访问日志、浏览器历史记录、分析系统、错误报告和截图中。MCP 授权规范要求通过 Authorization header 传递 bearer access token,并禁止在 URI 查询字符串中传递。

日志与链路追踪

HTTP 中间件可能在应用脱敏逻辑运行前记录 header 和请求体。错误追踪工具也可能捕获环境变量、子进程命令或本地文件。应在采集边界完成脱敏,并测试序列化后的事件,而不只是 logger 调用。

生成的代码与产物

即使 Git 已忽略 .env,agent 仍可能将凭据硬编码到脚本、fixture、notebook、截图或构建输出中。部署前,应扫描构建后的客户端 bundle 和生成产物,查找凭据前缀。

AI agent 安全指南介绍了 MCP 之外的密钥处理方法。

使用两道授权边界

flowchart LR
    C[MCP client] -->|MCP access token| S[MCP server]
    S -->|validated user and policy| P[Tool executor]
    P -->|separate upstream credential| U[Provider API]
    U -->|bounded result| P
    P -->|redacted tool result| C

MCP 服务器会验证 access token 的 audience 是否为自身,然后对其代表的用户和工具操作执行授权。执行器使用专门为上游服务签发的凭据。条件允许时,上游 API 还应对最终资源执行授权。

MCP 规范明确禁止将传入的 MCP token 转发给上游 API。身份验证与授权指南介绍了资源指示符、audience 校验和独立下游授权。

将上游凭据限定到工具所需范围

使用只能执行当前工具所需操作、访问所需资源的凭据。只读客户查询不应使用账户管理员密钥。如果提供商无法签发足够精细的权限,应在其前面增加一个范围严格受限的服务端代理,并在代理中执行缺失的规则。

开发和生产环境使用不同凭据。Coding agent 工作区和测试 fixture 中不得出现生产凭据。

将 Cohesivity 凭据留在服务端

Cohesivity 将用于租户管理的管理密钥与用于已配置服务的应用密钥分开,两者都应留在服务端代码中。上游提供商凭据始终由 Cohesivity 保管。

对于 HTTP 应用,如果 offering 支持,可以用应用密钥换取短期 edge 会话 token,并确保该 token 只存在于服务端请求路径中。不要把任何 coh_* 值放入公开环境变量或浏览器请求。

后端资源配置教程展示了完整配置过程中如何分离这些凭据。

使用金丝雀值测试脱敏

在测试环境中使用形状类似真实凭据的虚假金丝雀值。让请求依次经过模型输入、工具执行、上游失败、重试、日志记录、链路追踪和错误报告,再在捕获的所有产物中搜索该值。

至少测试:

  • 请求和响应日志;
  • trace attribute 和 event;
  • 错误追踪 payload;
  • 模型对话记录;
  • 生成的源代码和构建输出;
  • shell 历史记录和进程命令行;
  • 测试 snapshot 和 fixture。

不要使用真实凭据进行这项测试。

在事故发生前设计轮换和撤销流程

记录凭据所有者、权限范围、创建时间、最后使用时间、轮换流程和撤销路径。新旧凭据只应在部署确实需要时短暂重叠。撤销凭据不应要求删除用户账户或组织中的所有集成。

下方的提示词会追踪一项指定凭据在整个系统中的路径,同时避免输出它的值。