目标
CI 里的每个静态凭证都是“到期问题”负债:泄漏前一直有效,轮换靠手工且扰民。OIDC 联邦把存储的密钥整个去掉:GitHub 为每个任务签发短时效令牌,云侧通过限定范围的联合策略信任你的仓库身份,产生的凭证一出生就在倒计时。没有可轮换的,也没有可泄漏的。
步骤要点
- workflow 顶部声明 permissions: id-token: write,deploy 任务挂 production 环境并用 configure-aws-credentials 的 role-to-assume。
- IAM 侧建 OIDC provider 并写信任策略:sub 精确匹配 repo:acme/app:environment:production,fork 与其他仓库一律拒绝。
- 部署任务里 aws sts get-caller-identity 验证身份是所扮演的角色、会话天生短时效。
- cutover 同一变更里 gh secret delete 掉旧的 AWS 密钥对,并把密钥清单清零作为完成标准。
- 从 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