AI Agent 工具权限白名单怎么设计:最小权限、分级确认与审计
给 AI Agent 设计工具权限白名单,核心是三句话:默认拒绝,只开放任务需要的工具;按「只读 / 可逆写入 / 不可逆」分级,越危险越需要人确认;每次调用都留审计记录。 这样即使模型被提示注入或判断失误,损害也被限制在可控范围内。
为什么不能「全部开放」
Agent 的能力来自工具:读文件、发邮件、调接口、执行命令。模型可能误解任务,也可能被网页、文档里的恶意指令诱导。一旦它拥有删除、转账、对外发送等权限,一次错误就可能造成不可逆后果。
第一步:列出工具并分级
| 级别 | 例子 | 默认策略 |
|---|---|---|
| L0 只读 | 搜索、读取文档、查询订单状态 | 自动允许 |
| L1 可逆写入 | 创建草稿、写入临时目录、加标签 | 自动允许,记录日志 |
| L2 对外或不可逆 | 发送邮件、删除数据、付款、发布内容 | 每次需人工确认 |
判断标准很简单:出错后能不能无损撤回?会不会被外部看到?
第二步:写白名单配置
以一个「客服工单助手」为例(格式示意,按你的框架调整):
agent: support-ticket-assistant
default: deny
tools:
- name: search_kb
level: L0
- name: get_ticket
level: L0
params:
ticket_id: { pattern: "^T[0-9]+$" }
- name: draft_reply
level: L1
- name: send_reply
level: L2
require_approval: true
- name: refund
level: L2
require_approval: true
params:
amount: { max: 0 } # 本 Agent 不允许退款,金额上限为 0
要点:工具级允许之外,再加参数级限制,比如只允许访问特定目录、特定域名、金额上限。
第三步:设计人工确认
确认卡片要让人一眼看懂:
- 将要执行的动作和完整参数(收件人、正文、金额)。
- 触发这个动作的原因(Agent 的简述)。
- 「批准 / 拒绝 / 修改后批准」三个选项。
避免「一次批准、永久有效」,L2 操作逐次确认。
第四步:审计日志
每次工具调用记录:时间、Agent 与会话 ID、工具名、参数(敏感字段脱敏)、结果、是否经过人工批准及批准人。定期抽查异常模式,例如短时间内大量调用、反复被拒绝的请求。
常见坑
- 用一把万能凭据:给 Agent 单独的低权限账号或令牌,而不是复用管理员凭据。
- 只限工具不限参数:允许「读文件」却不限目录,等于开放全部。
- 确认疲劳:L0/L1 也弹确认,用户会习惯性点批准,反而降低安全性。
- 外部内容当指令:网页和文档里的文字只是数据,不能触发 L2 操作。
上线前检查清单
- 默认拒绝已开启
- 每个工具已定级,L2 均需确认
- 关键参数有限制
- Agent 使用独立低权限凭据
- 审计日志可查询
- 做过一次提示注入演练