我如何在不使用密钥的情况下连接GitHub动作和AWS部署?

我希望能够使用GitHub动作能够部署资源与AWS,但不使用硬编码的用户。

我知道有可能创建一个有固定凭证的IAM用户,这可以导出到GitHub的秘密,但这意味着如果密钥泄漏,我有一个大的问题在我手上,如果忘记旋转这样的密钥是具有挑战性的。

我是否可以启用一个无密码认证流程来部署代码到AWS?

###是有可能的,现在GitHub已经发布了他们的开放ID连接器用于GitHub的动作。您可以将Open ID连接器配置为AWS中的身份提供者,然后将其用作您希望启用的任何角色的接入点。然后,您可以将操作配置为使用在作业期间获取的凭据,并且在作业完成时,凭据将被自动撤销。

要在AWS中设置此功能,您需要使用AWS中的说明或使用类似于以下的Terraform文件创建一个开放身份连接提供商:

resource "aws_iam_openid_connect_provider" "github" {
  url = "https://token.actions.githubusercontent.com"
  client_id_list = [
    "sigstore",           // GitHub's default
    "sts.amazonaws.com",  // Proposal for aws-actions/configure-aws-credentials
  ]
  thumbprint_list = [
    "a031c46782e6e6c662c2c87c76da9aa62ccabd8e",
  ]
}

客户端id列表是用来访问这些内容的“受众”——你可以在所有正确的地方进行更改。拇指指纹是Open ID连接器和a031…bd8e是GitHub Actions使用的当前值——你可以按照AWS的指示计算/验证值。thumbprint_list最多可以保存5个值,因此当更新的版本提前可用时,可以添加新的版本,同时继续使用旧版本。

如果你对这个神奇的值来自哪里感兴趣,你可以在How can I calculate the thumbprint of an OpenID Connect服务器找到答案。

一旦你启用了身份提供者,你可以使用它来创建一个或多个自定义角色(替换为:

data "aws_caller_identity" "current" {}
resource "aws_iam_role" "github_alblue" {
  name = "GitHubAlBlue"
  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [{
      Action = "sts:AssumeRoleWithWebIdentity"
      Effect = "Allow"
      Principal = {
        Federated = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:oidc-provider/token.actions.githubusercontent.com"
      }
      Condition = {
        StringLike = {
          "token.actions.githubusercontent.com:aud" :  ["sigstore", "sts.amazonaws.com ],
          "token.actions.githubusercontent.com:sub" : "repo:alblue/*"
        }
      }
    }]
  })
}

你可以根据自己的需要创建许多不同的角色,甚至可以根据观众划分角色。“生产”“开发”)。只要OpenID连接器的用户受到该帐户的信任,那么就可以开始了。(你可以使用它来确保开发帐户中的OpenID连接器不信任生产帐户中的角色,反之亦然。)例如,您可以使用一个只读角色来执行terraform验证,然后使用另一个角色来应用terraform。

主题是从GitHub传递的,但看起来像:

repo:<organization>/<repository>:ref:refs/heads/<branch>

之后可能会出现不同的格式。如果你使用:ref:ref /拉/*,你可以为PRs指定一个动作/角色,并为:ref:ref /heads/production/*指定另一个角色。

最后一步是让你的GitHub Actions配置使用从AWS/OpenID连接返回的令牌:

标准的方式

jobs:
  terraform-validate:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Configure AWS credentials from Test account
        uses: aws-actions/configure-aws-credentials@master
        with:
          role-to-assume: arn:aws:iam::<accountid>:role/GitHubAlBlue
          aws-region: us-east-1
          audience: sigstore
      - name: Display Identity
        run: aws sts get-caller-identity

手动方式

在被子下面发生的事情是这样的:

jobs:
  terraform-validate:
    runs-on: ubuntu-latest
    env:
      AWS_WEB_IDENTITY_TOKEN_FILE: .git/aws.web.identity.token.file
      AWS_DEFAULT_REGION: eu-west-2
      AWS_ROLE_ARN: arn:aws:iam::<accountid>:role/GitHubAlBlue
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Configure AWS
        run: |
          sleep 3 # Need to have a delay to acquire this
          curl -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
            "$ACTIONS_ID_TOKEN_REQUEST_URL&audience=sigstore" \
            | jq -r '.value' > $AWS_WEB_IDENTITY_TOKEN_FILE
          aws sts get-caller-identity

您需要确保您的AWS_ROLE_ARN与AWS帐户中定义的相同,并且受众与OpenID Connect和角色名所接受的受众相同。

本质上,在工作开始和令牌的有效性之间有一个竞争条件,直到GitHub确认工作已经开始后才会进入;如果AWS_WEB_IDENITY_TOKEN_FILE的大小小于10个字符,这可能是一个错误,sleep/spinning会在之后得到这个值。

只要是一致的,AWS_WEB_IDENTITY_TOKEN_FILE的名称实际上并不重要。如果你正在使用docker容器,那么将它存储在/tmp中意味着它在任何正在运行的容器中都不可用。如果你把它放在工作空间的。git下,那么git不仅会忽略它(如果你在做任何哈希计算),而且它还会出现在你以后做的任何其他docker运行操作中。

您可能想要配置您的角色,以便限制使用期间的有效性;一旦你有了web令牌,它的有效期一直到作业结束,但是请求的令牌有15分钟的生命周期,所以有可能一个更长的运行作业暴露它。

在不久的将来,GitHub可能会有一篇关于如何配置/使用这个的博客文章。上面的信息是受到https://awsteele。com/blog/2021/09/15/aws-federation-comes-to-github-actions。html的启发,如果你喜欢的话,在CloudFormation模板中有一些例子。

###由于某些原因,我一直得到这与AlBlue提供的答案:

"message":"不能为用户'githubactions'发出ID_TOKEN。"

不过,部署这篇文章中提供的堆栈是可行的。

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码