Agent 安全治理:为什么 Agent 必须先"挣得"自主权
一个正在形成的共识
UberConf 2026 的安全议题中出现了一句话:
Agents must earn autonomy rather than start with it.
(Agent 必须挣得自主权,而不是一开始就拥有它。)
这句话来自 UberConf 2026 的 Agent Governance 分享。它不是技术建议,而是工程原则——和”最小权限原则”一样,正在成为 Agent 工程的默认约束。
为什么”挣得自主权”是正确的原则
1. Agent 的 blast radius 比传统服务大得多
传统微服务的 blast radius 是可预测的:一个 API 调用失败,影响范围是调用链上的下游服务。
Agent 的 blast radius 是不可预测的:
- Agent 可以调用任意工具(包括写数据库、删文件、执行 shell)
- Agent 的行为路径不是预定义的,而是模型推理出来的
- Agent 可以在”推理”中决定改变自己的行为目标
这意味着:Agent 的权限边界不能用 API gateway 那种”路径+方法”模型来管。
2. OAuth 2.1 token 生命周期和 Agent session 不匹配
这是 UberConf 2026 提到的一个具体问题:
OAuth 2.1 的 token 生命周期通常以小时计(1h-24h),但 Agent session 可能运行数天甚至数周。token 过期后 Agent 行为不可预测。
传统 Web 应用:token 过期 → 用户重新登录 → 继续。
Agent 应用:token 过期 → Agent 可能尝试用缓存 token 继续调用 → 失败 → Agent 可能”推理”出一个绕过方案 → 不可预测行为。
解法不是延长 token 生命周期,而是引入 gateway 级的 auth 管理:Agent 不直接持有 token,而是通过 gateway 代理所有外部调用,gateway 负责刷新和验证。
3. “Agent earn autonomy” 的 4 个阶段
UberConf 提出的分阶段自治模型:
| 阶段 | 自治程度 | 典型场景 | 约束 |
|---|---|---|---|
| L0: Human-in-the-loop | 每个工具调用都需人确认 | 写数据库、删文件、执行 shell | 人工审批 gate |
| L1: Read-only autonomy | 只读操作自主,写操作需确认 | 查询数据、搜索代码、调用分析 API | 工具分类:read vs write |
| L2: Bounded autonomy | 在定义的 blast radius 内自主 | 指定数据库的 CRUD、指定目录的文件操作 | blast radius 限制(沙箱) |
| L3: Full autonomy | 完全自主 | 实验性、内部工具 | 审计日志 + 告警 |
关键判断:大多数企业 Agent 应该停在 L1 或 L2。L3 只适用于内部实验工具,不应该用于面向用户的系统。
Policy-as-Code:Agent 安全的工程化
“Agent earn autonomy”不是靠文档和规范约束的,而是靠 Policy-as-Code。
什么是 Policy-as-Code
和 Infrastructure-as-Code 一样:Agent 的权限策略用代码定义,自动执行,版本管理。
1 | # 示例:Agent 权限策略 |
这和 MQ + Agent 事件总线有什么关系
在之前的文章 MQ 在 AI 后端的新角色:从异步解耦到 Agent 事件总线 里,我讨论了 MQ 作为 Agent 事件总线。现在需要补充一个安全维度:
MQ 是 Agent 安全治理的天然切入点:
所有 Agent 工具调用走 MQ:Agent 不直接调用工具,而是发消息到 MQ,由 gateway 消费并执行。这样可以:
- 在 gateway 层做权限校验
- 记录完整的审计日志
- 限流和熔断
MQ 消息携带 policy context:每条消息附带 Agent 的权限级别和 blast radius,consumer 根据策略决定执行还是拒绝。
死信队列作为安全网:被策略拒绝的操作进入死信队列,人工审查后决定是否放行。
1 | Agent → MQ(带 policy context)→ Policy Gateway → Tool执行 |
3 个你必须现在就做的安全检查
不管你用的是 Spring AI、Spring AI Alibaba 还是 AgentScope:
检查 1:你的 Agent 能调哪些工具?
1 | // 列出你的 ChatClient 注册的所有工具 |
如果你的 Agent 注册了 50 个工具,其中包含写数据库、删文件、执行 shell——那你的 blast radius 就是”整个系统”。
建议:按场景拆分 Agent,每个 Agent 只注册该场景需要的工具。用 ToolSearch(参考 Spring AI 2.0 ToolSearch 实战)做按需加载。
检查 2:你的 Agent 执行代码在沙箱里吗?
如果你的 Agent 有 ShellTools 或 FileSystemTools,问自己:
- 它能执行的命令有限制吗?
- 它能读写的目录有限制吗?
- 它执行失败后会怎样?
AgentScope Java 2.0 内置 Sandbox 组件。Spring AI 目前没有——你需要自己实现(用 Docker 容器或 OS 级 sandbox)。
检查 3:你能审计 Agent 的每一个决策吗?
1 | // 你能做到这个吗? |
如果你的 Agent 没有决策日志,出了问题你无法追溯。没有审计的 Agent 就是一个黑盒。
更新已有判断
在之前的文章里,我写过:
“MQ 在 Agent 架构中的角色升级为事件总线——从异步解耦到 Agent 编排。”
需要补充安全维度:
MQ 在 Agent 架构中的角色不只是事件总线,还是安全治理层。所有 Agent 工具调用通过 MQ 路由,可以在消费端做策略校验、审计日志和 blast radius 控制。这是 Agent 安全治理的工程化路径。
这意味着什么
**Agent 安全治理正在从”建议”变成”工程标准”**。UberConf 2026、Spring I/O 2026 都在推这个方向。预计 2026 下半年会出现标准化的 Agent 安全框架(类似 Spring Security 之于 Web 安全)。
“挣得自主权”模型会改变 Agent 设计。不再是一上来就给 Agent 所有权限,而是从 L0 开始,根据可靠性数据逐步放权。这需要一个”Agent 行为评分系统”——记录 Agent 在每个级别的成功率,作为是否升级的依据。
Policy-as-Code 会成为 Agent 工程的标配。就像 K8s 的 RBAC、Spring Security 的 SecurityConfig 一样,Agent 需要一个 PolicyConfig 来定义权限边界。
