注: GitHub ホステッド ランナーは、現在 GitHub Enterprise Server でサポートされていません。 GitHub public roadmap で、今後の計画的なサポートの詳細を確認できます。
概要
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 のドキュメントを参照してください。
- 新しい ID プールを作成します。
- マッピングを構成し、条件を追加します。
- 新しいプールをサービス アカウントに接続します。
ID プロバイダーを構成するためのその他のガイダンス:
- セキュリティ強化については、必ず「OpenID Connect を使ったセキュリティ強化について」をご確認ください。 例については、「OpenID Connect を使ったセキュリティ強化について」をご覧ください。
- サービス アカウントを構成に使用できるようにするには、
roles/iam.workloadIdentityUser
ロールに割り当てる必要があります。 詳細については、GCP のドキュメントを参照してください。 - 使う発行者の URL:
https://HOSTNAME/_services/token
GitHub Actions ワークフローを更新する
OIDC のワークフローを更新するには、YAML に 2 つの変更を行う必要があります。
- トークンのアクセス許可設定を追加します。
- この
google-github-actions/auth
アクションを使って、OIDC トークン (JWT) をクラウド アクセス トークンと交換します。
独自のカスタム保護規則を有効にして、サードパーティ サービスを使ったデプロイを制御できます。 たとえば、Datadog、Honeycomb、ServiceNow などのサービスを使って、お使いの GitHub Enterprise Server インスタンス へのデプロイに対して自動承認を提供できます。
アクセス許可設定の追加
ジョブまたはワークフローの実行には、id-token: write
の permissions
設定が必要です。 id-token
の permissions
設定が read
または none
の場合、OIDC JWT ID トークンを要求することはできません。
この id-token: write
設定により、次のいずれかの方法を使用して、GitHub の OIDC プロバイダーから JWT を要求できます。
- ランナーで環境変数を使用する (
ACTIONS_ID_TOKEN_REQUEST_URL
およびACTIONS_ID_TOKEN_REQUEST_TOKEN
)。 - アクション ツールキットから
getIDToken()
を使用する。
ワークフローの OIDC トークンをフェッチする必要がある場合は、ワークフロー レベルでアクセス許可を設定できます。 次に例を示します。
permissions: id-token: write # This is required for requesting the JWT contents: read # This is required for actions/checkout
permissions:
id-token: write # This is required for requesting the JWT
contents: read # This is required for actions/checkout
1 つのジョブに対して OIDC トークンのみをフェッチする必要がある場合は、そのジョブ内でこのアクセス許可を設定できます。 次に例を示します。
permissions: id-token: write # This is required for requesting the JWT
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 アクセス トークンと交換します。
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
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