👨‍💻

【GitHub Actions】OpenID Connectを使用してAWSの認証を行う

2023/06/29に公開

はじめに

過去にGitHub ActionsのワークフローからOpenID Connectを使用してAWSの参照・操作を行いました。
思い出しがてら記事にしたいと思います。

ワークフローからs3のバケットを一覧取得するまでを目標とします。

この構成のメリット

アクセスキーなどを用意することなく AWS認証を行うことが可能です。
漏洩の可能性が減るため、セキュリティの向上が見込めます。

ざっくりとした流れ

  1. AWSにてGitHub ActionsのOIDCプロバイダー、ロールを設定
  2. GitHub Actionsのワークフローが開始される。ワークフローはOIDCプロバイダーにリクエストを送り、トークンを取得する
  3. トークンを使用して、GitHub ActionsはAWSにリクエストを送る
  4. AWSは受け取ったトークンをOIDCプロバイダーで確認し、有効の場合アクセス用のトークンを提供する

https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect
より

検証

ドキュメントがあるため、こちらを参照しながら検証します。
https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services

IDプロバイダ設定

ここを参考にします。
https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc.html

設定する値は以下です。

  • プロバイダタイプ:OpenID Connect
  • プロバイダURL:token.actions.githubusercontent.com
  • Audience:sts.amazonaws.com

IAMロール作成

信頼ポリシーを以下のように設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<AccountID>:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:<GitHubアカウント名>/<GitHubリポジトリ名>:*"
                }
            }
        }
    ]
}

Conditionでのアクセス許可は以下を参照します

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html

ポリシーはワークフローが操作するリソースにあったものをつけましょう。

workflow作成

s3バケットを一覧表示するワークフローです。
リポジトリにpushしたら実行されます。

name: test

on:
  push:

env:
  AWS_ROLE_ARN: ${{ secrets.AWS_OIDC_ROLE_ARN }}

permissions:  
  id-token: write
  contents: read

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: configure aws credential
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: ${{ env.AWS_ROLE_ARN }}
          aws-region: ap-northeast-1
      - name: OIDC test
        run: aws s3 ls

ポイント

  • IAMロールのArnが必要となるため、控えてワークフローから参照出来るようにする
    • 今回はsecretsを使用しました。
  • permissions.id-tokenwriteとすることでOIDCプロバイダからトークンを取得できる
permissions:  
  id-token: write

https://zenn.dev/not75743/scraps/926f2693809744

動作確認

pushしてworkflowが正常に動けばOKです。
s3バケットが一覧表示されます。

参考

手順全体

https://scrapbox.io/not75743/【github_actions】OIDCでAWSと連携する
https://dev.classmethod.jp/articles/deploying-the-aws-cdk-using-openid-connect-on-github-actions/

OIDCについて

https://www.openid.or.jp/document/
https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect
https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_create_oidc.html

Discussion