😸

GitHub ActionsをOIDC化する

に公開

はじめに / この記事で解説すること

  • 節約のためAWSリソースは利用する度にTerraformで作成していますが、ECSサービスのデプロイにおいてアクセスキーによる認証だと毎回Githubに認証情報を登録する必要があるためOIDCでの認証に変更します。
  • OIDCでの認証ではアクセスキーが不要で認証できるので、GitHubへの登録作業が削減できます。(以前はユーザ作成の度にAWSへログインしてアクセスキー、シークレットアクセスキー取得し、GItHubへログインしてシークレット変数に登録する必要があった。)
  • 恒常的にAWSリソースを利用しているなら問題ないですが、節約&関連するリソースをTerraformで開発の都度作成している場合はだいぶ楽になりますのでおすすめです。

なぜ OIDC を使うのか? / 構成のメリット

  • Github ActionsでのAWS認証はいくつかありますが、私が説明できるのは以下です。
    1. IAMユーザのアクセスキー/シークレットトークンによる認証
      • いわゆるID/PASSWORDによる認証。時間の観点で言えば固定・長期認証情報による認証ともいえます。
      • メリット
        • 簡単。(IAMユーザを作成し、アクセスキーをGithubに登録する。ワークフロー実行時にアクセスキーを利用してAWSへ認証を行う)
      • デメリット
        • IAMユーザを再作成するとアクセスキーが更新されるため再度Githubへの登録が必要
        • アクセスキーが流出する可能性がある。
    2. OIDC (OpenID Connect) を利用した認証
      • JWT認証(トークンベースの認証)
      • メリット
        • アクセスキーを管理する必要がない。
      • デメリット
        • ちょっと面倒(とはいえメリットに比べるとこの労力は小さい)

構築

  • 概要

    1. GitHubをIdPとしてAWSに登録
    2. AWSでIAMロールを作成
      • IAMロールにAssumeRole を許可する信頼関係を設定
      • IAMロールに権限を付与
    3. workfrowを修正
  • 手動で登録する場合

    1. GitHubをIdPとしてAWSに登録

    2. AWSでIAMロールを作成

      • AWSログイン→IAM→ロール→ロールを作成

      • 信頼されたエンティティタイプ:カスタム信頼ポリシー

      • カスタム信頼ポリシー

        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "Statement1",
                    "Effect": "Allow",
                    "Principal": {
                        "Federated": "arn:aws:iam::<AWSアカウントID>:oidc-provider/token.actions.githubusercontent.com"
                    },
                    "Action": "sts:AssumeRoleWithWebIdentity",
                    "Condition": {
                        "StringEquals": {
                            "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                        },
                        "StringLike": {
                            "token.actions.githubusercontent.com:sub": "repo:<GitHubユーザID>/<GitHubリポジトリ名>:*"
                        }
                    }
                }
            ]
        }
        
      • 許可ポリシー

        • AmazonEC2ContainerRegistryFullAccess
        • AmazonECS_FullAccess
    3. workfrowを修正

      permissions:
        id-token: write
        contents: read
      
            # 2. AWSへのログイン
            - name: Configure AWS credentials
              uses: aws-actions/configure-aws-credentials@v2
              with:
                role-to-assume: <作成したロールarn>
                aws-region: ${{ secrets.AWS_REGION }}
      
  • Terraformで登録する場合

    1. GitHubをIdPとしてAWSに登録

      ###############################################################################
      # GitHub Actions 用 oidcプロバイダ (GitHub ActionsのOIDC認証)
      ###############################################################################
      
      # GitHub OIDC Provider
      resource "aws_iam_openid_connect_provider" "github" { # GitHubの公開鍵証明書のフィンガープリント
        url             = "https://token.actions.githubusercontent.com"
        client_id_list  = ["sts.amazonaws.com"]
        thumbprint_list = ["<GitHubの公開鍵証明書>"]
      }
      
    2. GitHub Avtions用のIAMロールを作成

      ###############################################################################
      # GitHub Actions 用 IAMロール
      ###############################################################################
      
      # IAMロール
      resource "aws_iam_role" "github_actions" {
        name = "github_actions_role"
        assume_role_policy = jsonencode({
          Version = "2012-10-17",
          Statement = [
            {
              "Sid" : "Statement1",
              "Effect" : "Allow",
              "Principal" : {
                "Federated" : "arn:aws:iam::<AWSアカウントID>:oidc-provider/token.actions.githubusercontent.com"
              },
              "Action" : "sts:AssumeRoleWithWebIdentity",
              "Condition" : {
                "StringEquals" : {
                  "token.actions.githubusercontent.com:aud" : "sts.amazonaws.com"
                },
                "StringLike" : {
                  "token.actions.githubusercontent.com:sub" : "repo:<ユーザ名>/*:*"
                }
              }
            }
          ]
        })
      }
      
      • セキュリティを担保する場合はCondition(条件)の中でGithubのユーザ名、リポジトリ名、(できればブランチまで)指定してください。
    3. 作成したロールにポリシーをアタッチ

    4. workfrowを修正

Discussion