Files
qinglong/docs/operations/ql3-worker-credential-management-ca-rollover.md
T

6.8 KiB
Raw Blame History

QingLong 3.0 Worker 管理客户端 CA 轮换

本流程只适用于 Cluster Profile 的 Worker credential management 客户端信任根。它不轮换服务端证书, 不改变 Worker-purpose OIDC、Project Policy 或双人审批,也不允许用客户端证书替代 User authority。

固定边界

  • ca.crt 必须是严格 UTF-8,只含 1–16 张唯一、当前有效且 Basic Constraints 为 CA 的 PEM 证书;
  • client.crl 必须只含 1–16 份唯一、OpenSSL 可加载的 PEM CRL;生产 PKI operator 必须为 overlap 中每个 issuer 发布当前 CRL,并在真实请求门中分别验证;
  • 两个文件都只在新进程启动时读取。禁止原地 watcher、动态 TLS context、第二 listener 或 sidecar
  • 每一阶段都必须同时计算 CA/CRL 原始 bundle 的 SHA-256,更新 Pod-template 两个摘要注解,并完成 maxUnavailable=0 rollout;只更新 Secret 而不推进 Deployment generation 不算生效;
  • 证据 collector 保持只读,PKI/Deployment operator 才能更新 Secret 和 Deployment。

阶段 1old

  1. 盘点全部仍可能调用管理面的 old client identity,并确认 old CRL 当前有效;
  2. Secret 只投影 old CA 与 old CRL;摘要注解分别绑定这两个文件;
  3. 完整 rollout 后,从两个新 Pod 分别证明 old client 业务请求 200,未知 CA 请求 401,健康探针无证书 200;
  4. 保存 Deployment generation、Secret revision、Pod 世代与低敏请求结果,不保存私钥、JWT 或 Secret 内容。

阶段 2overlap

  1. 在外部 PKI 中签发 new CA 和 new client identity;先分发 new client 私钥,后扩大服务端 trust;
  2. ca.crt 精确变为 old CA + new CAclient.crl 同时包含 old/new issuer 的当前 CRL
  3. 更新两个 bundle 摘要注解并完成完整 rollout,确认旧 Pod 全部退役;
  4. 在每个新 Pod 上分别证明 old client 200、new client 200、未知 CA 401;继续运行 D-229 身份、D-230 durable audit 与 D-232 CRL 证据所需的 inspect 检查;
  5. 只有所有合法 caller 都已观测 new client 成功,且 overlap 达到组织规定的最小传播窗口,才允许退休 old。

阶段 3new

  1. 停止签发 old CA,吊销或禁用残留 old identity,并先发布最终 old CRL
  2. ca.crt 精确收敛为 new CAclient.crl 收敛为 new issuer 的当前 CRL
  3. 更新两个摘要注解并完成完整 rollout,确认 overlap Pod 全部退役;
  4. 在每个新 Pod 上证明 old client 401 client_certificate_required、new client 200、健康探针 200
  5. 保留 old CA/CRL 与变更证据到审计保留期结束,但不得再把 old CA 加回运行时 trust。

D-234 三阶段证据命令

三个阶段必须由同一只读 collector、同一外部 OIDC operator subject、同一 endpoint/server trust 和同一 worker-credential.inspect command 采集。--client-ca-bundle 是服务端用来验证客户端证书的 CA 集合;client config 内的 caFile 是客户端用来验证管理 API 服务端证书的 trust bundle,两者互相独立,不要求同一 issuer。

所有输入都必须是 canonical absolute path。assertion、client config、private key、Kubeconfig 和阶段/最终报告使用 owner-private 文件;输出路径必须尚不存在,runner 以 0600 no-replace 创建。先在阶段 1 执行:

