← 中文资源

简体中文版本

用 GitHub Actions OIDC 免长期密钥部署

用 OIDC 联合取代存储的云凭证,把信任策略收敛到仓库与环境,并验证不再残留任何密钥。

阅读英文原文

目标

CI 里的每个静态凭证都是“到期问题”负债:泄漏前一直有效,轮换靠手工且扰民。OIDC 联邦把存储的密钥整个去掉:GitHub 为每个任务签发短时效令牌,云侧通过限定范围的联合策略信任你的仓库身份,产生的凭证一出生就在倒计时。没有可轮换的,也没有可泄漏的。

步骤要点

  1. workflow 顶部声明 permissions: id-token: write,deploy 任务挂 production 环境并用 configure-aws-credentials 的 role-to-assume。
  2. IAM 侧建 OIDC provider 并写信任策略:sub 精确匹配 repo:acme/app:environment:production,fork 与其他仓库一律拒绝。
  3. 部署任务里 aws sts get-caller-identity 验证身份是所扮演的角色、会话天生短时效。
  4. cutover 同一变更里 gh secret delete 掉旧的 AWS 密钥对,并把密钥清单清零作为完成标准。
  5. 从 fork 发 PR 触发部署任务,确认在信任边界处 403,边界真的关得住。

排错提示

AssumeRoleWithWebIdentity 未授权多半是 sub 条件与实际 workflow 路径不符,先在调试步骤打印令牌 claims 再精确对齐;OIDC 端点 403 是缺 id-token: write 权限或环境保护规则没配;按环境隔离就一个环境一个角色,把环境名写进 sub 条件,staging 工作流永远碰不到生产信任。

适用边界

OIDC 去掉的是静态密钥而不是授权失误,角色权限仍要像审静态密钥一样严;信任策略的字符串匹配对 workflow 改名很脆,要对扮演失败做告警捕捉漂移。

代码示例

permissions:
  id-token: write
  contents: read

steps:
  - uses: aws-actions/configure-aws-credentials@v4
    with:
      role-to-assume: arn:aws:iam::123456789012:role/gha-deploy
      aws-region: eu-central-1