Skip to content

如何设计 AI Agent 的工具权限控制?不同场景下的工具应该有什么样的权限差异? ​

  • 标签:AI、大模型、Agent

🏛 业务架构师 ​

工具权限控制设计,我的模型是"工具×环境×身份三元组 + 分层管道":

权限差异的三把尺子:

  1. 按场景/环境:同一工具不同权限档——"执行命令"工具:开发沙箱全放行、测试环境只读、生产环境禁用或仅白名单命令;"发送消息":内部群可发、对外渠道需审批;
  2. 按发起者身份:管理员会话可跑管理工具、普通用户会话只有查询类;群组会话收紧(群内消息可能被他人利用做注入攻击),私聊适当放宽;
  3. 按风险等级:读操作默认放行(低危);写操作(改数据、发通知)需场景校验(参数白名单、频率限制);高危操作(资金、删除、对外发送)强制人工审批+双人复核。

落地的分层管道(OpenClaw 式设计):静态声明层(Agent 配置可装载的工具包,最小权限)→ 上下文约束层(运行时按渠道/群组/环境收紧)→ 参数校验层(路径白名单、只读 SQL 检查、金额上限)→ 审批层(高危操作挂起等人确认)。每个决策点全量审计留痕。

业务价值视角:这套设计让"一个工具平台服务多种安全等级场景"——同一套工具定义,内部研发 Agent 挂宽松策略、对客 Agent 挂严格策略,策略配置化而非代码分叉。前期建设约一两周,但它是 Agent 安全事故的第一道闸——我经手的越权类 badcase,九成能用"参数校验+环境隔离"两板斧挡住。

🏗 系统架构师 ​

工具权限控制我的设计是**"风险分级 × 维度管控 × 策略管道"**,先分级再谈差异:

风险分级(按可逆性与影响面):

  • 只读低危(搜索、读文档):自动放行 + 限流;
  • 只读敏感(用户数据、内部系统):RBAC 角色绑定授权;
  • 写操作可逆(草稿、发消息):放行 + 强审计;
  • 写操作难逆(删文件、改配置):作用域白名单 + 审批;
  • 高危不可逆(支付、删生产数据、任意命令执行):人工确认闸门 + 双人复核。

场景化的权限差异(维度管控):

  • 按渠道/场景降权:群聊里禁用高危工具(防多人诱导 Agent)、外部租户只开放只读、测试环境全放开;
  • 参数级控制:同一工具不同场景不同参数约束——exec_command 在探索模式禁 rm/sudo,部署模式放行指定脚本;路径白名单(只能访问工作区目录)、目标白名单(只能查指定库表);
  • 按任务阶段:研究阶段只读、经确认后进入执行阶段才解锁写权限(渐进授权)。

实现形态(策略管道):调用请求依次过——会话策略 → 用户角色策略 → 工具策略(参数校验/白名单/配额)→ 动态确认(高危弹审批)。声明式配置、默认拒绝、拒绝可解释(告知命中哪条规则)、全量审计。

架构原则:与零信任一脉相承——不因为"是 Agent 在调用"就给更多权限,Agent 的权限永远不超过其代理的用户。

💻 全栈开发专家 ​

工具权限控制我的落地方案是「身份 × 场景 × 动作 × 参数」四维策略矩阵,加运行时管道:

权限差异设计(不同场景的工具分级):

  • 只读查询类(get/list/search):低危,常规会话直接放行——但要做数据范围隔离(只能查自己租户的数据,参数注入 tenant_id 强制覆盖);
  • 写操作类(create/update):中危,普通场景放行但带幂等键和审计;敏感场景(生产环境、外部可见的写)需确认;
  • 破坏类(delete/reset/execute shell):高危,默认拒绝;允许的场景要求人工确认(消息里弹审批卡片)或双人复核;
  • 资金/法务类(退款、发合同):规则前置——金额上限、白名单账户硬校验,模型说了不算。

实现:策略管道 + 声明式配置:

java
public ToolVerdict check(ToolCall call, ActorContext ctx) {
    for (ToolPolicy p : pipeline) {          // ScenePolicy → RolePolicy → ActionPolicy → ParamPolicy
        ToolVerdict v = p.evaluate(call, ctx);
        if (v.isDeny()) return v.withReason("该操作需要DBA角色");
        if (v.needsConfirm()) return v.withSnapshot(call); // 挂起等确认
    }
    return ToolVerdict.allow();
}

工程要点:

  1. deny by default,显式开放;
  2. DENY 返回可读原因(模型能向用户解释);
  3. 参数级策略:delete 在 env=test 放行、env=prod 必须 confirm 且 where 非空、影响行数 ≤ 上限;
  4. 确认请求带完整调用快照防「确认的和执行的不一致」;
  5. 全量审计(谁、何时、哪条策略放行/拦截),审计日志不可篡改;
  6. 高危工具冷却时间,防连续确认误操作。

原则:权限判断放在代码层(确定性),prompt 层的「你不要执行危险操作」只是软约束,永远不是防线。