在Github Actions中使用OIDC配置AWS登录凭证

2023-11-29#AWS#Github Actions

在Github Actions与AWS的服务交互时,下面是两种认证鉴权的直观方式:

  1. 在AWS IAM中创建用户,授予给用户相应的权限。然后在AWS Console中创建该用户登录凭证,拿到AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY,之后在使用AWS服务前,设置这两个环境变量即可。
  2. 在AWS IAM中创建角色,授予给角色相应的权限。然后再创建用户,允许用户能够“代入”(Assume)这个角色,这样用户即可拥有相应的权限。同样地,在AWS Console中创建该用户的登录凭证,拿到AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY。当使用AWS服务时,先设置这两个环境变量,然后代入角色,才能才能与AWS服务交互。这种方式的好处在于将权限配置在角色上,即“基于角色的访问控制”(Role Based Access Control,RBAC)。可以允许多个用户代入角色。

当使用以上两种方法时,还需要将在Github Actions的secrets中设置AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY

以上的流程需要进行手动配置,略有一些麻烦,而且处于安全考虑,还需要定期更新、防止泄密等。

其实,Github Actions官方提供了一个官方的插件 configure-aws-credentials,用于配置AWS登录凭证。其推荐的方式是,利用GitHub的OIDC Provider进行认证鉴权。具体说明见其官方文档。

以下是在Terraform和Github Actions中的关键配置步骤。

  1. 在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"]
}
  1. 更新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
        ]
      }
    }
  }
}
  1. 在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: "..."

加载中...