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 つの条件を定義し、信頼できないリポジトリがクラウド リソースにアクセス トークンを要求できないようにする必要があります。 詳しくは、「OpenID Connect を使ったセキュリティ強化について」を参照してください。

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) をクラウド アクセス トークンと交換します。

独自のカスタム保護規則を有効にして、サードパーティ サービスを使ったデプロイを制御できます。 たとえば、Datadog、Honeycomb、ServiceNow などのサービスを使って、GitHub.com へのデプロイに対して自動承認を提供できます。

アクセス許可設定の追加

 ジョブまたはワークフローの実行には、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

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

呼び出し元ワークフローと同じユーザー、Organization、または Enterprise が所有する再利用可能なワークフローの場合、再利用可能なワークフローで生成された OIDC トークンに呼び出し元のコンテキストからアクセスできます。 Enterprise または Organization 外部の再利用可能なワークフローについては、id-tokenpermissions 設定を、呼び出し元ワークフロー レベル、または再利用可能ワークフローを呼び出す特定のジョブで write に設定してください。 これにより、再利用可能なワークフローで生成された OIDC トークンは、意図した場合にのみ呼び出し元ワークフローで使用できるようになります。

詳しくは、「ワークフローの再利用」を参照してください。

アクセス トークンの要求

この 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

参考資料