AWS 凭证如何通过 MFA 在 GitHub Actions 中发挥作用

问题描述 投票:0回答:3

无法从 terraform 代码创建 s3 存储桶来创建 s3 存储桶。 我有代码


uses: hashicorp/terraform-github-actions/[email protected]
      env:
        TF_ACTION_WORKING_DIR: 'terraform'
        AWS_ACCESS_KEY_ID:  ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY:  ${{ secrets.AWS_SECRET_ACCESS_KEY }}

它很适合我。 但在我的组织中,我们对帐户使用 MFA。 我们使用虚拟令牌生成器进行 MFA,并拥有密钥和 ARN。

需要帮助生成令牌和角色。它是否已在 githubactions 中的任何库中。

我有这个脚本来创建 aws 令牌和角色。


unset AWS_ACCESS_KEY_ID

unset AWS_SECRET_ACCESS_KEY

unset AWS_SESSION_TOKEN

export AWS_ACCESS_KEY_ID=<<YOUR_KEY>>

export AWS_SECRET_ACCESS_KEY=<<YOUR_SECRET>>

 

aws sts get-session-token --duration-seconds 36000 \

--serial-number arn:aws:iam::<<YOUR_IAM_ACCOUNT_NUMBER>>:mfa/<<YOUR_IAM_ACCOUNT>> \

--token-code <<YOUR_MFA_OTP>> \

--output json

 

export AWS_ACCESS_KEY_ID=<<GET_FROM_JSON>>

export AWS_SECRET_ACCESS_KEY=<<GET_FROM_JSON>>

export AWS_SESSION_TOKEN=<<GET_FROM_JSON>>


aws sts assume-role --role-arn arn:aws:iam::<<YOUR_DEV_ACCOUNT_NUMER>>:role/<<YOUR_ROLE>> \

--role-session-name <<YOUR_ROLE>> \

--duration 3600 \ --output json

 

export AWS_ACCESS_KEY_ID=<<GET_FROM_JSON>>

export AWS_SECRET_ACCESS_KEY=<<GET_FROM_JSON>>

export AWS_SESSION_TOKEN=<<GET_FROM_JSON>>

需要在 github actions 中执行此操作。

我们从虚拟 MFA 自动化了 MFA 令牌。 像下面这样:

                            export AWS_SECRET_ACCESS_KEY="${env.AWS_SECRET_ACCESS_KEY}"
                            MFA="\$(oathtool --base32 --totp ${env.MFA_KEY})"

github上有什么简单的方法吗

amazon-web-services terraform github-actions multi-factor-authentication
3个回答
1
投票

我想你已经快完成了,你已经弄清楚如何使用

oathtool
来做到这一点。您只需在 GitHub Actions 工作流程中安装
oathtool
并将 MFA 密钥注册为 GitHub 存储库中的机密或(如果您的计划中有此选项)GitHub 组织机密。

如果您在 Ubuntu 容器上运行,安装

oathtool
就像将以下步骤添加到您的工作流程作业中一样简单:

      - name: install oathtool
        run: sudo apt-get install -y oathtool

您帖子中的所有内容也可以在 GitHub Actions 工作流程中完成,无论是简单的 shell 命令。我不知道有任何现成的操作可以为您完成所有这一切(但没有什么可以阻止您自己创建一个)。

完整的工作可能看起来像这样(尚未测试过):

job:
  aws:
    runs-on: ubuntu-latest
    
    env:
      AWS_ACCOUNT_NUMBER: 12345678
      AWS_IAM_USER: me@mydomain
    
    steps:
      - name: install oathtool and jq
        run: sudo apt-get install -y oathtool jq
    
      - name: get time-based one-time password
        run: TOTP=`oathtool --base32 --totp ${{secrets.MFA_KEY})"`

      - name: get temporary session token
        run: >-
          eval `aws sts get-session-token 
                --duration-seconds 36000 
                --serial-number arn:aws:iam::${{ env.AWS_ACCOUNT_NUMBER }}:mfa/${{ env.AWS_IAM_USER }} 
                --token-code ${{env.TOTP}}
                | jq -r '"AWS_ACCESS_KEY_ID="+.Credentials.AccessKeyId,"AWS_SECRET_ACCESS_KEY="+.Credentials.SecretAccessKey,"AWS_SESSION_TOKEN="+.Credentials.SessionToken'`

      - name: do your AWS thing
        run: aws ec2 describe-instances

1
投票

我已经针对我的用例测试了上面的脚本,其中我必须执行 mfa 然后承担该角色,为此我必须将密钥作为环境变量传递,然后在操作中使用它。希望这可以帮助任何正在从 Github 操作中寻找此类身份验证的人。

''''

steps:
# Checkout the repository to the GitHub Actions runner
- name: Checkout
  uses: actions/checkout@v2
  
- name: install oathtool and jq
  run: echo "${{secrets.RUNNER_PASSWORD}}" | sudo -S -k apt-get install -y oathtool jq 
 
- name: get token
  run: |
    TOTP="oathtool -b --totp ${{secrets.MFA_KEY}}" 
    $TOTP >> totp.output
    token=$(cat totp.output)
    eval `aws sts get-session-token --duration-seconds 36000 --serial-number ${{ secrets.MFA_ARN}} --token-code $token | (jq -r '"AWS_ACCESS_KEY_ID="+.Credentials.AccessKeyId,"AWS_SECRET_ACCESS_KEY="+.Credentials.SecretAccessKey,"AWS_SESSION_TOKEN="+.Credentials.SessionToken' >> $GITHUB_ENV)`
  
- name: Identity Check
  run: aws sts get-caller-identity  
  
- name: Assume execution role
  uses: aws-actions/configure-aws-credentials@v1
  with:
    aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
    aws-region: us-east-1
    aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
    aws-session-token: ${{ env.AWS_SESSION_TOKEN }}
    role-duration-seconds: 3000
    role-skip-session-tagging: true
    role-to-assume: "arn:aws:iam::${{secrets.AWS_ACCOUNT_ID}}:role/${{secrets.ROLE_NAME}}"

''''


0
投票

不幸的是,根据https://florian.ec/blog/github-actions-awscli-errors的报告,这种方法不再有效。他的解决方法不再有效。当将 --region xxx 添加到 AWS CLI 命令时,会引发错误“无法找到凭证。您可以通过运行“aws configure”来配置凭证。

© www.soinside.com 2019 - 2024. All rights reserved.