QL3_WORKER_CREDENTIAL_MANAGEMENT_CA_ROLLOVER_EVIDENCE=1 \
pnpm evidence:worker-management-ca-rollover:ql3 -- \
  --phase=old \
  --old-config=/secure/ql3/old-client.json \
  --new-config=/secure/ql3/new-client.json \
  --assertion=/secure/ql3/operator.jwt \
  --command=/secure/ql3/inspect-command.json \
  --kubernetes=/secure/ql3/evidence.kubeconfig \
  --client-ca-bundle=/secure/ql3/old-client-ca.pem \
  --client-crl-bundle=/secure/ql3/old-client-crl.pem \
  --output=/secure/ql3/old-state.json

完成 exact old+new rollout 后执行阶段 2--previous 摘要绑定 old-state,不能复制或改写其 JSON:

QL3_WORKER_CREDENTIAL_MANAGEMENT_CA_ROLLOVER_EVIDENCE=1 \
pnpm evidence:worker-management-ca-rollover:ql3 -- \
  --phase=overlap \
  --old-config=/secure/ql3/old-client.json \
  --new-config=/secure/ql3/new-client.json \
  --assertion=/secure/ql3/operator.jwt \
  --command=/secure/ql3/inspect-command.json \
  --kubernetes=/secure/ql3/evidence.kubeconfig \
  --client-ca-bundle=/secure/ql3/overlap-client-ca.pem \
  --client-crl-bundle=/secure/ql3/overlap-client-crl.pem \
  --previous=/secure/ql3/old-state.json \
  --output=/secure/ql3/overlap-state.json

完成 new-only rollout 后执行阶段 3。D-229 ceremony 与 D-230 durable audit 报告必须来自本次受审变更,durable report 必须已经摘要绑定 ceremony report

QL3_WORKER_CREDENTIAL_MANAGEMENT_CA_ROLLOVER_EVIDENCE=1 \
pnpm evidence:worker-management-ca-rollover:ql3 -- \
  --phase=new \
  --old-config=/secure/ql3/old-client.json \
  --new-config=/secure/ql3/new-client.json \
  --assertion=/secure/ql3/operator.jwt \
  --command=/secure/ql3/inspect-command.json \
  --kubernetes=/secure/ql3/evidence.kubeconfig \
  --client-ca-bundle=/secure/ql3/new-client-ca.pem \
  --client-crl-bundle=/secure/ql3/new-client-crl.pem \
  --old=/secure/ql3/old-state.json \
  --previous=/secure/ql3/overlap-state.json \
  --ceremony-report=/secure/ql3/live-ceremony.json \
  --durable-audit-report=/secure/ql3/durable-audit.json \
  --output=/secure/ql3/ca-rollover-evidence.json

最终报告必须再由不需要集群凭据的离线门重判:

pnpm audit:worker-management-ca-rollover:ql3 -- \
  --report=/secure/ql3/ca-rollover-evidence.json

兼容输出必须同时包含 "compatible":true,最终报告的 gates.passed 必须为 true。D-232 同 CA 单证书 CRL 吊销证据仍可按组织策略独立运行,但不是把 old/new 两个 CA 合并成同 issuer 的前置条件。

失败与回退

  • 新 Pod 因 PEM、有效期、CA 用途、重复或 CRL 解析失败而不能 Ready:停止 rollout,保留仍 Ready 的旧 Pod 修复候选 bundle 后推进新的 generation
  • overlap 中 new client 失败:保持 old+new,不得退休 old;检查 client key/certificate、EKU、issuer CRL 与 NetworkPolicy,修复后重新完整 rollout
  • new-only 阶段出现未迁移 caller:只能经新的受审变更回到 exact overlap,并重新计算两个摘要、完整 rollout; 禁止只重启单 Pod或把旧 CA 临时塞入某个副本;
  • 紧急 old CA compromise 时可缩短 overlap,但仍必须先使 new client 可用、发布 CRL、推进完整 generation 并运行 D-232 的旧证书拒绝证据。可用性压力不能把未知结果解释成成功退休。

该流程不增加 workspace package、第三方依赖、migration、controller、timer、watcher、listener、Pool 或连接; Edge、Standalone 与 Worker Profile 不装配该能力,低配部署没有稳态成本。