GitHubActionsでAWSへアクセスする
ここではECRへのPushを例に説明します
GitHubActionsでAWSリソースを操作するにはこちらを参照
GitHubActionsでAWSにアクセスする方法として大きく2つあります
-
アクセスキーを使用する方法
IAMユーザの作成及びアクセスキーを発行し、発行したアクセスキーを使用する方法
※今回の記事ではこちらの方法を使用します -
OpenID Connectを使用する方法
IDプロバイダー、IAMロールを作成。
アクセス制御はIAMロールの信頼ポリシーにGitHubのリポジトリを指定する
詳細は下記サイトが詳しく記載してくれているので割愛
https://zenn.dev/kou_pg_0131/articles/gh-actions-oidc-aws
個人的にはこちらの方がアクセスキーを発行しない分、簡単&セキュリティも高いと思います。
アクセスキーを使用する際にMFAを使用する
上記にて記述しましたが、「OpenID Connect」を使用した方がお手軽&セキュリティも高いと思ってますが、既存プロジェクトへ配属され、既にアクセスキーを使用した環境が構築済みでした。
しかし、MFAは使用されておらず、万が一アクセスキーが漏洩した場合のリスクが高いと感じてました。
大前提として、IAMユーザには必要最小限の権限のみ付与していますが、
ECRへPushが可能であり、その後自動でデプロイまでされる構成の場合、ECRに偽のリソースがアップされてしまったら大惨事になります
事前準備(詳細は割愛)
- IAMユーザの作成
- IAMユーザにMFAを登録する
- IAMユーザに必要最小限のポリシーをアタッチ
この時、ポリシーでMFAが必須である設定を入れる必要あります
具体的には下記をポリシーに追加します
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
- githubのRepository secretsにアクセスキー(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)を登録する
GitHubActionsの指定
- GitHubActionsを手動実行する際にMFAのトークンの入力欄を作成する
on:
workflow_dispatch:
inputs:
MFA-Token:
description: 'MFA-Token'
required: true
- Repository secretsに登録した「AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY」と実行時に入力されるMFAを使用して一時的な認証情報を取得する
- name: Get temporary credentials with MFA
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: |
MFA_TOKEN_CODE=${{ github.event.inputs.MFA-Token }}
TEMP_CREDENTIALS=$(aws sts get-session-token --serial-number arn:aws:iam::xxxxxxx:mfa/mfaデバイス名 --token-code $MFA_TOKEN_CODE --duration-seconds 3600 --output json)
echo "AWS_ACCESS_KEY_ID=$(echo $TEMP_CREDENTIALS | jq -r .Credentials.AccessKeyId)" >> $GITHUB_ENV
echo "AWS_SECRET_ACCESS_KEY=$(echo $TEMP_CREDENTIALS | jq -r .Credentials.SecretAccessKey)" >> $GITHUB_ENV
echo "AWS_SESSION_TOKEN=$(echo $TEMP_CREDENTIALS | jq -r .Credentials.SessionToken)" >> $GITHUB_ENV
- 上記で取得した一時的な認証情報を使用してクレデンシャルの登録とECRログイン
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
aws-session-token: ${{ env.AWS_SESSION_TOKEN }}
aws-region: ${{ env.AWS_DEFAULT_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
※configure-aws-credentialsの詳細はこちら
これで万が一アクセスキーが漏洩してもMFAがないと何もできなくなり、セキュリティが高まったと思います
コード内にMFAデバイス名を記述すると特定の一人しかGitHubActionsを実行することができなくなってしまいます。
MFAデバイス名を実行時に指定できるようにすると良いかと思います