Skip to main content

Google Cloud Platform での OpenID Connect の構成

ワークフロー内で OpenID Connect を使用して、Google Cloud Platform での認証を行います。

概要

OpenID Connect (OIDC) を使用すると、有効期間の長い GitHub シークレットとして Google Cloud Platform (GCP) 資格情報を格納しなくても、GitHub Actions ワークフローから GCP 内のリソースにアクセスできます。

このガイドでは、GitHub の OIDC をフェデレーション ID として信頼するように GCP を構成する方法の概要と、トークンを使用して GCP に対する認証とリソースへのアクセスを行う google-github-actions/auth アクションのワークフロー例を示します。

前提条件

  • GitHub が OpenID Connect (OIDC) を使用する方法の基本的な概念とそのアーキテクチャと利点については、「OpenID Connect を使用したセキュリティ強化について」を参照してください。

  • 先に進む前に、アクセス トークンが予測可能な方法でのみ割り当てられるようにセキュリティ戦略を計画する必要があります。 クラウド プロバイダーがアクセス トークンを発行する方法を制御するには、少なくとも 1 つの条件を定義し、信頼できないリポジトリがクラウド リソースにアクセス トークンを要求できないようにする 必要があります。 詳細については、「クラウドを使った OIDC 信頼の構成」を参照してください。

Google Cloud Workload ID プロバイダーの追加

GCP で OIDC ID プロバイダーを構成するには、次の構成を実行する必要があります。 これらの変更を行う手順については、GCP のドキュメントを参照してください。

  1. 新しい ID プールを作成します。
  2. マッピングを構成し、条件を追加します。
  3. 新しいプールをサービス アカウントに接続します。

ID プロバイダーを構成するためのその他のガイダンス:

GitHub Actions ワークフローを更新する

OIDC のワークフローを更新するには、YAML に 2 つの変更を行う必要があります。

  1. トークンのアクセス許可設定を追加します。
  2. この google-github-actions/auth アクションを使用して、OIDC トークン (JWT) をクラウド アクセス トークンと交換します。

アクセス許可設定の追加

ジョブまたはワークフローの実行には、id-token: writepermissions 設定が必要です。 id-tokenpermissions 設定が read または none の場合、OIDC JWT ID トークンを要求することはできません。

この id-token: write 設定により、次のいずれかの方法を使用して、GitHub の OIDC プロバイダーから JWT を要求できます。

  • ランナーで環境変数を使用する (ACTIONS_ID_TOKEN_REQUEST_URL および ACTIONS_ID_TOKEN_REQUEST_TOKEN)。
  • アクション ツールキットから getIDToken() を使用する。

ワークフローの OIDC トークンをフェッチする必要がある場合は、ワークフロー レベルでアクセス許可を設定できます。 次に例を示します。

YAML
permissions:
  id-token: write # This is required for requesting the JWT
  contents: read  # This is required for actions/checkout

1 つのジョブに対して OIDC トークンのみをフェッチする必要がある場合は、そのジョブ内でこのアクセス許可を設定できます。 次に例を示します。

YAML
permissions:
  id-token: write # This is required for requesting the JWT

ワークフローの要件に応じて、ここで追加のアクセス許可を指定する必要がある場合があります。

アクセス トークンの要求

この google-github-actions/auth アクションを使うと、GitHub OIDC プロバイダーから JWT を受け取り、アクセス トークンを GCP に要求します。 詳細については、GCP のドキュメントを参照してください。

この例には、アクションを使って GCP のサービス一覧を要求する Get_OIDC_ID_token というジョブがあります。

  • <example-workload-identity-provider>: これを GCP の ID プロバイダーへのパスに置き換えます。 たとえば、projects/<example-project-id>/locations/global/workloadIdentityPools/<name-of-pool/providers/<name-of-provider> のように指定します。
  • <example-service-account>: これを GCP のサービス アカウント名に置き換えます。
  • <project-id>: これを GCP プロジェクトの ID に置き換えます。

このアクションを使い、ワークロード ID フェデレーションを使って、GitHub OIDC トークンを Google Cloud アクセス トークンと交換します。

YAML
name: List services in GCP
on:
  pull_request:
    branches:
      - main

permissions:
  id-token: write

jobs:
  Get_OIDC_ID_token:
    runs-on: ubuntu-latest
    steps:
    - id: 'auth'
      name: 'Authenticate to GCP'
      uses: 'google-github-actions/auth@v0.3.1'
      with:
          create_credentials_file: 'true'
          workload_identity_provider: '<example-workload-identity-provider>'
          service_account: '<example-service-account>'
    - id: 'gcloud'
      name: 'gcloud'
      run: |-
        gcloud auth login --brief --cred-file="${{ steps.auth.outputs.credentials_file_path }}"
        gcloud services list