🔐

【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のロールを引き受けるまでの流れは以下の通りです。

  1. トークン発行 : GitHub Actionsが、実行中に「自分を証明するトークン(JWT)」を発行します。
  2. 提示 : GitHubがそのトークンをAWS STSに送ります。
  3. 検証 : AWSは、あらかじめ登録された「GitHubの公開鍵」を使って、トークンが本物かチェックします。
  4. 変身 : 検証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