工具权限与审批
核对日期:2026-05-09。
1. 定义与边界
工具权限与审批是指在工具执行前,根据用户身份、资源范围、工具风险、参数内容和环境策略,决定允许、拒绝或要求人类确认。
它不是模型提示词里的“请谨慎操作”。权限必须在运行时强制执行,审批必须基于真实工具参数和真实影响范围。
2. 为什么重要
Agent 会把自然语言目标转换成外部动作。如果缺少权限与审批,常见事故包括:
- 误删文件、误发邮件、误改生产配置。
- 使用用户 A 的凭据访问用户 B 的数据。
- 第三方 MCP Server 借 Agent 权限访问不相关系统。
- 模型被提示注入诱导调用高权限工具。
3. 核心机制
3.1 三层权限
| 层级 | 例子 |
|---|---|
| 身份权限 | 用户是否能读取该客户、操作该仓库 |
| 工具权限 | 该用户角色是否能使用 email.send |
| 参数权限 | 目标邮箱、金额、路径、生产环境配置是否超出授权 |
3.2 风险分级
| 等级 | 类型 | 默认策略 |
|---|---|---|
| L0 | 纯计算、格式转换 | 允许,记录日志 |
| L1 | 低敏读操作 | 允许,脱敏返回 |
| L2 | 敏感读操作 | 需要权限校验,可能需要审批 |
| L3 | 可逆写操作 | 预览 + 用户确认 |
| L4 | 不可逆或外部影响操作 | 强审批、双人复核或禁止自动执行 |
4. 架构模式
4.1 Policy Engine
tool: email.send
effect: write
rules:
- when: "recipient_domain not in allowed_domains"
decision: require_approval
- when: "attachments contains sensitive_data"
decision: deny
- when: "environment == 'production'"
decision: require_approval
4.2 Preview/Confirm 两阶段
高风险工具拆成两个工具:
payment.preview_transfer:生成预览,不产生副作用。payment.confirm_transfer:只接受预览 ID 和用户确认令牌。
这样模型不能直接构造最终写操作,审批 UI 可以展示确定的动作。
4.3 Capability Token
对远程工具或 MCP Server,可使用短期 capability token 限定:
- 谁授权。
- 能调用哪些工具。
- 能访问哪些资源。
- 有效期多久。
- 是否允许写操作。
5. 工程实现
5.1 权限决策输入
{
"user": {"id": "u_123", "roles": ["support"], "tenant": "t_01"},
"tool": {"name": "crm.update_customer_status", "risk": "L3"},
"arguments": {"customer_id": "cus_9", "status": "suspended"},
"context": {"environment": "production", "source": "chat"},
"trace_id": "tr_abc"
}
5.2 权限决策输出
{
"decision": "require_approval",
"reason": "production_write",
"approval": {
"title": "确认修改客户状态",
"facts": [
"客户 cus_9 将被改为 suspended",
"环境 production",
"该操作会影响客户登录"
],
"expires_in_seconds": 300
}
}
6. 生产实践
- 审批界面展示真实参数,不展示模型总结。
- 审批记录绑定 tool_call_id、参数 hash、审批人、时间和结果。
- 用户批准一次不代表永久批准;长期授权要有明确 scope 和过期时间。
- 写工具默认幂等,审批后重放必须检测同一幂等键。
- 对生产环境和外部发送类工具启用更高等级策略。
- 对 MCP Server 做来源 allowlist,不让用户随意连接未知工具源。
7. 常见反模式
| 反模式 | 后果 |
|---|---|
| 在系统提示里要求模型“不要乱用工具” | 无强制力 |
| 审批时只显示“Agent 想发送邮件” | 用户无法判断真实影响 |
| 审批后允许模型改参数再执行 | 审批对象被偷换 |
| 按工具名授权,不按资源授权 | 越权访问具体对象 |
| 所有 MCP Server 共享同一 token | Confused deputy 和横向移动风险 |
8. 评测方法
- 构造越权读取样例,检查策略是否拒绝。
- 构造高风险写操作样例,检查是否进入审批。
- 构造提示注入样例,诱导模型调用写工具,检查拦截率。
- 回放真实 trace,抽样审计审批文案是否足够明确。
- 测试审批过期、参数变更、重复提交、撤销授权。
9. 安全与治理
MCP 远程 HTTP 场景下应重视授权边界。MCP 官方安全最佳实践强调 token audience、用户同意、最小权限、HTTPS、不能接受未发给自己的 token。对企业系统还应增加:
- per-tenant 工具 allowlist。
- per-user OAuth consent。
- token 不透传给不相关下游。
- 审计日志可导出给 SIEM。
- 高风险工具默认关闭,由管理员显式开启。
10. 审批协议流程
审批 token 应绑定:
{
"approval_id": "ap_123",
"tool_call_id": "call_456",
"tool_name": "email.send",
"arguments_hash": "sha256:...",
"approved_by": "u_manager",
"expires_at": "2026-05-09T12:00:00+08:00",
"scope": {
"tenant": "t_01",
"resource_ids": ["draft_789"],
"effect": "send_once"
}
}
11. 权限评测方案
| 场景 | 预期 |
|---|---|
模型把 approved=true 放进参数 | 参数被忽略,审批仍由系统决定 |
| 审批后模型修改收件人 | args hash 不匹配,执行拒绝 |
| token 发给错误 MCP Server | audience 校验失败 |
| 用户只有读权限却请求写 | require_approval 不足以放行,直接 deny |
| prompt injection 诱导发送数据 | policy 阻断外发工具或进入审批 |
12. 安全补充:审批文案
审批界面不能只展示模型总结,应展示机器可验证事实:
- 工具名和风险等级。
- 目标资源 ID、环境、租户。
- 写入字段的 before/after。
- 外发目标、附件、数据等级。
- 参数 hash、过期时间、是否可撤销。
13. 权威资料
- MCP Authorization specification 2025-11-25: https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization
- MCP Security Best Practices: https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices
- OpenAI Remote MCP guide: https://platform.openai.com/docs/guides/tools-remote-mcp
- Anthropic MCP connector docs: https://docs.anthropic.com/en/docs/agents-and-tools/mcp-connector
- OWASP LLM06 Excessive Agency: https://genai.owasp.org/llmrisk/llm062025-excessive-agency/