🔐
【AWS IAM(第12回)】:「外部ID連携(OIDC)」 〜GitHub ActionsからAWSへ〜
🌱 はじめに
「GitHubに置いたアクセスキーが漏洩して、数百万の高額請求が来た...」
こんな悲劇は、AWS界隈では絶えません。アクセスキーは「永続的な合鍵」だからです。
これに対して、今回紹介する OIDC(OpenID Connect) による連携は、「鍵を渡さない」のが最大の特徴です。
GitHub Actionsが「私は間違いなくGitHub上のリポジトリAです」という証明書を提示し、
AWSがそれを検証して一時的な権限を貸し出す。この「信頼のバトン」の仕組みを解説します。
➊ OIDC連携の全体像:なぜ「鍵」がいらないのか?
OIDC連携を支えるのは、「 IDプロバイダ(IdP) 」という仕組みです。
これまで学んだAssumeRoleは「AWS内の誰か」が対象でしたが、OIDCを使うと「GitHub」という外部サービスを信頼の対象に含めることができます。
比較:アクセスキー方式 vs OIDC方式
| 特徴 | アクセスキー方式(旧) | OIDC方式(現代) |
|---|---|---|
| 鍵の管理 | GitHub Secretsに永続的な鍵を保存 | 不要(鍵自体が存在しない) |
| 有効期限 | 無期限(手動で更新が必要) | 一時的(数分〜数時間で自動失効) |
| 漏洩リスク | 非常に高い | 物理的な鍵がないため極めて低い |
| 設定の難易度 | かなり楽 | 最初だけ少し手間 |
➋ OIDC連携の4ステップ・フロー
GitHub ActionsがAWSのロールを引き受けるまでの流れは以下の通りです。
- トークン発行 : GitHub Actionsが、実行中に「自分を証明するトークン(JWT)」を発行します。
- 提示 : GitHubがそのトークンをAWS STSに送ります。
- 検証 : AWSは、あらかじめ登録された「GitHubの公開鍵」を使って、トークンが本物かチェックします。
- 変身 : 検証OKなら、STSが一時的な認証情報をGitHub Actionsに返します。
➌ 【実践】AWS側の設定ポイント
エンジニアが一番ハマるのが、IAMロールの 「信頼ポリシー」の書き方 です。
単に「GitHubを信じる」だけでは、世界中のGitHubユーザーがあなたのAWSを操作できてしまいます。
ここで、第7回で学んだ「 条件(Condition) 」が威力を発揮します。
信頼ポリシーの例:特定のリポジトリだけに絞り込む
特に token.actions.githubusercontent.com:sub(サブジェクト)という項目で、
「 自分のリポジトリ名 」を指定するのがセキュリティ上の絶対条件です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::XXXXXXXXXXXX:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:my-organization/my-repo:*"
}
}
}
]
}
➍ GitHub Actions側の設定
GitHub側では、公式の aws-actions/configure-aws-credentials を使うだけでOKです。
jobs:
deploy:
runs-on: ubuntu-latest
# IDトークンを発行するための権限設定が必要
permissions:
id-token: write
contents: read
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::XXXXXXXXXXXX:role/github-actions-oidc-role
aws-region: ap-northeast-1
- name: S3 Sync
run: aws s3 sync ./dist s3://my-bucket
🎯 まとめ
- OIDCは、GitHubなどの外部サービスと「鍵なし」で連携できる最強の仕組み。
- AWS側にIDプロバイダを登録し、信頼ポリシーでリポジトリを厳格に絞り込む。
-
AssumeRoleWithWebIdentityというAPIが、裏側で「外部の身分証」を「AWSの鍵」に交換している。 - 「Secretsにアクセスキーを入れる」運用は、今日から卒業しよう。
Discussion