LCL Engineers' Blog

バス比較なび・格安移動・バスとりっぷを運営する LCLの開発者ブログ

OIDCを利用した、GitHub ActionsとAWSリソースの安全な連携方法

こんにちは、インフラエンジニアの小林です。 今回は OpenID Connect(OIDC) を使ったGitHub ActionsとAWSリソース連携方法について解説します。

OIDCとは?

OpenID Connect は、サービス間で認証情報を安全に共有するための規格です。
アプリやサービスを利用する時に、他の認証が済んでいるサービスの情報を使って認証ができるのが特徴です。 AWS と GitHub Actionsの場合、GitHub Actions が AWS の認証情報を使うことで、安全な認証が実現されます。

OIDCを使用した、GitHub ActionsとAWS連携のメリット

  • セキュアで簡単
    アクセスキーやシークレットキーの管理が不要です。
  • 柔軟なアクセス制御
    IAMロールのポリシーで、特定のGitHubリポジトリにのみ権限を付与可能です。

AWSとGitHub Actionsの連携の流れ

AWSとGitHub Actionsの連携の流れ

  1. エンドユーザ(GithubActions)は、GitHubに認証に使用するOpenIDトークンを要求する
    • OpenIDトークンを提供するサービスを、OpenIDプロバイダ と呼ぶ
  2. GithubActionsは、受け取ったOpenIDトークンをAWS STSに渡して認証してもらう
    • OpenIDトークンを受け取るサービスを、Relying Party と呼ぶ
  3. AWS STSは、OpenIDトークンを検証して、問題なければ、要求されたIAMロールが許可されたクレデンシャルをGitHubActionsに渡す
  4. GithubActionsは、そのクレデンシャルを使って、AWS SDKを呼び出して、リソースを参照/変更する

設定方法

以下の手順で、GitHub Actions が AWS リソースに安全にアクセスできるように設定します。

  1. OIDCプロバイダを設定
    AWS側で、GitHubのOIDCプロバイダと、Relying Partyの連携を行います
  2. IAMロールとポリシーを作成
    GitHub ActionsがAWSリソースにアクセスできるように設定します。
  3. GitHub Actionsの設定
    作成したロールを使ってAWSリソースを操作します。

Terraformでの実装例

1. OIDCプロバイダを設定

# 名前がややこしいが、GitHubのOIDCプロバイダと、Relying Partyの連携させるためのリソース
resource "aws_iam_openid_connect_provider" "github" {
  # 連携先クライアントのURL
  url             = "https://token.actions.githubusercontent.com"

  # Relying Partyのドメイン
  # 通常は sts.amazonaws.com (自前の認証先を用意している場合などに変わる)
  client_id_list  = ["sts.amazonaws.com"]

  # クライアントのドメインが正しいことを証明するためのフィンガープリント
  # プロバイダがクライアントに接続した時に証明書のフィンガープリントが、こちらと一致するかチェックするのに使用
  thumbprint_list = data.tls_certificate.github_actions.certificates[*].sha1_fingerprint
}

data "http" "github_actions_openid_configuration" {
  url = "https://token.actions.githubusercontent.com/.well-known/openid-configuration"
}

# フィンガープリントを動的に取得することでフィンガープリントが変わった時にも対応可能
data "tls_certificate" "github_actions" {
  url = jsondecode(data.http.github_actions_openid_configuration.response_body).jwks_uri
}

2. IAMロールとポリシーを設定

IAMロール

resource "aws_iam_role" "github_oidc_role" {
  name = "github-actions-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Effect = "Allow",
        # このロールを、aws_iam_openid_connect_provider.github に移譲する
        Principal = {
          Federated = aws_iam_openid_connect_provider.github.arn
        },
        # 「外部(OIDCなど)で使用できる、一時的なセキュリティ認証情報の発行」を許可
        Action = "sts:AssumeRoleWithWebIdentity",
        Condition = {
          StringLike = {
            # このロールを利用可能なGitHubリポジトリ
            "token.actions.githubusercontent.com:sub" : "repo:<your-org-or-user>/<your-repo>:*"
          }
        }
      }
    ]
  })
}

IAMポリシー

以下は、S3の一覧を許可する場合の例

resource "aws_iam_policy" "github_oidc_policy" {
  name        = "github-actions-policy"
  description = "Policy to allow GitHub Actions to access specific AWS resources"

  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Effect   = "Allow",
        Action   = ["s3:ListBucket"],
        Resource = ["arn:aws:s3:::example-bucket"]
      }
    ]
  })
}

ポリシーのアタッチ

resource "aws_iam_role_policy_attachment" "github_oidc_policy_attach" {
  role       = aws_iam_role.github_oidc_role.name
  policy_arn = aws_iam_policy.github_oidc_policy.arn
}

3. GitHub Actionsでの設定

aws-actions/configure-aws-credentials@v3 にて、使用したいIAMロールを呼び出します。

- name: Configure AWS credentials
  uses: aws-actions/configure-aws-credentials@v3
  with:
    role-to-assume: arn:aws:iam::<ACCOUNT_ID>:role/github-actions-role
    aws-region: us-east-1

これで、GitHub ActionsからIAMロールを使用する形で、AWSリソースへのアクセスが可能になります!

運用のポイント

  • 1アクション1ロールを推奨
    いろいろな権限を持たせたロールを、複数のアクションで共有するのはセキュリティリスクが高いため避けましょう。

おわりに

OIDCを活用すれば、セキュアで効率的な認証連携を実現できます。
ぜひ、AWSとGitHub Actionsの連携に取り入れてみてください!