别信你的代理。信任你的边界:用于 LLM 工具调用的运行时授权层。
如果你的“代理”能做任何真实的事情,比如发放退款、修改生产数据、更新基础设施或给客户发电子邮件,你就越过了一条界限。困难之处不再是模型是否能建议正确的操作。困难之处是你是否能证明在高风险操作执行之前该操作已被授权。代码:https://github.com/lemnk/Sudo-agent
这就是有代理系统中的信任缺口:
- 模型的推理是概率性的。
- 副作用是确定性的且不可逆的。
大多数团队试图通过提示约束、临时允许列表或在代理需要执行多项任务时就会被过度授权的 IAM 角色来弥合这一差距。这些工具有帮助,但它们无法为“意图”和“执行”之间提供一个单一、严格且可审计的边界。
SudoAgent 的使命刻意设定得很窄:为工具和函数调用提供一个运行时授权层,采用确定性控制和可证明的可问责性,通过执行以下规则:
除非能够证明合规性,否则不得执行此动作。

为什么“记录日志”还不够
安全团队已经在记录日志。但大多数日志是可变的操作性工件,而非证据。
如果你依赖普通的应用日志或数据库审计表,你就隐式地信任了写入它们的机器。如果主机被攻破,有决心的攻击者通常可以在事后更改或删除这些记录。
安全研究几十年来一直把这视为核心问题:如何在不受信任的机器上保存审计记录,同时使对过去条目的篡改在不被发现的情况下变得困难。Schneier 和 Kelsey 关于安全审计日志的经典工作直接阐明了这一点:一旦写入,应该使先前的日志条目不可能被未被发现地修改或销毁。(schneier.com)
所以 SudoAgent 将证据视为一等工件:
- 在执行之前写入决策记录(失败则封闭)
- 在执行之后写入结果记录(尽力而为)
- 使分类账抗篡改(哈希链 + 规范化)
- 可选择添加签名以证明真实性
这也在方向上与监管与治理的发展保持一致。欧盟人工智能法明确要求高风险人工智能系统支持事件的自动记录(日志),并在适当期限内保存日志(第 19 条的摘要至少为六个月)。(ai-act-service-desk.ec.europa.eu)
NIST 的 AI 风险管理框架是自愿性的,但它为可信 AI 风险管理和在治理职能中的操作化建立了共同语言。(nist.gov)
核心思想:确定性的边界
SudoAgent 不是一个代理框架。它不会编排多步骤计划、对工具进行排序或“让代理更聪明”。它围绕着最后一个关键步骤设定边界:会导致副作用的调用。
在运行时,对于每个工具/函数调用,SudoAgent 会执行:
- 首先进行脱敏处理
从脱敏后的 args/kwargs 构建上下文(以避免秘密泄露并保持可共享的证据安全)。
2 确定性策略决策
一个策略返回以下之一:
. 允许
- 拒绝
- REQUIRE_APPROVAL
3 可选批准
如果需要批准,SudoAgent 会同步暂停直到被批准/拒绝。批准可以是交互式的(开发者)或被注入的(Slack/UI/HTTP)。批准通过哈希绑定到具体决策。
4.(可选)预算
速率/花费限制采用失败关闭原则。如果无法安全评估预算,则拒绝。
5. 决策依据(失败关闭)
在执行之前将决策条目写入防篡改账本。如果此步骤失败,则该操作不会执行。
6. 执行
7. 结果证据(尽力而为)
在执行后写入一条结果条目;失败不会改变函数的返回结果/异常。
这是一个治理管道,不是提示管道
以代码形式的政策是必要的但不充分
像 Open Policy Agent (OPA) 这样的策略引擎之所以存在,是因为策略太重要,不能埋在应用业务逻辑里。OPA 的 Rego 专为对结构化数据进行策略评估而生。(openpolicyagent.org)
同样,AWS 将 Cedar 开源,聚焦高保障,包括对正确性属性的形式建模与证明。(aws.amazon.com)
SudoAgent 与这种世界观兼容,但目标在不同的层次:
- OPA/Cedar 的回答是:“这应该被允许吗?”
- SudoAgent 回答:“我们能证明允许/拒绝的过程发生在执行之前吗?我们能在事后验证这些证据吗?”
“事后”很重要。审计和事件响应是你系统的下游使用者,他们需要的不止是“相信我”。证据模型:防篡改(可察觉篡改)的分类账本
SudoAgent 的 v2 分类账本是一个仅追加的规范 JSON 对象链:
- 每条条目都包含 entry_hash。
- 每条记录还包含 prev_entry_hash。
- 如果有人修改、删除、插入或重新排序记录,验证将失败。
这与透明日志(例如 Certificate Transparency)背后的思想是一脉相承的:面向公开审计的追加式数据结构。(datatracker.ietf.org)
SudoAgent 使用直接的哈希链(不是默克尔树),因为 v2 优化了:
- 简单性
- 可检查性
- 正确性
- 单主机部署
账本可随时使用 sudoagent verify 进行验证,该命令会检查:
- 规范的 JSON 结构
- 模式/账本 版本
- 哈希链的连续性
- 决策/结果参考完整性
- 可选签名有效性
示例操作:高额退款
设想这条规则:“超过500美元的退款需要批准。”
用 SudoAgent 的术语来表述:
- 策略只看到已遮蔽的上下文
- 如果金额 > 500,要求审批
- 审批仅适用于这一具体决策
- 决策记录在退款执行之前就已写入
简化的账本决策条目如下所示:
{
“schema_version”: “2.0”,
“ledger_version”: “2.0”,
“created_at”: “2026-01-26T10:00:00.000000Z”,
“event”: “decision”,
“request_id”: “req-123”,
“action”: “payments.refund_user”,
“agent_id”: “payments:refund-bot:prod-01”,
“decision”: {
“effect”: “allow”,
“reason”: “批准通过”,
“reason_code”: “POLICY_REQUIRE_APPROVAL_HIGH_VALUE”,
“policy_id”: “RefundPolicy:v2”,
“policy_hash”: “…”,
“decision_hash”: “…”
},
“approval”:{
“binding”:{
“request_id”:“req-123”,
“policy_hash”:“…”,
“decision_hash”:“…”
},
“approved”:true,
“approver_id”:“alice@example.com”
},
“prev_entry_hash”:“…”
“entry_hash”: “…”
}
然后该结果条目会引用相同的 decision_hash 和 request_id。如果有人试图将某个结果“混合搭配”到不同的决策中,核实将失败。
这是关键的安全属性:批准不是“批准退款”。而是“批准此退款,按这些被编辑过的参数并依据此政策哈希。”
性能:它会增加多少延迟?
SudoAgent 会增加可测量的延迟,因为它会把持久化证据(决策 + 结果)写入磁盘。
在带有本地 SSD 的 Windows 开发机上(通过小型基准测试测量):
- JSONL 日志:约 45 毫秒 p50,约 73 毫秒 p95
- SQLite WAL 分类账:p50 约 39 毫秒,p95 约 60 毫秒
- 审批路径(自动批准):p50 约 47 毫秒,p95 约 86 毫秒
这是预期内的:每次受保护调用都会执行两次持久化写入并进行哈希链。
如果你在保护高风险动作(如退款或基础设施变更),这种权衡通常是可以接受的。如果你需要极低延迟,不要为每一个小的工具调用都加护盾。保护发生副作用的边界,并使用政策对低风险操作进行自动允许。
实用调节项:
- 在多进程场景下优先使用 SQLite 的 WAL 模式,通常比 JSONL 延迟更低。
- 将账本保存在快速本地磁盘上(避免网络文件系统)。
- 除非需要真实性证明,否则禁用签名。
- 对较少但风险更高的操作进行防护,而不是防护所有操作。
采用指南:快速实现价值
1) 决定什么是“高风险”
防护可能造成不可逆伤害的操作:
- 资金流动
- 生产写入
- 破坏性命令
- 顾客沟通
不要一开始就保护“所有东西”。先保护重要的边界。
2)选择 agent_id 约定
让 agent_id 稳定且可被人类解析。一个好的默认格式:
- team:service:instance
- 示例:payments:refund-bot:prod-01,support:triage:staging
这在审计、仪表盘和事件响应中带来回报。
3)有意对你的策略进行版本管理
在 policy_id 中包含版本号
- good: RefundPolicy:v2
- ambiguous: RefundPolicy
历史证据仍然有效,因为账本在决策时存储了 policy_id 和 policy_hash。
4) 选择一个账本后端
- JSONL 分类账:简单、可检查、单写入者
- SQLite WAL 分类账:更适合同一主机上的多进程;便于查询
5) 将审批视为集成边界
v2 审批在设计上为同步。在生产环境中,大多数团队采用以下方案之一:
- Slack 批准者(Webhook + 超时)
- HTTP 批准服务(超时 + 审计)
- UI 批准者(内部工具)
超时是批准者需要关注的问题:
- 如果审批超时,则拒绝并记录
- 代理稍后使用新的 request_id 重试
6) 将核实落地为可操作流程
核实不仅仅是开发工具。把它当作健康检查来对待:
- 在附表上运行 sudoagent verify
- 在失败时发出警报
- 在事件期间导出/筛选/搜索分类账条目
7) 了解 SudoAgent 无法保护的内容
SudoAgent 不是沙箱,也不阻止受保护函数内部的副作用。它保护治理和证据完整性——而非主机不被攻破。
为什么这是正确的原语
核心做法很简单,而且这是正确的抽象:
别再试图“信任代理”。信任一个带有可验证证据的确定性边界。
结果是一个可以用证据回答棘手问题的系统:
- “为什么会发生这笔退款?”
- “依据的是哪个政策版本?”
- “谁批准的?”
- “我们能检测到审计追踪被篡改吗?”
- “我们能导出用于合规的收据吗?”
这就是“我们记录了它”和“我们能证明它”之间的区别。
仓库与问题:lemnk/Sudo-agent: 运行时中针对 AI 代理操作的防护措施:策略、审批、审计日志。· PyPI:https://pypi.org/project/sudoagent/
参考文献(节选)
- 欧盟人工智能法案(法规(EU)2024/1689):记录保存与日志保留摘要(第 12 条和第 19 条)。(ai-act-service-desk.ec.europa.eu)
- NIST AI RMF 1.0 与操作手册(值得信赖的人工智能风险管理)。(nist.gov)
- Schneier & Kelsey(1999):在不受信任的机器上将安全审计日志作为篡改可见记录。(schneier.com)
- 证书透明性(RFC 6962)与 CT 说明:仅追加的透明日志与可审计性。(datatracker.ietf.org)
- Open Policy Agent(Rego):为结构化授权决策设计的策略语言。(openpolicyagent.org)
- AWS Cedar:强调形式建模的开源策略语言。(aws.amazon.com)