跳转到主要内容

运行结束后的凭证留存:为什么 Agent 凭证的生命周期长于其任务

Agent 凭证常常在任务完成后依然有效。真正的缺口在于运行终止与凭证过期之间,而非入职与离职之间。

服务器机架的近景,带有闪烁的状态灯和网络线缆,象征凭证生命周期基础设施。

被报告的模式

Agent 系统正越来越多地被部署来执行需要访问公司数据的任务:读取代码仓库、查询数据库、调用内部 API。在运维审查中反复出现的一个观察是:Agent 的运行终止后,其凭证仍然有效。Agent 已不再执行,但它使用的 token 或密钥仍然授予访问权限。这不是招聘或离职流程的问题。缺口在于任务完成与凭证过期之间。

在传统的人类工作流中,访问权限与个人角色绑定,并定期审查。在 Agent 工作流中,访问权限与任务绑定,但凭证的生命周期往往继承自静态密钥或长期存活的 service account。结果就是一类凭证的生命周期长于其被签发时所服务的工作。

为什么 TTL 是错误的原语

固定的 time-to-live 是对任务耗时的猜测。Agent 运行是突发性的:它们可能在几秒内完成,也可能因速率限制、人工审批或外部事件而暂停数分钟。一个短到足以对快速查询安全的 TTL,会在合法的长时间任务中途过期。一个长到足以覆盖最坏情况的 TTL,则留下一个过宽的不必要访问窗口。

带 checkpointing 的长时间运行 Agent 可以超出任何合理的 TTL。当 Agent 保存状态并在稍后恢复时,原始凭证可能已过期,从而触发续期。如果续期是自动的且不重新授权任务,凭证实际上被无限延长。TTL 沦为形式:一个未经审查即被续期的短期凭证,就是一个多了几步的永久凭证。

更深层的问题在于,TTL 衡量的是时间,而非权限。它们回答的是“多久?”,而不是“用于什么?”或“在谁的控制之下?”。一个十秒内完成任务的 Agent 和一个运行十小时的 Agent 收到的是同一类凭证,只是过期时间戳不同。

将权限绑定到运行

Close-up of a cactus with sharp thorns against a blurred green background

一个更稳健的模型将凭证绑定到运行标识符和声明的任务。编排器不是签发一个固定过期时间的 token,而是签发一个仅在运行处于活动状态时有效、且仅对任务规范中声明的操作有效的凭证。该凭证不是可在任何地方使用的 bearer token;它是限定于特定运行和特定操作集合的 capability。

编排器作为撤销权威

启动运行的编排器也应是有权撤销凭证的权威。当运行终止时——无论是完成、失败还是取消——编排器将该运行标记为非活动。任何携带该运行标识符的凭证都会被拒绝。这反转了默认逻辑:系统不再依赖过期,而是依赖存活状态。没有活动的运行,就没有有效的凭证。

恢复作为一次新的授权事件

当 Agent 从 checkpoint 恢复时,它启动的是一个全新的执行上下文。编排器应将其视为一次新的授权事件:重新评估任务,重新签发限定于恢复后运行的凭证,并要求与原始运行相同的策略检查。这防止 checkpoint 成为无限期访问的后门。代价是额外的延迟和复杂性:每次恢复都会产生一次授权往返,编排器必须维护哪些运行处于活动状态的状态。对于高频、短生命周期的 Agent,这一开销或许可以接受;对于延迟敏感的流水线,则可能需要对已知任务模式进行缓存或预授权。

具体机制:运行范围 token

一种实用的实现使用一个签名的 token,其中嵌入运行标识符、任务范围和编排器签名。该 token 被提交给策略执行点(PEP),后者检查两件事:签名有效,且运行标识符在编排器的状态存储中被标记为活动。PEP 不只依赖 token 的过期时间。如果编排器已将运行标记为终止,即使 token 的过期时间在未来,也会被拒绝。该机制要求编排器与 PEP 之间有一个共享状态存储,以及一条足够快的撤销路径以发挥作用。代价是对编排器可用性的依赖:如果状态存储不可达,PEP 必须决定是 faPanoramic view of wind turbines in a grassy field under a clear blue sky

即使有了运行范围凭证,检测仍是必要的。审计日志应被埋点,以标记在签发运行终止之后仍被使用的凭证。如果凭证携带运行标识符,这是一个直接的查询:将凭证使用日志与运行生命周期日志进行 join,找出运行结束时间早于使用时间戳的使用事件。

第二个指标是最后一次 tool call 与凭证过期之间的间隔。在健康的系统中,对于已完成的运行,这个间隔应接近于零:凭证应在运行结束的那一刻失效。持续存在的间隔表明凭证的生命周期长于其运行,无论是通过续期、缓存还是撤销失败。随时间跟踪这一间隔可以暴露撤销路径中的回归。

第三个信号是未触发重新授权的恢复事件比率。如果 checkpoint 被用来在没有新授权事件的情况下延长访问,那就是一种策略违规,应在审计轨迹中可见。

运维现实

实现运行范围凭证和基于编排器的撤销并非没有成本。它需要改变 Agent 请求访问的方式、编排器跟踪运行状态的方式,以及策略执行点验证凭证的方式。它引入了对编排器存活状态的依赖,以及状态存储处潜在的瓶颈。对于已经拥有具备可靠状态管理的中央编排器的系统,这一变更是渐进的。对于 Agent 会派生 sub-agent 或跨多个编排器运行的系统,状态同步会变得更加复杂。

另一种选择——依赖 TTL 和定期审查——实现起来更简单,但留下了一个结构性缺口。这个缺口不在入职与离职之间;它在任务完成与凭证过期之间。弥合这一缺口,需要将凭证视为绑定到运行的 capability,而非带计时器的密钥。

参考资料

封面照片:panumas nikhomkhai / Pexels。

分享XLinkedIn永久链接5 分钟阅读

相关阅读

这能回答的问题

Why do agent credentials outlive their task?

Credentials are often issued with fixed TTLs or inherited from static service accounts. The credential's expiry is not tied to the run's termination, so it remains valid after the agent stops executing.

What is the alternative to TTL-based expiry for agent credentials?

Bind credentials to a run identifier and declared task scope. The orchestrator marks the run active or inactive, and policy enforcement points reject credentials for inactive runs, regardless of expiry.

How should resume-from-checkpoint be handled?

Treat resume as a new authorisation event: re-evaluate the task, re-issue a run-scoped credential, and require the same policy checks as the original run.

What should be monitored to detect credentials outliving their runs?

Audit for credential usage after the issuing run has terminated, track the gap between last tool call and credential expiry, and monitor resume events that do not trigger re-authorisation.