给 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 使用独立低权限凭据
  • 审计日志可查询
  • 做过一次提示注入演练

相关阅读