メモ
GitHub Enterprise Server ホステッド ランナーは、現在 GitHub ではサポートされていません。
概要
OpenID Connect (OIDC) を使用すると、 GitHub Actions ワークフローは、有効期間の長い GitHub シークレットとして GCP 資格情報を格納しなくても、Google Cloud Platform (GCP) 内のリソースにアクセスできます。
このガイドでは、 GitHubの OIDC をフェデレーション ID として信頼するように GCP を構成する方法の概要と、トークンを使用して GCP に対して認証し、リソースにアクセスする google-github-actions/auth アクションのワークフロー例を示します。
前提条件
-
GitHub が OpenID Connect (OIDC) を使用する方法の基本的な概念とそのアーキテクチャと利点については、「OpenID Connect」を参照してください。
-
先に進む前に、アクセス トークンが予測可能な方法でのみ割り当てられるようにセキュリティ戦略を計画する必要があります。 クラウド プロバイダーがアクセス トークンを発行する方法を制御するには、少なくとも 1 つの条件を定義し、信頼できないリポジトリがクラウド リソースにアクセス トークンを要求できないようにする必要があります。 詳しくは、「OpenID Connect」をご覧ください。
-
クラウド プロバイダーが次の OIDC エンドポイントにアクセスできることを確認する必要があります。
https://HOSTNAME/_services/token/.well-known/openid-configurationhttps://HOSTNAME/_services/token/.well-known/jwks
メモ
Google Cloud Platform には、このようなエンドポイントに対して定義された固定の IP 範囲がありません。
-
JSON Web Token (JWT) に含まれる発行者要求の値が、パブリックにルーティング可能な URL に設定されていることを確認します。 詳しくは、「OpenID Connect」をご覧ください。
Google Cloud Workload ID プロバイダーの追加
GCP で OIDC ID プロバイダーを構成するには、次の構成を実行する必要があります。 これらの変更を行う手順については、GCP のドキュメントを参照してください。
- 新しい ID プールを作成します。
- マッピングを構成し、条件を追加します。
- 新しいプールをサービス アカウントに接続します。
ID プロバイダーを構成するためのその他のガイダンス:
- セキュリティ強化については、「クラウドとの OIDC 信頼の構成」を確認してください。 例については、「クラウド プロバイダーでのサブジェクトの構成」を参照してください。
- サービス アカウントを構成に使用できるようにするには、
roles/iam.workloadIdentityUserロールに割り当てる必要があります。 詳細については、GCP のドキュメントを参照してください。 - 使用する発行者 URL:
https://HOSTNAME/_services/token
GitHub Actions ワークフローの更新
OIDC のワークフローを更新するには、YAML に 2 つの変更を行う必要があります。
- トークンのアクセス許可設定を追加します。
- OIDC トークン (JWT) をクラウド アクセス トークンと交換するには、
google-github-actions/authアクションを使用します。
メモ
環境がワークフローまたは OIDC ポリシーで使われる場合は、セキュリティを強化するために環境に保護規則を追加することをお勧めします。 たとえば、環境のデプロイ規則を構成して、環境にデプロイできるブランチとタグを制限したり、環境シークレットにアクセスしたりできます。 詳しくは、「デプロイメント用の環境管理」をご覧ください。
アクセス許可設定の追加
GitHub の OIDC プロバイダーが実行ごとに JSON Web Token を生成できるようにするためには、permissions``id-token: write を用いた設定がジョブまたはワークフロー実行に必要です。
メモ
ワークフローのアクセス許可で id-token: write を設定しても、リソースへの変更または書き込みを行うアクセス許可はワークフローに付与されません。 そうではなく、ワークフローは、アクションまたはステップのための OIDC トークンを要求 (フェッチ) して使用 (設定) することのみが許可されます。 その後、このトークンは、有効期間の短いアクセス トークンを使って外部サービスで認証を行うために使われます。
必要なアクセス許可、構成例、高度なシナリオについて詳しくは、「OpenID Connect リファレンス」をご覧ください。
アクセス トークンの要求
`google-github-actions/auth` アクションは、GitHub OIDC プロバイダーから JWT を受け取り、その後、GCP にアクセス トークンを要求します。 詳細については、GCP の[ドキュメント](https://github.com/google-github-actions/auth)を参照してください。
この例には、アクションを使って GCP のサービス一覧を要求する Get_OIDC_ID_token というジョブがあります。
WORKLOAD-IDENTITY-PROVIDER: これを GCP の ID プロバイダーへのパスに置き換えます。 たとえば、projects/example-project-id/locations/global/workloadIdentityPools/name-of-pool/providers/name-of-providerのように指定します。SERVICE-ACCOUNT: これを GCP のサービス アカウント名に置き換えます。
このアクションでは、GitHubを使用して、 OIDC トークンを Google Cloud アクセス トークンと交換します。
# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# ドキュメントを参照してください。
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@f1e2d3c4b5a6f7e8d9c0b1a2c3d4e5f6a7b8c9d0'
with:
create_credentials_file: 'true'
workload_identity_provider: 'WORKLOAD-IDENTITY-PROVIDER'
service_account: 'SERVICE-ACCOUNT'
- id: 'gcloud'
name: 'gcloud'
run: |-
gcloud auth login --brief --cred-file="${{ steps.auth.outputs.credentials_file_path }}"
gcloud services list
# このワークフローはGitHubによって認定されていないアクションを使用します。
# それらはサードパーティによって提供され、
# 別個の利用規約、プライバシーポリシー、
# ドキュメントを参照してください。
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@f1e2d3c4b5a6f7e8d9c0b1a2c3d4e5f6a7b8c9d0'
with:
create_credentials_file: 'true'
workload_identity_provider: 'WORKLOAD-IDENTITY-PROVIDER'
service_account: 'SERVICE-ACCOUNT'
- id: 'gcloud'
name: 'gcloud'
run: |-
gcloud auth login --brief --cred-file="${{ steps.auth.outputs.credentials_file_path }}"
gcloud services list