アイデンティティとセキュリティ

GitHub Actions からのキーなしの認証の有効化

1 GitHub Actions.jpg

※この投稿は米国時間 2021 年 12 月 7 日に、Google Cloud blog に投稿されたものの抄訳です。

GitHub Actions は Google Cloud の多くのお客様とデベロッパーの間で人気があるサードパーティ CI / CD ソリューションです。GitHub Actions ワークフローで Google Cloud 上でのリソースの読み取りや変更が必要な場合(Artifact Registry へのコンテナの公開や Cloud Run での新しいサービスのデプロイなど)、最初に認証をしなくてはなりません。

GitHub Actions から Google Cloud への従来の認証では、有効期間が長い JSON サービス アカウント キーのエクスポートと保存が必要でした。よって、ID 管理をするためにシークレット管理も必要でした。これは、サービス アカウント キー漏洩時のセキュリティ リスクの増大をもたらすだけではありません。デベロッパーの組織が、組織ポリシーの制約(constraints/iam.disableServiceAccountKeyCreation など)により、一般的なセキュリティのベスト プラクティスとしてサービス アカウント キーの作成を無効にした場合、デベロッパーが GitHub Actions から Google Cloud に認証できなくなることも意味します。

しかし今は、GitHub が GitHub Actions ワークフローに OIDC トークンを導入したため、Workload Identity 連携を使用して GitHub Actions から Google Cloud に認証できるようになりました。そして、有効期間が長い JSON サービス アカウント キーのエクスポートも不要になりました。

2 GitHub Actions.jpg
  • 詳細なスコープ Workload Identity プールとプロバイダは、OIDC トークンと Google Cloud で利用可能な権限の間に詳細な属性マッピングを定義できます。JSON サービス アカウント キーはアクセス可能とアクセス不能のいずれかである一方、Workload Identity 連携は、ダウンストリームの OIDC トークンのプロパティに基づいて認証を選択的に許可するように構成できます。GitHub Actions の場合は、たとえば、特定のリポジトリ、ユーザー名、ブランチ名、パブリッシュされたクレームに認証を制限できます。また、CEL を使用して、より複雑で複合的な制約を組み合わせて構築できます。

  • 有効時間が短い認証情報 JSON サービス アカウント キーと異なり、Workload Identity 連携は有効時間の短い OAuth 2.0 または JWT 認証情報を生成します。デフォルトでは、これらの認証情報は作成から 1 時間後に自動的に期限が切れます。これにより、悪意のある人物が不正使用された認証情報を利用できる時間を潜在的に短縮します。

  • 最小限の管理オーバーヘッド JSON サービス アカウント キーは、安全に保存、ローテーション、管理する必要があります。これには、たとえ小規模であっても労力を要し、エラーも発生しやすい傾向にあります。Workload Identity 連携は有効時間の短い認証情報を使用するため、最初の構成以外にローテーションや管理の必要なシークレットは存在しません。

新しい GitHub Action – auth

Workload Identity 連携による Google Cloud への GitHub Actions ワークフローの認証と承認のプロセスを容易にするため、新しい GitHub Action の auth をご用意しました。auth アクションが、増大を続ける Google GitHub Actions コレクションに加わり、Google Cloud への認証の設定と構成をシンプルにします。

  steps:
- id: 'auth'
  name: 'Authenticate to Google Cloud'
  uses: 'google-github-actions/auth@v0.4.0'
  with:
    workload_identity_provider: 'projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider'
    service_account: 'my-service-account@my-project.iam.gserviceaccount.com'
  steps:
- id: auth
  uses: google-github-actions/auth@v0.4.0
  with:
    workload_identity_provider: 'projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider'
    service_account: 'my-service-account@my-project.iam.gserviceaccount.com'

- id: get-gke-credentials
  uses: google-github-actions/get-gke-credentials@v0.4.0
  with:
    cluster_name: my-cluster
    location: us-central1-a

- id: get-pods
  run: kubectl get pods

