概要
今までGitHub ActionsでAWSにOpenID Connect認証する設定を2回して、2回ともハマった設定ミスを今後はもう繰り返さないためにメモ。
内容
設定の過程で、認証先のIAMロールに信頼ポリシーを設定する必要がある。
https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#configuring-the-role-and-trust-policy
そのConditionに次のようなものを書いてしまうと失敗する。
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
"token.actions.githubusercontent.com:sub": "repo:octo-org/octo-repo:*"
}
}
マネジメントコンソールから編集する場合は、ワイルドカードを使っているのにStringEqualsを使っていることに警告が出るが、Terraformを使っていたためになかなか気付けなかった。
なんでこんなことが起きてしまったかというと、最初に
"token.actions.githubusercontent.com:sub": "repo:octo-org/octo-repo:ref:refs/heads/octo-branch"
のように具体的なブランチの指定をStringEqualsで書いたあとで(別の理由でうまくOIDC認証が成功せず、もしやここのミスじゃないかと思うなどして)ワイルドカードに書き換えたからである。本当は、ワイルドカードにするならStringLikeに変える必要がある:
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:octo-org/octo-repo:*"
}
}
ちなみに
OIDC認証がうまく成功しなかった場合、GitHub Actionsの実行ログを見てもあまり情報が得られないことが多い。このときは、CloudTrailからAssumeRoleWithWebIdentityイベントの中身を見ると上記信頼ポリシーのaudやsubにあたる値も見ることができるため、これらの設定でミスっていないか、予期せぬ値がGitHub Actionsから渡っていないか調べることができる。
他にも、pull requestをトリガーにしたGitHub Actionsから来る場合には、subが repo:octo-org/octo-repo:pull_request
になることもCloudTrailから分かる。