使用 OIDC 在 GitHub Actions 中保护您的 AWS 凭证
Source: Dev.to

GitHub Actions
有没有想过如何加强 GitHub Actions 中 AWS 凭证的安全性(即让 GitHub 仓库执行 CI/CD 的工作流/管道)?
大多数教程会先创建一个拥有编程密钥的 IAM 用户,并告诉你要安全地存储这些密钥(绝不要将它们暴露在公共互联网)。在 GitHub Actions 中,你通常会将 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 添加到仓库的 Secrets 部分。
这 并没有 为你提供最佳的安全性。还有一种更好的方法,可以完全消除对长期静态凭证的需求。
AWS 凭证必须保密
如果凭证泄露,攻击者可以利用附加在该身份上的权限造成严重破坏。因此,在设计 IAM 用户/角色时,遵循最小权限原则至关重要。
AWS IAM 身份提供者 (OIDC)
当调用 AWS 服务的客户端支持 OIDC v2 时,您可以将短期令牌兑换为 AWS 会话令牌。这使您能够:
- 从 GitHub Secrets 中消除静态的
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY。 - 通过 OIDC 令牌承担 IAM 角色,仅授予特定工作流所需的权限。
Step‑by‑step
1. 创建 AWS IAM OIDC 身份提供商
使用 AWS CLI
aws iam create-open-id-connect-provider \
--url https://token.actions.githubusercontent.com \
--client-id-list sts.amazonaws.com
或通过 AWS 控制台
- 打开 IAM → Identity providers → Add provider。
- 选择 OIDC。
- 将 Provider URL 设置为
https://token.actions.githubusercontent.com。 - 将 Audience 设置为
sts.amazonaws.com。

2. 创建信任该 OIDC 提供商的 IAM 角色
使用以下 信任策略(将占位符替换为您自己的值):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam:::oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
"token.actions.githubusercontent.com:sub": "repo:/:ref:refs/heads/"
}
}
}
]
}
将 AWS_ACCOUNT_ID、GITHUB_ORG、GITHUB_REPOSITORY 和 “ 替换为您环境中的相应值。
为角色附加所需的权限策略(例如 AmazonS3ReadOnlyAccess、自定义策略等)。
3. 配置 GitHub Actions 工作流
为工作流授予请求 OIDC 令牌的权限,然后假设您刚创建的角色。
# .github/workflows/deploy.yml
name: Deploy to AWS
# 请求 OIDC ID 令牌
permissions:
id-token: write # OIDC 所必需
contents: read # (可选)用于 checkout 等
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: arn:aws:iam:::role/
aws-region:
- name: Verify identity
run: aws sts get-caller-identity
关键要点
permissions.id-token: write使工作流能够从 GitHub 获取短期 OIDC 令牌。aws-actions/configure-aws-credentials会自动使用您指定的角色,将该令牌交换为临时的 AWS 凭证。
完成上述操作后,不要在 GitHub Secrets 中存储任何 AWS 访问密钥——工作流将使用 OIDC 令牌提供的短期凭证。
结论
本指南与官方 aws-actions 文档相同,但展示了如何:
- 在 AWS 中设置 OIDC 身份提供者。
- 创建一个信任 GitHub OIDC 令牌的角色。
- 配置 GitHub Actions 工作流,以在没有任何静态 AWS 密钥的情况下承担该角色。
采用此模式后,您可以:
- 从仓库中移除长期有效的凭证。
- 减少攻击面(令牌在几分钟后即过期)。
- 简化密钥轮换——无需手动轮换。
实现基于 OIDC 的身份验证是一种简便的方法,可在几乎不影响性能的情况下提升您的安全姿态。
祝编码愉快! 🎉