アプリケーションのデフォルト認証情報をサポートしていないサードパーティのツールを使用している場合や、Google Cloud API を curl で手動で呼び出す場合、auth GitHub Action は、今後のステップでの使用のために、OAuth 2.0 トークンと JWT を作成できます。次の例では、有効時間の短い OAuth 2.0 アクセス トークンを作成し、そのトークンを使用して、Google Secret Manager から curl でシークレットにアクセスします。

  steps:
- id: 'auth'
  name: 'Authenticate to Google Cloud'
  uses: 'google-github-actions/auth@v0.4.0'
  with:
    token_format: 'access_token'
    workload_identity_provider: 'projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider'
    service_account: 'my-service-account@my-project.iam.gserviceaccount.com'

- name: 'Access secret'
  run: |-
    curl https://secretmanager.googleapis.com/v1/projects/my-project/secrets/my-secret/versions/1:access \
      --header "Authorization: Bearer ${{ steps.auth.outputs.access_token }}"

移行を簡単にして、以前のワークフローをサポートするため、auth GitHub Action は、Google Cloud サービス アカウント キー JSON ファイルによる認証にも対応しています。

  steps:
- id: 'auth'
  name: 'Authenticate to Google Cloud'
  uses: `google-github-actions/auth@v0.4.0'
  with:
    credentials_json: '${{ secrets.GOOGLE_CREDENTIALS }}'

auth GitHub Action の詳細と例を google-github-actions/auth でご確認ください。

GitHub Actions の ID 連携の設定

新しい GitHub Actions auth アクションを使用するには、Workload Identity プールと Workload Identity プロバイダを作成して Workload Identity 連携を設定および構成する必要があります。

  gcloud iam workload-identity-pools create "my-pool" \
  --project="${PROJECT_ID}" \
  --location="global" \
  --display-name="Demo pool"

 gcloud iam workload-identity-pools providers create-oidc "my-provider" \
  --project="${PROJECT_ID}" \
  --location="global" \
  --workload-identity-pool="my-pool" \
  --display-name="Demo provider" \
  --attribute-mapping="google.subject=assertion.sub,attribute.actor=assertion.actor,attribute.aud=assertion.aud" \
  --issuer-uri="https://token.actions.githubusercontent.com"

属性マッピングは、GitHub Actions JWT のクレームを、リクエストについて行うことのできるアサーションにマップします(リポジトリや GitHub Action を呼び出すプリンシパルの GitHub ユーザー名など)。これらを使用して、--attribute-condition フラグで認証をさらに制限できます。たとえば、属性の repository 値をマップして、認証を特定のリポジトリに制限するためにこの値を後で使用することができます。

  --attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository"

最後に、Workload Identity プロバイダからの認証について、目的のサービス アカウントの権限の借用を許可します。

  gcloud iam service-accounts add-iam-policy-binding "my-service-account@${PROJECT_ID}.iam.gserviceaccount.com" \
  --project="${PROJECT_ID}" \
  --role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/${WORKLOAD_IDENTITY_POOL_ID}/attribute.repository/my-org/my-repo"

その他の構成オプションについては、Workload Identity 連携ドキュメントをご覧ください。Terraform を使用してインフラストラクチャのプロビジョニングを自動化している場合は、GitHub OIDC Terraform モジュールもご確認ください。

「見えないセキュリティ」に向けて

長期間有効な JSON サービス アカウント キーを使用せずに GitHub Action から Google Cloud に認証することは、魔法のように見えるかもしれません。しかしこれは、「見えないセキュリティ」を実現し Google のプラットフォームをデフォルトで保護するという、Google Cloud の現在の取り組みを集約するものです。GitHub Actions で長期間有効な JSON サービス アカウント キーに代わり Workload Identity 連携を使用することで、セキュリティと監査対応力が向上します。

はじめに、auth GitHub Action を今すぐご覧ください。


- デベロッパー アドボケイト兼プロダクト マネージャー Seth Vargo

- ソリューション アーキテクト Bharath Baiju