凭据有效期

A42
概念 · 智能体 AI 详解

凭据有效期。

一份凭据一旦被从机器上复制走,它身上只剩一个属性还由你说了算,而那个属性不是作用域——而是「这东西还能用多久」。这正是你引以为豪的那个短命访问令牌通常什么也没买到的原因:在人们真正跑着的智能体工具里,那个短命令牌与一个有效期长达数周的刷新令牌躺在同一个文件里,而刷新就是「无需重新认证的续期」。该量的那个数字不是你令牌的 TTL,而是「有人拿走了它」与「它不再生效了」之间那段挂钟时间。

STEP 1

有效期是复制发生之后唯一还在起作用的控制。

把一套常规凭据设计里的控制逐条过一遍,问问哪些能活过一次复制。作用域能活下来——意思是它仍然在给损害划界,但它在被盗之前也在划同一条界,而且它一点没变。受众限定、mTLS 绑定与鉴证是几个有意思的例外,而在开发者工作站上几乎没人有这些。其余的一切——签发这枚令牌的那次批准、为它提供理由的那条策略、为它背书的那次评审——都发生在复制之前,此后不再产生任何效果。

  • 有效期是唯一一项里面带着钟表的条款。其他每项控制都只在签发那一刻被求值一次。有效期会被反复求值,由别人的基础设施来求值,只要这份凭据还活着就一直求。
  • 它是把一次入侵换算成一段区间的那一项。「攻击者拿到了我们智能体的凭据」是一句无法作答的话。「攻击者持有它十九分钟,而以下是十九分钟内能触达的东西」才是一份事故报告。
  • 它同时也是你最可能是「顺手」设定下来的那一项。作用域会在评审里被争论。有效期通常就是 SDK 的默认值,而此后再没人看过它一眼。

这是爆炸半径那套论证在「单份凭据」尺度上的版本。爆炸半径问的是一次失陷能伸多远;有效期问的是它能一直伸多久。把两者相乘,你才拿到真实的暴露量——而各团队常常把前者缩小十倍,却把后者留在三十天。

STEP 2

访问令牌旁边那枚刷新令牌,决定了真正的有效期。

标准做法是:一个有效期以分钟到一小时计的访问令牌,外加一枚能在用户不再出面的情况下铸出新令牌的刷新令牌。两半各自都站得住。而当它们作为一对、存在同一个文件里时,这一对的有效期就是刷新令牌的有效期——任何同时握着两者的人,都能把短命的那一半永久地保鲜下去。此时访问令牌的 TTL 已经不再是一项安全属性,而变成了一项延迟属性。

这道算术可以直接从一款在售产品上读出来。Anthropic 的 Claude Code 在 Linux 上把登录态存在 ~/.claude/.credentials.json、权限位为 0600;而 2026 年 9 月针对该项目提交的一份报告记录道,这个文件里放着一个在用的访问令牌,旁边还有一枚有效期二十七天的刷新令牌。一小时的访问令牌,二十七天的暴露窗口,两者之差只是多了一个 JSON 键。按这个领域的标准看,这里没有任何反常或草率之处——而这正是要点所在。这就是常态的形状。

  • 永远去问「这一对」值多少,而不是「这枚令牌」值多少。设计评审里该问的是「如果这个目录被整份复制走,这份副本能用多久」,而不是「我们的 TTL 是多少」。
  • 不重新认证的刷新,就是不作决定的续期。如果刷新过程中没有人、没有设备校验、也没有鉴证参与,那么这条回路里就没有任何环节能注意到「续期的人换了」。
  • 权限位不是有效期控制,也算不上多强的访问控制。0600 挡的是同一台主机上的另一个用户。窃取凭据的恶意软件是以你的身份在跑——见端点上的智能体工件。
  • 如果你能绑定任何东西,就把刷新绑上。设备绑定或发送方受限的刷新,是唯一能让一份被复制的凭据对不再完全可移植的改动;具体机制见智能体身份与鉴证。
STEP 3

短有效期不是免费的,而这笔账会落到几个确定的地方。

凭据活得长,原因并不是没人想过这件事,而是每一次有效期的缩短都有人在为它付钱,而那三笔账是可预测的。装作不是这样,就会得到那个熟悉的结局:某个团队强推一小时令牌,发现了代价,然后悄悄签发一个永不过期的服务账号。

  • 重新认证的摩擦。交互式登录最终落在一个人身上。如果你的轮换周期比这个人的注意力跨度还短,他们就会绕过你去做自动化,通常的做法是把一枚长命密钥粘到环境变量里。
  • 故障被放大。短有效期会把签发方变成每一次运行的硬依赖。如果令牌服务宕了二十分钟、而你的令牌只活五分钟,那你的智能体也一起宕。这是一个失败即拦截的取舍,而它往往是对的那个——但请有意识地选它。
  • 长时间运行的工作。一次活得比自己凭据还久的智能体运行,会在中途失败,而中途是最糟的位置,因为副作用只应用了一半。这正是为什么截止期预算与凭据有效期必须当成一个数字来设计,而不是两个。

出路是别再把有效期当成一项全局设置。为一次任务铸出的凭据,有效期取该任务的截止期再加一点余量,在摩擦上不花钱,因为回路里没有人;在故障放大上也不花钱,因为它是在一次运行开始时取一次,而不是在整个过程中不断刷新。

STEP 4

去量「撤销耗时」,因为那才是别人会向你索要的数字。

有效期有一个孪生兄弟,而多数团队从没给它计过时:撤销。一枚三十天的令牌,配一条你两分钟就能走完的撤销路径,是比一枚你根本杀不掉的一小时令牌更好的凭据——而后一种情况很常见,因为无状态的持有者令牌按构造就是「有效到过期为止」,根本没有一张能把它加进去的名单。

  • 拿秒表把演练跑一次。挑一份真实的智能体凭据,撤销它,并记录下一次使用它的调用究竟在什么时刻失败。多数团队会学到两件事:他们原先不知道谁有权执行这次撤销,而效果也并非立即生效。
  • 搞清楚你的哪些令牌压根可撤销。可内省的令牌或引用型令牌能被集中杀掉。自包含的 JWT 不能,除非你建了一张拒绝名单、而每一个校验方都真的去查它。请按凭据类型把这张清单写下来。
  • 数清你需要杀掉几份副本。一份智能体凭据常常同时存在于一个密钥库、一套 CI 环境、两台开发笔记本和一条链路记录里。漏掉一份副本的撤销不叫撤销;智能体凭据的访问复核讲的就是如何让这张清单保持诚实。
  • 把撤销的触发器放在检测旁边。一个呼人的探测器,会把人的响应时间加进你的暴露窗口。如果该发现毫不含糊——一次蜜标被碰、一枚令牌从一个新地区被使用——就把它直接接到撤销调用上。

按顺序做这三件事。第一,为你权限最高的那份智能体凭据,写下那一对的有效期,而不是访问令牌的有效期——如果里面有刷新令牌,那才是你真实的数字,而它大概是以周计的。第二,拿秒表给一次撤销计时,并记下是谁执行的。第三,把这份凭据的签发改成按次运行、有效期从该次运行的截止期推出来。前两件花掉一个下午,并且会改变你的优先级排序;第三件才是真正的修复。

延伸:环境权限讲的是这份凭据为何无人过问就能被取到,面向智能体的受限作用域凭据讲的是同一个对象的另一根轴,而配置即侦察讲的是攻击者还能从那个放着凭据的文件里拿到什么。