For the complete documentation index, see llms.txt. This page is also available as Markdown.

11.1 多密钥治理:认证档案、环境轮换与 auth order

多密钥治理最容易被写成一份“轮换手册”,但它首先是一个认证对象模型问题:谁定义候选密钥集合,谁决定默认选择,谁记录实际使用结果,以及这些信息如何落到不同智能体与不同环境上。只有先把这套对象关系讲清楚,后面的灰度、轮换和应急才不会沦为机械流程。

11.1.1 为什么多密钥治理不是单纯的运维动作

如果系统里只有一把 key,问题通常不只是“坏了就换”这么简单,还会同时引出三类工程风险:

  • 可用性风险:配额耗尽、供应商限流或单 key 被封禁时,全量失败。

  • 隔离性风险:开发流量、生产流量和高风险智能体共用同一凭据,爆炸半径过大。

  • 可审计风险:事故发生后,无法回答“哪条流量使用了哪把 key”。

因此,多密钥治理的目标不只是“多准备几把备用钥匙”,而是把候选集合、默认策略、实际选择和审计落盘四件事分开治理。

11.1.2 认证对象模型:auth profile、auth order、会话覆盖与 auth state

当前更稳妥的理解方式是:长期认证材料、默认选择策略和运行期选择状态已经分层。长期认证材料主要来自 auth-profiles.json 与必要时的 provider 配置;默认优先级由 auth.order 表达;单次对话或任务可通过 session-level auth profile override 临时固定认证档案;运行期冷却、轮换结果与禁用状态进入 auth-state.json。可以先用下面这张图理解它们的关系:

图 11-1:多密钥治理中的认证对象模型

各层分别负责不同的问题:

  • auth-profiles.json:定义“有哪些长期认证档案可被 agent 选择”。支持 SecretRef 的静态凭据字段可以引用密钥系统;OAuth profile material 属于运行期可变认证材料,不能当作普通 SecretRef 字段处理。

  • auth.order:定义“默认优先尝试哪些 profile / provider 路径”。

  • 会话 auth override:定义“本次会话是否临时固定某个 profile”,它不是 agents.entries.* 上的静态 agent override 字段。

  • auth-state.json:记录“谁在什么时候进入冷却、禁用或切到后备路径”。

官方文档与当前本地实现都把这两类文件分开:

  • auth-profiles.json:保存认证档案中的凭据材料或受支持静态凭据字段的 SecretRef 引用,本身应按敏感文件保护

  • auth-state.json:保存运行期冷却、禁用、路由选择等状态

这也是为什么本章不能只谈“配置写法”。如果不理解对象关系,就很难在事故后复盘“默认配置”和“实际运行”之间的差异。

11.1.3 多密钥隔离策略:按环境、按智能体、按供应商切分

多密钥最常见的误区,是把“多把 key”误当成“高可用”本身。真正决定治理质量的,是你按什么边界去切分。

1. 按环境切分

  • 开发、预发布、生产分别使用不同 key。

  • 目标是避免测试流量污染生产配额,也避免生产故障被开发环境的实验请求放大。

2. 按智能体切分

  • 高风险写操作智能体与低风险只读智能体使用不同 key。

  • 目标是把权限边界和凭据边界对齐,降低泄露后的爆炸半径。

3. 按供应商或计费域切分

  • 同一供应商下,不同项目、不同团队或不同计费账号分别配置。

  • 目标是便于成本归因、故障隔离与配额管理。

因此,多密钥治理的重点不是“配置里放几把 key”,而是让密钥边界和系统边界尽可能一致。

11.1.4 正常生命周期:生成、注入、验证、切换、吊销

从工程视角看,密钥轮换是正常生命周期的一部分,而不是临时运维技巧。生产环境里的最小安全流程如下:

图 11-2:多密钥轮换的正常生命周期

把这条生命周期拆开看:

  1. 生成与注入:新 key 先进入密钥系统或环境变量,不直接覆盖旧值。

  2. 验证:用 openclaw models status 确认认证档案状态,用 openclaw models status --probe 和 openclaw health --json 确认新 key 可用。

  3. 灰度切换:再调整 auth.order 或会话级 auth override,让默认流量逐步切换;不要把不存在的静态 agent auth override 当作配置入口。

  4. 吊销与归档:观察稳定后再撤销旧 key,并保留审计快照。

操作示例:

这里真正关键的是顺序:先新增、再验证、后切换、最后吊销。如果反过来做,就会引入脏窗口。

11.1.5 异常生命周期:泄露应急与失败模式

正常生命周期之外,最典型的异常分支就是密钥泄露。泄露后的应对动作不能只理解成“换 key”,而应理解为“从正常生命周期切换到异常响应路径”。

异常路径的核心步骤包括:

  1. 立即吊销:先在供应商侧阻断继续滥用。

  2. 识别影响范围:确认哪些 provider、哪些 agent、哪些外部系统受影响。

  3. 分级与指派 owner:按凭据权限、暴露范围和是否已被利用判断严重度,并指定响应负责人。

  4. 修复与验证发布:更新配置、轮换依赖凭据,运行 security audit、models status / --probe 和必要的渠道回归。

  5. 复盘与披露:记录时间线、根因、补救动作和后续防护;涉及用户或第三方时按项目安全流程协调披露。

  6. 并行轮换:对受影响路径执行新的正常生命周期。

  7. 加强隔离:必要时临时下调工具权限、加强沙箱和审计。

11.1.6 常见误区与验收要点

多密钥治理失败,通常不是因为“不会配置”,而是因为对象关系和生命周期被混在一起了。常见误区包括:

  • 把 key 明文写进配置文件或日志。

  • 直接覆盖旧值,不保留回滚路径。

  • 只改 auth.order 或会话级 auth override,不做 live 探针验证。

  • 把“候选密钥集合”和“实际运行选择 / 冷却状态”混为一谈。

验收时建议固定看三类证据:

  1. 配置证据:auth-profiles.json、auth.order 与会话级 auth override 是否符合预期。

  2. 探针证据:models status、models status --probe、health --json 是否正常。

  3. 运行证据:auth-state.json 与结构化日志是否能回答“谁在用哪条认证路径、是否进入冷却”。

只要把这三类证据都收齐,多密钥治理就不再只是一本运维说明单,而是一套可追溯、可切换、可复盘的认证治理机制。

最后更新于