0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub ActionsでMFAを使用してAWSへアクセス

Posted at

GitHubActionsでAWSへアクセスする

ここではECRへのPushを例に説明します
GitHubActionsでAWSリソースを操作するにはこちらを参照

GitHubActionsでAWSにアクセスする方法として大きく2つあります

  1. アクセスキーを使用する方法
    IAMユーザの作成及びアクセスキーを発行し、発行したアクセスキーを使用する方法
    ※今回の記事ではこちらの方法を使用します  

  2. 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の詳細はこちら

amazon-ecr-loginの詳細はこちら

これで万が一アクセスキーが漏洩してもMFAがないと何もできなくなり、セキュリティが高まったと思います

コード内にMFAデバイス名を記述すると特定の一人しかGitHubActionsを実行することができなくなってしまいます。
MFAデバイス名を実行時に指定できるようにすると良いかと思います

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?