被报告的模式
Agent 系统正越来越多地被部署来执行需要访问公司数据的任务:读取代码仓库、查询数据库、调用内部 API。在运维审查中反复出现的一个观察是:Agent 的运行终止后,其凭证仍然有效。Agent 已不再执行,但它使用的 token 或密钥仍然授予访问权限。这不是招聘或离职流程的问题。缺口在于任务完成与凭证过期之间。
在传统的人类工作流中,访问权限与个人角色绑定,并定期审查。在 Agent 工作流中,访问权限与任务绑定,但凭证的生命周期往往继承自静态密钥或长期存活的 service account。结果就是一类凭证的生命周期长于其被签发时所服务的工作。
为什么 TTL 是错误的原语
固定的 time-to-live 是对任务耗时的猜测。Agent 运行是突发性的:它们可能在几秒内完成,也可能因速率限制、人工审批或外部事件而暂停数分钟。一个短到足以对快速查询安全的 TTL,会在合法的长时间任务中途过期。一个长到足以覆盖最坏情况的 TTL,则留下一个过宽的不必要访问窗口。
带 checkpointing 的长时间运行 Agent 可以超出任何合理的 TTL。当 Agent 保存状态并在稍后恢复时,原始凭证可能已过期,从而触发续期。如果续期是自动的且不重新授权任务,凭证实际上被无限延长。TTL 沦为形式:一个未经审查即被续期的短期凭证,就是一个多了几步的永久凭证。
更深层的问题在于,TTL 衡量的是时间,而非权限。它们回答的是“多久?”,而不是“用于什么?”或“在谁的控制之下?”。一个十秒内完成任务的 Agent 和一个运行十小时的 Agent 收到的是同一类凭证,只是过期时间戳不同。
将权限绑定到运行

一个更稳健的模型将凭证绑定到运行标识符和声明的任务。编排器不是签发一个固定过期时间的 token,而是签发一个仅在运行处于活动状态时有效、且仅对任务规范中声明的操作有效的凭证。该凭证不是可在任何地方使用的 bearer token;它是限定于特定运行和特定操作集合的 capability。
编排器作为撤销权威
启动运行的编排器也应是有权撤销凭证的权威。当运行终止时——无论是完成、失败还是取消——编排器将该运行标记为非活动。任何携带该运行标识符的凭证都会被拒绝。这反转了默认逻辑:系统不再依赖过期,而是依赖存活状态。没有活动的运行,就没有有效的凭证。
恢复作为一次新的授权事件
当 Agent 从 checkpoint 恢复时,它启动的是一个全新的执行上下文。编排器应将其视为一次新的授权事件:重新评估任务,重新签发限定于恢复后运行的凭证,并要求与原始运行相同的策略检查。这防止 checkpoint 成为无限期访问的后门。代价是额外的延迟和复杂性:每次恢复都会产生一次授权往返,编排器必须维护哪些运行处于活动状态的状态。对于高频、短生命周期的 Agent,这一开销或许可以接受;对于延迟敏感的流水线,则可能需要对已知任务模式进行缓存或预授权。
具体机制:运行范围 token
一种实用的实现使用一个签名的 token,其中嵌入运行标识符、任务范围和编排器签名。该 token 被提交给策略执行点(PEP),后者检查两件事:签名有效,且运行标识符在编排器的状态存储中被标记为活动。PEP 不只依赖 token 的过期时间。如果编排器已将运行标记为终止,即使 token 的过期时间在未来,也会被拒绝。该机制要求编排器与 PEP 之间有一个共享状态存储,以及一条足够快的撤销路径以发挥作用。代价是对编排器可用性的依赖:如果状态存储不可达,PEP 必须决定是 fa
即使有了运行范围凭证,检测仍是必要的。审计日志应被埋点,以标记在签发运行终止之后仍被使用的凭证。如果凭证携带运行标识符,这是一个直接的查询:将凭证使用日志与运行生命周期日志进行 join,找出运行结束时间早于使用时间戳的使用事件。
第二个指标是最后一次 tool call 与凭证过期之间的间隔。在健康的系统中,对于已完成的运行,这个间隔应接近于零:凭证应在运行结束的那一刻失效。持续存在的间隔表明凭证的生命周期长于其运行,无论是通过续期、缓存还是撤销失败。随时间跟踪这一间隔可以暴露撤销路径中的回归。
第三个信号是未触发重新授权的恢复事件比率。如果 checkpoint 被用来在没有新授权事件的情况下延长访问,那就是一种策略违规,应在审计轨迹中可见。
运维现实
实现运行范围凭证和基于编排器的撤销并非没有成本。它需要改变 Agent 请求访问的方式、编排器跟踪运行状态的方式,以及策略执行点验证凭证的方式。它引入了对编排器存活状态的依赖,以及状态存储处潜在的瓶颈。对于已经拥有具备可靠状态管理的中央编排器的系统,这一变更是渐进的。对于 Agent 会派生 sub-agent 或跨多个编排器运行的系统,状态同步会变得更加复杂。
另一种选择——依赖 TTL 和定期审查——实现起来更简单,但留下了一个结构性缺口。这个缺口不在入职与离职之间;它在任务完成与凭证过期之间。弥合这一缺口,需要将凭证视为绑定到运行的 capability,而非带计时器的密钥。
参考资料
封面照片:panumas nikhomkhai / Pexels。
