GitHub ActionsでAWSへアクセスする際に認証をどう突破するかが重要です。
GitHub の Actions secrets and variables からAWSの認証情報を読み込む方法もありますが、
機密情報を持たせておくのはセキュリティ的にはよろしくない。
そこで、AWSでOIDC(OpenID Connect)を作成し、使用することを考えます。
OIDCはAWSコンソールを使用して作成します。
OIDC(OpenID Connect)とは
こちらの記事がわかりやすいと思います
AWSドキュメントはこちらです。
GitHubのドキュメントはこちら
OIDC(OpenID Connect)を作成
IDプロバイダを作成
IAMコンソール > IDプロバイダ > プロバイダを追加 で作成画面に遷移する
作成画面にて、各設定を入れていきます
プロバイダのタイプ | OpenID Connect |
プロバイダの URL (入力後「サムプリントを取得」をクリック) |
https://token.actions.githubusercontent.com |
対象者 | sts.amazonaws.com |
プロバイダのURLを入力後、「サムプリントを取得」をクリックするとサムプリントが表示される
右下の「プロバイダを追加」をクリックして、IDプロバイダを確認します。
IAMロールの作成
IAMコンソール > ロール > ロールを作成 をクリック
IAMロールの設定をしていきます
信頼されたエンティティタイプ | カスタム信頼ポリシー |
カスタム信頼ポリシー | 下記JSONにて必要な情報を置換して入力 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "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": { "StringLike": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com", "token.actions.githubusercontent.com:sub": "repo:<GitHubユーザー名>/<GitHubリポジトリ名>:*" } } } ] } |
どの操作を許可するか選んで、「次へ」をクリックします。
要件に合わせて適宜ポリシーをアタッチしてください。
今回はとりあえず、AmazonS3ReadOnlyAccess を指定しておきます
名前、説明を入力し、ポリシーが適切か確認します。OKなら「ロールを作成」をクリック
名前や説明は自分がわかりやすいものであればなんでもいいです。
私はこんな感じにしました。
名前 | GitHubActionsOIDCRole |
説明 | GitHubActions use this role to access to aws |
これでAWS側の準備が完了したのでGitHubActionsを使用してテストしてみます
GitHub Actions でAWSにアクセスできるかテスト
任意のリポジトリからAWSにアクセスできるかテストしてみます!
テスト用にoidc_testというリポジトリを作成したので、それを使っていきます。
mainブランチからテスト用のtestブランチをきります
1 2 3 4 5 6 7 |
oidc_test$ git branch * main oidc_test$ git checkout -b test Switched to a new branch 'test' oidc_test$ git branch main * test |
GitHub Actionsのワークフローを定義するため、
.github/workflows/aws_access_test.yml を作成します
(ディレクトリ)
terraform_test
├── .github
│ └── workflows
│ └── aws_access_test.yml // 作成
└── README.md
こちらを参考にaws_access_test.ymlに記述していきます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
name: AWS Test on: push: branches: # 作業ブランチ - test env: # ×××××××××:AWSアカウントID # GitHubActionsOIDCRole:作成したIAMロール名 AWS_ROLE_ARN: arn:aws:iam::×××××××××:role/GitHubActionsOIDCRole permissions: id-token: write contents: read jobs: aws-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: aws-actions/configure-aws-credentials@v1 with: role-to-assume: ${{ env.AWS_ROLE_ARN }} aws-region: ap-northeast-1 - run: aws sts get-caller-identity |
testブランチにpushした際に
aws sts get-caller-identity
が実行されるワークフローが定義できました!
このワークフローでGitHub ActionsからAWSにアクセスできるかpushして確認します
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
oidc_test$ git add . oidc_test$ git commit -m "commit aws_access_test.yml" oidc_test$ git push origin test Enumerating objects: 6, done. Counting objects: 100% (6/6), done. Delta compression using up to 16 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (5/5), 743 bytes | 743.00 KiB/s, done. Total 5 (delta 1), reused 0 (delta 0), pack-reused 0 remote: Resolving deltas: 100% (1/1), completed with 1 local object. remote: remote: Create a pull request for 'test' on GitHub by visiting: remote: https://github.com/×××××××××/oidc_test/pull/new/test remote: To https://github.com/×××××××××/oidc_test.git * [new branch] test -> test |
GitHub > リポジトリ > Actions から結果を確認できます
無事成功していますね!
参考
コメント