在Github Actions中使用OIDC配置AWS登录凭证
在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: "..."
加载中...