NATS:使用 SPIRE Auth Callout 替换静态 CI 凭据 #56

Open
opened 2026-09-16 11:41:36 +00:00 by panxiao81 · 0 comments
Owner

背景

NATS 首期为 CI runner 提供 JetStream work queue,使用静态 Account 与客户端凭据。该方案足以长期运行,不阻塞 microVM runner 上线。

目标

在后续迭代中接入现有 SPIRE 与 OpenBao 基础设施,将长期静态客户端凭据替换为 workload identity:

  1. workload 获取 aud=nats 的 SPIFFE JWT-SVID;
  2. NATS Auth Callout 验证 JWT-SVID 的签名、audience 与 SPIFFE ID;
  3. 将 SPIFFE ID 映射到指定 NATS Account 和 subject 权限;
  4. Auth Callout 签发短期 NATS user JWT;
  5. NATS NKey seed 与 bootstrap 凭据由 OpenBao 托管;
  6. 使用 xkey 加密认证 callout 请求;
  7. Auth Callout 至少双副本,避免新连接认证出现单点故障。

权限映射草案

  • Gitea webhook producer:CI Account,仅允许发布 ci.runner.>
  • microVM worker:CI Account,仅允许消费 runner work queue 及发送必要 ACK;
  • 系统监控使用独立 SYS Account。

非目标

  • 不修改首期静态认证上线方案;
  • 不自行使用 OpenBao Transit 拼装 NATS JWT 签名格式;
  • 不影响已有 CI runner 可用性。

验收条件

  • 静态业务凭据可被撤销;
  • producer 与 worker 通过 SPIFFE 身份连接;
  • 不同 SPIFFE ID 获得最小化 subject 权限;
  • Auth Callout 故障、凭据泄漏与权限拒绝路径有测试和 runbook。
## 背景 NATS 首期为 CI runner 提供 JetStream work queue,使用静态 Account 与客户端凭据。该方案足以长期运行,不阻塞 microVM runner 上线。 ## 目标 在后续迭代中接入现有 SPIRE 与 OpenBao 基础设施,将长期静态客户端凭据替换为 workload identity: 1. workload 获取 `aud=nats` 的 SPIFFE JWT-SVID; 2. NATS Auth Callout 验证 JWT-SVID 的签名、audience 与 SPIFFE ID; 3. 将 SPIFFE ID 映射到指定 NATS Account 和 subject 权限; 4. Auth Callout 签发短期 NATS user JWT; 5. NATS NKey seed 与 bootstrap 凭据由 OpenBao 托管; 6. 使用 xkey 加密认证 callout 请求; 7. Auth Callout 至少双副本,避免新连接认证出现单点故障。 ## 权限映射草案 - Gitea webhook producer:`CI` Account,仅允许发布 `ci.runner.>`; - microVM worker:`CI` Account,仅允许消费 runner work queue 及发送必要 ACK; - 系统监控使用独立 `SYS` Account。 ## 非目标 - 不修改首期静态认证上线方案; - 不自行使用 OpenBao Transit 拼装 NATS JWT 签名格式; - 不影响已有 CI runner 可用性。 ## 验收条件 - 静态业务凭据可被撤销; - producer 与 worker 通过 SPIFFE 身份连接; - 不同 SPIFFE ID 获得最小化 subject 权限; - Auth Callout 故障、凭据泄漏与权限拒绝路径有测试和 runbook。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: panxiao81/homelab-infra#56