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

キーなしの API 認証 - サービス アカウント キーを必要としない Workload Identity 連携によるクラウド セキュリティの向上

#security

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

多くの組織が、オンプレミスやクラウドなど、複数のプラットフォームで動作するアプリケーションを持っています。Google Cloud Platform(GCP)API を呼び出すアプリケーションにおいては、管理者がよく直面する課題として、GCP への認証に使用される有効期間が長いサービス アカウント キーの安全性の確保があります。その例として、次のようなアプリケーションが挙げられます。

  • Google Cloud Storage に保存されている機密データセットにアクセスする、AWS または Azure で実行される分析ワークロード

  • Terraform などの外部ツールを使用して GCP 上のプロジェクトや VM をプロビジョニングする CI / CD パイプライン

  • 1 つ以上の GCP サービスに接続する GKE で実行されるマイクロサービス ベースのアプリ

こうしたアプリケーションは、GCP API にアクセスする際にサービス アカウント キーに依存するため、それらの認証情報を作成、管理することはもちろん、有効期間が長いサービスキーの十分な保護、安全な配布、頻繁なローテーションを行う安全な保護対策を講じることも必要です。認証情報が不正使用されると、不正な行為者はその情報を使用して組織のリソースやデータにアクセスし、ビジネスを危険にさらす可能性があります。クラウドの利用やマルチクラウドのアプリケーションのデプロイを進めるにつれて、サービス アカウント キーの管理はさらに難しくなるため、何千ものサービス アカウントの認証情報を自分で管理したり、サービス アカウント キーを保護するためにサードパーティのソリューションに投資したりといった好ましくない状況に陥ります。

サービス アカウント キーに関する課題を軽減するための最善の方法は、サービス アカウント キーを一切使用しないことです。Google Cloud の新機能である Workload Identity 連携を使えば、これを実現できます。

Workload Identity 連携の概要と設定方法について

Workload Identity 連携は、キーなしの新しいアプリケーション認証メカニズムであり、オンプレミス、AWS、Azure で実行するワークロードは、外部 ID プロバイダ(IdP)と連携し、サービス アカウント キーを使用せずに Google Cloud リソースを呼び出すことができます。ワークロードはセキュリティ トークン サービス(STS)エンドポイントを呼び出して、IdP から取得した認証トークンを有効期間が短い GCP アクセス トークンと交換します。そして、このアクセス トークンを使用してサービス アカウントになりすまして、GCP リソースにアクセスするサービス アカウントの権限を継承します。

workload identity federation.jpg

Workload Identity 連携の設定手順は次のとおりです。

  1. GCP プロジェクトで、Workload Identity プールのリソース オブジェクトを作成します。Workload Identity プールは、キーを必要としない連携メカニズムを容易にするために構築された新しいコンポーネントです。このプールは、外部 ID のコレクション用のコンテナとして機能します。

  2. 1 つ以上の IdP を Workload Identity プールに接続します。IdP は、OIDC プロトコルをサポートする AWS や Azure のアカウントまたはプロバイダのいずれかになります(SAML もまもなくサポート)。

  3. 次の 2 つの IAM ポリシーを定義して、プールにリソースへのアクセス権を付与します。

    1. サービス アカウントに、目的のリソースへのアクセスを許可するポリシー。新しいサービス アカウントを作成することも、既存のサービス アカウントを再利用することもできます。

    2. プールの ID が、サービス アカウントになりすますことを許可するポリシー。これらのポリシーの作成に関する詳しい情報については、ドキュメントをご覧ください。

  1. ワークロードを STS エンドポイントに対して認証し、サービス アカウントになりすまして、目的の GCP API を呼び出します。

Workload Identity 連携の設定方法やポリシーの構成方法の詳細については、こちらをご確認ください。

認証クライアント ライブラリとの統合

Google Cloud は、アプリケーション デベロッパーが最小限のコーディングで認証プロセスを簡素化して保護できるよう、多くの言語で豊富なクライアント ライブラリをサポートしているため、これらのライブラリを使用することを強くおすすめしています。

ここでは、デベロッパーが Google Cloud クライアント ライブラリを使用して Workload Identity プールを使い始められるようにするための 2 つのステップをご紹介します。

Workload Identity プールのプロバイダ用に、認証情報の構成ファイルを生成します。

  gcloud iam workload-identity-pools create-cred-config \
# Workload identity pool provider resource name.
projects/project-number/locations/global/workloadIdentityPools/pool-id/providers/aws-pid \
# Service account to impersonate.
--service-account gsa-name@project-id.iam.gserviceaccount.com \
# Generate configuration file for AWS VM.
--aws \
# Output file location.
--output-file credentials.json

生成された認証情報の構成ファイルを指定するように、VM の GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定します。

  export GOOGLE_APPLICATION_CREDENTIALS=/absolute/path/to/credentials.json

この Python スニペットに示されているように、Workload Identity プールを使用して Google API を呼び出すことができます。

  from google.cloud import storage

import google.auth

scopes=['https://www.googleapis.com/auth/cloud-platform']
credentials, project = google.auth.default(scopes=scopes)

# Automatically initializes credentials using credentials.json config file.
client = storage.Client(project=project, credentials=credentials)
# Lookup bucket information.
bucket = client.get_bucket('test-gcs-bucket')
print("Bucket {} retrieved.".format(bucket.name))

IdP のカスタム属性(クレーム)を使用することで、きめ細かい IAM アクセス ポリシーを定義してワークロードがリソースにアクセスするのを許可または拒否したり、Cloud Audit Logs を使用してそれらの呼び出しを監査したりすることができます。

クラウドのセキュリティ体制の向上

サービス アカウント キーから、Workload Identity 連携によって実現するキーなしのアプリケーション認証メカニズムに移行することで、アプリケーション認証の際の有効期間の長いキーの管理に伴うリスクを環境全体で軽減できます。この新しい機能により、デベロッパーはより安全なアプリケーションを構築し、GCP サービスへのアクセスを適切に保護できます。Workload Identity 連携の詳細については、Google のドキュメントをご覧ください。

-Google Cloud プロダクト マネージャー Vignesh Rajamani