OIDC 联邦是什么
OIDC 联邦让 CI 平台在运行时签发一枚带身份的短时令牌,云侧按预先配置的信任策略验证并换取临时凭据:仓库里不再存长期 Access Key,也就不存在密钥泄露后等轮换的窗口。信任策略可用仓库、分支、标签、环境等条件收窄,一枚令牌只在该条件下有效。与长期密钥对比:静态密钥泄露后面临漫长的轮换窗口;OIDC 令牌按需签发、分钟级有效,暴露窗口以作业时长为界。
基本信息
| GitHub | id-token: write + 云厂商官方登录 action(role-to-assume 等),信任策略限定 repo/分支/环境 |
|---|---|
| GitLab | id_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 不匹配(分支/环境条件与触发方式不符),先比对两处再查云侧日志。