🚀

GitHub ActionsでAWSにOIDC認証してみた

2023/08/08に公開

概要

GitHub Actions では OpenID Connect (OIDC) を使うことができます。
IAMでGitHubリポジトリのシークレットに鍵を登録し、AWSへアクセスする方法もありますが、これだと外部へ鍵を持ち出して登録行為をしたものを管理する必要性と、そもそも専用のIAMを発行しなければいけないことになり2重に苦しいですね。IAMを管理する立場の人は。
そこで、IAMの管理をせずにGitHubからAWSへアクセス方法としてOIDCは優れています。
OIDCとはなにか???という説明は省略します。

やってみた

AWSの設定(事前準備)

開発現場では、ここはインフラ担当から提供される部分かもしれません。ですが、理解しておくことがGitHub ActionsでOIDCを理解する最短ルートであると思います。しっかり理解しておきましょう。

まずはIAMでIDプロバイダを設定していきます。プロバイダをマネージドでやってくれるなんて便利な時代ですね。

OpenID Connectを選択。URLには https://token.actions.githubusercontent.comをセットしサムプリントを取得を押しましょう。対象者にはSTS sts.amazonaws.com をセットします。

はい、完成しました。

これではまだGitHubと紐ついていないですね。
IAMポリシー、IAMロールを作成してIDプロバイダにアタッチしていきます。

ロールを作成から、

カスタム信頼ポリシーを入力していきます。

  • icckは私のGitHubアカウントです。皆さんのものに置き換えてください。
  • actions-oidcは今回実験につかったリポジトリ名です。皆さんのものに置き換えてください。
カスタム信頼ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<AWSアカウントID>:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
                    "token.actions.githubusercontent.com:sub": "repo:icck/actions-oidc:ref:refs/heads/main"
                }
            }
        }
    ]
}

次に操作したいサービスのポリシーをアタッチしてみます。
真剣につかう場合は最小権限を付与したほうが良いですが、今回はざくっとS3をアタッチします。
皆さんの使いたいものをアタッチしてください。

ここまででOIDC設定がされたIAMロールが完成しました。
このIAMロール名を後続のGitHub Actionsでは使用していきますので控えておいてください。

OIDCの設定

作成したサンプルでは、チェックアウトしたGitHubリポジトリの.files配下をS3へアップロードしてみました。

.git/workflows/oidc-yaml
name: oidc-sample
on:
  push:
permissions:
  id-token: write
  contents: read  
jobs:
  aws-s3:
    runs-on: ubuntu-latest
    steps:
      - name: Git clone the repository
        uses: actions/checkout@v3
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: arn:aws:iam::<AWS ID>:role/githubactions-role
          aws-region: us-east-1
      - name: Upload to S3
        run: |
          aws s3 cp ./files s3://oidc-sample-icck --recursive

パーミッションの設定、aws-actions/configure-aws-credentials@v2の設定をするだけです。簡単ですね。重要なのは以下の部分になります。

...
...
permissions:
  id-token: write
  contents: read  
...
...
      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: arn:aws:iam::<AWS ID>:role/githubactions-role
          aws-region: us-east-1



さいごに

OIDCを使えばとてもシークレット不要で簡単にAWSを操作できました。
皆様も快適なOIDCライフをお過ごしください。

参考

アマゾン ウェブ サービスでの OpenID Connect の構成

Discussion