首页/开发/CI/CD 与发布速查/CI 与云的 OIDC 联邦(免长期密钥)
环境与配置管理60 条

CI 与云的 OIDC 联邦(免长期密钥)

CI 平台签发带身份的短时令牌,云侧按信任策略换取临时凭据:仓库里不再存放云 Access Key。

CI/CD 与发布速查开发更新于 2026-10-13

OIDC 联邦是什么

OIDC 联邦让 CI 平台在运行时签发一枚带身份的短时令牌,云侧按预先配置的信任策略验证并换取临时凭据:仓库里不再存长期 Access Key,也就不存在密钥泄露后等轮换的窗口。信任策略可用仓库、分支、标签、环境等条件收窄,一枚令牌只在该条件下有效。与长期密钥对比:静态密钥泄露后面临漫长的轮换窗口;OIDC 令牌按需签发、分钟级有效,暴露窗口以作业时长为界。

基本信息

GitHubid-token: write + 云厂商官方登录 action(role-to-assume 等),信任策略限定 repo/分支/环境
GitLabid_tokens 声明受众(aud),作业中用 OIDC 换取云令牌
价值凭据短时、可条件化、无需轮换长期密钥
云侧配置角色信任策略:限定签发方(issuer)、受众(aud)与子条件(sub)

静态密钥与 OIDC 对比

维度静态密钥OIDC
生命周期长期有效,需人工轮换分钟级短时,自动过期
泄露影响持续可用直至吊销窗口以作业时长计
配置方式密钥分发与存储信任策略加运行时换取

典型使用场景

  • 生产部署取云凭据:作业按需换临时凭据,运行结束即失效
  • 跨云多账号:每个环境一个角色,信任条件分别收窄
  • 合规审计:不再分发长期密钥,暴露面显著变小
  • 组织禁用静态密钥后的标准替代路径
  • 私有化 GitLab 对接云:按 issuer 白名单接入
  • 审计粒度更细:每次换取都记录在云侧日志,可追溯到具体仓库与流水线

GitHub Actions 示例

GitHub Actions 示例
permissions:
  id-token: write   # 允许作业请求 OIDC 令牌
  contents: read
steps:
  - uses: aws-actions/configure-aws-credentials@v4
    with:
      role-to-assume: arn:aws:iam::111122223333:role/ci-deploy
      aws-region: cn-north-1
# 云侧信任条件示例(AWS):
# token.actions.githubusercontent.com:sub = repo:org/repo:ref:refs/heads/main
信任策略必须收窄:不加条件的信任等同于对全网开放该角色。
调试 OIDC 常见两类报错:aud 不匹配(受众没写进策略)与 sub 不匹配(分支/环境条件与触发方式不符),先比对两处再查云侧日志。

易错点

  • 信任条件只看仓库不看分支:任意 PR 都能扮演发布角色,加上分支或环境保护条件
  • 受众(aud)配置不校验:跨服务重放风险,按文档固定受众
  • 把 id-token: write 开给所有作业:不必要的作业也能取令牌,按作业最小化声明权限
  • 信任策略用通配仓库(repo:org/*):任一仓库被攻破即可换取生产角色,逐仓库显式列出
  • 忘记把 issuer 加进云侧信任白名单:私有化 GitLab 的令牌直接被拒绝,接入前先登记

数据来源与参考

  • GitHub Docs《About security hardening with OpenID Connect》
  • GitLab Docs《ID tokens》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