身份、最小权限与供应链
本节目标
能为用户、Agent、工具和管理员划分身份边界;从用途计算最小 scope;管理短期凭据;为模型、数据、Prompt、Skill、MCP server、依赖和部署产物建立来源、版本、验证与回滚链。
身份是能力的根
模型可以提出动作,真正的权限来自执行动作时使用的身份。至少区分:
- 最终用户身份与租户;
- Agent 单次运行的工作负载身份;
- 工具服务身份;
- 开发、CI/CD、运维和紧急管理员;
- 外部供应商或托管模型身份。
共享“万能服务账号”有两个问题:任一注入都继承全部能力;审计只能看到服务账号,无法证明是哪位用户授权。较好的模式是把可信登录主体传到策略层,为本次任务签发短期、窄 scope、绑定用户/租户/环境的工作负载凭据。
最小权限不是一次性配置
功能、scope、对象、时间、环境
最小权限至少包含五个维度:只暴露完成用途所需的工具;只签发所需动作 scope;只访问当前对象或租户;凭据短期有效;开发/测试/生产严格分开。mail.read 比 mail.* 窄,但若能读全公司邮箱仍可能过宽。
每次执行都重新授权
模型输出的用户名、角色和“已批准”都不是认证证据。工具执行器应从可信会话取得主体并检查:动作、对象、租户、数据分类、审批和当前状态。缓存授权结果时要考虑撤权和过期。
组件来源验证和运行时授权是两条不同证据链:签名、哈希或可信发布者帮助回答“拿到的是否是预期组件”,不能回答“该组件此刻能否代表此用户访问此对象”。反过来,OAuth/token 也不能证明工具代码、描述或更新没有被替换。
秘密不进入模型上下文
API key、token、连接字符串不写进 Prompt、长期记忆、工具错误、示例仓库或完整轨迹。使用环境注入或秘密管理服务;只提供 .env.example 占位符。发现泄露时撤销与轮换才是恢复,单纯从文件删除不足以使旧凭据失效。
AI Agent 的供应链比 Python 包更广
| 组件 | 需要记录 | 典型风险 |
|---|---|---|
| Python/系统依赖、容器 | 名称、不可变版本、来源、哈希/签名、许可证 | 恶意更新、依赖混淆、安装脚本执行 |
| 基础/微调模型 | 供应方、模型标识/版本、权重来源、使用条款 | 行为漂移、自定义代码、权重投毒 |
| 数据集、RAG 知识源 | 来源、时间、许可、租户、处理记录 | 数据/上下文投毒、隐私污染、过期事实 |
| Prompt、策略、评测集 | 版本、审批、变更人、回归结果 | 控制被弱化、测试泄漏 |
| Tool/MCP/Skill/插件 | 发布者、版本、权限、工具 schema、数据去向 | 工具投毒、描述注入、越权、远程行为变化 |
| 托管 API | 供应商、区域、保留策略、版本策略、停用方案 | 静默升级、数据出境、服务中断 |
“来自官方市场”或“供应商已认证”是一个信号,不等于你的具体版本、配置、权限和数据路径安全。
可执行的供应链控制
- 清单:维护软件物料清单(SBOM)之外的 AI 组件清单,能够从一次 run 追溯到模型、Prompt、工具、数据快照和依赖版本。
- 固定:使用 lockfile、不可变镜像摘要和明确模型/工具版本;避免生产
latest。 - 验证:从可信源获取,验证哈希/签名/证明(若生态支持),在隔离环境审查安装脚本和模型自定义代码。
- 最小权限:第三方组件只能接触声明所需的数据、文件和网络;MCP server 的工具列表不能自动获得全部执行权。
- 变更门:更新前运行安全、质量、隐私与性能回归;对工具列表、schema、目的地、scope 变化特别审查。
- 回滚和停用:保留上一个已知良好产物、工具紧急关闭、供应商替代或降级路径,并实际演练。
- 持续监测:漏洞通告、维护状态、版本漂移和供应商条款变化进入责任人的队列。
NIST SP 800-218A 是面向生成式 AI 与双用途基础模型的 SSDF 社区配置文件,最终版于 2024 年 7 月发布。它帮助把 AI 特有考虑纳入安全软件开发,但不自动证明某个 Agent 部署安全。
MCP 与工具生态的特别提醒
远程工具描述、返回内容和更新都可能成为不可信输入。客户端仍需独立做工具允许列表、用户授权、目的地与数据出站控制。经资源服务器验证发行方、受众、有效期和适用 scope 的 OAuth access token 是授权判断的输入,并不会证明模型本次调用符合用户意图。不要把第三方 server 的错误文本直接当可信指令,也不要在多个 server 之间无边界转发 token。
MCP 的令牌边界不是工具授权边界
对使用 HTTP 授权的 MCP,客户端请求的 access token 面向 MCP server;server 必须验证 token 的预期受众/资源绑定后才处理请求。若该 server 还要访问第三方 API,它应作为那个 API 的 OAuth client 获取并管理另一枚下游 token,不能把收到的 MCP client token 原样转交。这样既避免 token passthrough 和混淆代理,也保留每一跳的审计主体。
即使 token 有效,执行器仍要按当前调用者、被代理用户/租户、对象、用途、状态和数据目的地进行业务授权;MCP 的身份或 scope 不是“模型这次意图正确”、也不是人工批准或风险接受的证明。把“传输层 token 已验证”和“对象级动作已授权”记录为两项独立证据,才能定位哪一层失效。
动态发现的 server、tool、schema、描述和授权范围应视为运行配置变更:记录来源与版本/快照,比较新增、删除和权限变化,经策略重新允许后再暴露给模型。发现成功不等于安装、信任或授予执行权。
从动态发现到受控发布
准备进入生产决策的外部组件应保存为可复核快照,而不是一个可变名称。快照至少记录可获得的 server 身份/发布渠道、传输与协议版本、工具/Resource/Prompt schema 清单及摘要、声明的执行身份与 scope/受众(适用时)、Roots/数据范围和出站目的地;其中绝不记录 bearer token 或其他秘密。工具新增/删除、schema、权限、身份、数据范围或目的地变化,以及来源无法再次核验,都是重做风险分析、负向测试和批准的触发器,不能沿用“上次已连接”的信任。
将快照、回归结果和批准条件绑定到 release_id 与完整发布门证据摘要,才能让事故中的运行记录反查到当时到底允许了什么。摘要只能帮助检测交接物是否变化,不是数字签名、授权事实或组件来源真实性证明;仍需受控制品存储、访问控制和具名决策。关于离线证据、发布门、Canary 与人工分诊的交接边界,见 离线到线上证据交接与回归闭环。
常见错误
- 开发和生产共用 key,或不同租户共用不可审计身份。
- 只固定顶层包,间接依赖、容器基础层或模型 revision 可漂移。
- 把版本号当来源验证;攻击者也能发布带版本号的内容。
- 更新只跑功能测试,不检查工具、权限、目的地和数据流变化。
- 有备份却未演练停用、凭据撤销和回滚。
练习与自测
为一个 RAG Agent 建立组件表:模型、Embedding、知识源、向量库、Prompt、MCP server、Python 包、镜像和托管 API。为每项填写来源、固定方式、可访问资源、更新门和回滚。然后把“共享生产管理员 key”拆成至少两个最小权限短期身份。
- 能区分认证、授权、审批和风险接受。
- 能从用途计算工具、scope、对象、时间和环境边界。
- 能从一次运行追溯所有关键组件版本与来源。
- 能在供应商、模型或工具异常时撤权、停用和回滚。
下一步
把这些边界落地到 Guardrail、沙箱与人工审批。
参考资料
- NIST SP 800-218A(最终版,2024-07;获取日期:2026-07-22)
- NIST Secure Software Development Framework(获取日期:2026-07-22)
- OWASP Top 10 for Agentic Applications(2025 年 12 月发布;获取日期:2026-07-22)
- MCP Authorization specification 与 MCP Security Best Practices: Token Passthrough(获取日期:2026-07-22;用于授权受众验证和禁止 token passthrough 的协议边界)