在Github Actions中使用OIDC配置AWS登录凭证
· 约 1 分钟阅读
在Github Actions与AWS的服务交互时,下面是两种认证鉴权的直观方式:
- 在AWS IAM中创建用户,授予给用户相应的权限。然后在AWS Console中创建该用户登录凭证,拿到
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY,之后在使用AWS服务前,设置这两个环境变量即可。 - 在AWS IAM中创建角色,授予给角色相应的权限。然后再创建用户,允许用户能够“代入”(Assume)这个角色,这样用户即可拥有相应的权限。同样地,在AWS Console中创建该用户的登录凭证,拿到
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。当使用AWS服务时,先设置这两个环境变量,然后代入角色,才能才能与AWS服务交互。这种方式的好处在于将权限配置在角色上,即“基于角色的访问控制”(Role Based Access Control,RBAC)。可以允许多个用户代入角色。
当使用以上两种方法时,还需要将在Github Actions的secrets中设置AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY。
以上的流程需要进行手动配置,略有一些麻烦,而且处于安全考虑,还需要定期更新、防止泄密等。
其实,Github Actions官方提供了一个官方的插件 configure-aws-credentials,用于配置AWS登录凭证。其推荐的方式是,利用GitHub的OIDC Provider进行认证鉴权。具体说明见其官方文档。
以下是在Terraform和Github Actions中的关键配置步骤。
- 在AWS中创建OIDC Provider:
resource "aws_iam_openid_connect_provider" "github_actions" { url = "https://token.actions.githubusercontent.com"
client_id_list = [ "sts.amazonaws.com", ]
thumbprint_list = ["6938fd4d98bab03faadb97b34396831e3780aea1", "1c58a3a8518e8759bf075b76b750d4f2df264fcd"]}- 更新IAM角色的代入角色策略文档(即
assume_role_policy的内容):
data "aws_iam_policy_document" "deployment_assume_role_policy" { statement { effect = "Allow" actions = ["sts:AssumeRoleWithWebIdentity"] condition { test = "StringLike" variable = "token.actions.githubusercontent.com:sub"
values = [ var.github_repository ] } condition { test = "StringEquals" variable = "token.actions.githubusercontent.com:aud" values = ["sts.amazonaws.com"]
} principals { type = "Federated" identifiers = [ aws_iam_openid_connect_provider.github_actions.arn ] } } }}- 在Github Actions的工作流中添加配置登录凭证的步骤:
permissions: id-token: write # This is required for requesting the JWT contents: read # This is required for actions/checkout
# ....
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: submodules: 'true' - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: "arn of the role" aws-region: "..."