【2023年7月版 】GitHub Actions 上で OIDC 連携 Assume Role してみる

2023.07.01

こんにちは、森田です。

本記事では、GitHub Actions で OIDC 連携で Assume Role する方法を紹介していきます

はじめに

直近で thumbprint が変更となっているため、以前と同じ値で設定するとエラーが生じるようです。

An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint

thumbprint 変更は、証明書変更となるタイミングで生じますので、手動更新または、自動更新の仕組みを導入する必要があります。

本記事では、2023年7月時点での以下の thumbprint を設定していきます。

1c58a3a8518e8759bf075b76b750d4f2df264fcd
f879abce0008e4eb126e0097e46620f5aaae26ad

ロールの作成

以下のコードを利用して CloudFormation でロールの作成を行います。

role.yml

AWSTemplateFormatVersion: "2010-09-09"
Description: "IAM Role for OIDC GitHub"

Parameters:
  RepoName:
    Type: String

Resources:
  Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: OIDCGithubRole
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Action: sts:AssumeRoleWithWebIdentity
            Principal:
              Federated: !Ref GithubOidc
            Condition:
              StringLike:
                token.actions.githubusercontent.com:sub: !Sub repo:${RepoName}:*

  GithubOidc:
    Type: AWS::IAM::OIDCProvider
    Properties:
      Url: https://token.actions.githubusercontent.com
      ClientIdList: [sigstore]
      ThumbprintList: [1c58a3a8518e8759bf075b76b750d4f2df264fcd, f879abce0008e4eb126e0097e46620f5aaae26ad]

Outputs:
  Role:
    Value: !GetAtt Role.Arn

CloudFormation では、以下のようにリポジトリの入力が求められます。

CloudFormationスタック作成後は、出力に表示されているロールのARNをメモしておきます。

GitHub 側の設定

環境変数の設定

先ほど作成したロールのARNを環境変数に設定します。

ワークフローの作成

今回は、動作確認のため、以下のようなワークフローを作成します。

sample.yml

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      AWS_ROLE_ARN: ${{ secrets.AWS_ROLE_ARN }}
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@master  

      - name: Configure AWS
        run: |
          export AWS_ROLE_ARN=$AWS_ROLE_ARN
          export AWS_WEB_IDENTITY_TOKEN_FILE=/tmp/awscreds
          export AWS_DEFAULT_REGION=ap-northeast-1
          echo AWS_WEB_IDENTITY_TOKEN_FILE=$AWS_WEB_IDENTITY_TOKEN_FILE >> $GITHUB_ENV
          echo AWS_ROLE_ARN=$AWS_ROLE_ARN >> $GITHUB_ENV
          echo AWS_DEFAULT_REGION=$AWS_DEFAULT_REGION >> $GITHUB_ENV
          curl -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" "$ACTIONS_ID_TOKEN_REQUEST_URL&audience=sigstore" | jq -r '.value' > $AWS_WEB_IDENTITY_TOKEN_FILE

      - run: aws sts get-caller-identity

上記のコードでは、GetCallerIdentityを実行して、アカウントIDなどを取得しています。

動作確認

作成したワークフローは、mainブランチへのpushをトリガーとしています。

実際にpushしてみると以下のようにログにて各種情報を取得できていれば、問題なく OIDC 連携で Assume Role ができています。

 

最後に

今回は、新しい thumbprint を用いて GitHub Actions 上で OIDC 連携 Assume Role をやってみましたがお手軽に実行できました。

手動で thumbprint を設定しましたが、自動で取得してくれるものあるので、そのようなものを導入するとより楽になりますね!