このドキュメントでは、Google Distributed Cloud コネクテッド バージョン 1.12.0 で Workload Identity クラスタ認証を設定して使用する方法について説明します。Workload Identity クラスタ認証では、サービス アカウント キーの代わりに 有効期間の短いトークンと Workload Identity 連携を使用して、ワークロードが リソースに Google Cloud 安全にアクセスできるようにします。有効期間の短い認証情報は OAuth 2.0 アクセス トークンです。デフォルトでは、アクセス トークンは 1 時間後に期限切れになります。
Workload Identity クラスタ認証を使用すると、ワークロードは独自の Kubernetes ID を使用して リソースに直接アクセスしたり、 Google Cloud Google サービス アカウントの権限を借用したりできます。
Workload Identity クラスタ認証には、サービス アカウント キーを使用する場合と比べて主に次の 2 つのメリットがあります。
セキュリティの強化: サービス アカウント キーは、正しく管理されていないとセキュリティ リスクになります。OAuth 2.0 トークンと Workload Identity 連携は、サービス アカウント キーのベスト プラクティスの代替手段と見なされます。サービス アカウント トークンの詳細については、有効期間の短いサービス アカウント認証情報をご覧ください。Workload Identity 連携の詳細については、 Workload Identity 連携をご覧ください。
メンテナンスの削減: サービス アカウント キーは、より多くのメンテナンスが必要です。 これらのキーを定期的にローテーションして保護することは、管理するうえで非常に負担がかかります。
このページは、基盤となる技術インフラストラクチャのライフサイクルの設定、モニタリング、管理を行う管理者、アーキテクト、オペレーターを対象としています。 のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールと タスクをご覧ください。Google Cloud
クラスタ管理
このガイドでは、アプリケーションの Workload Identity 連携について説明します。 クラスタレベルの Workload Identity 連携は、Distributed Cloud connected クラスタで自動的に管理されます。
Distributed Cloud connected クラスタは、
Distributed Cloud Edge Container API を介して Google によって作成および管理されます。
gcloud edge-cloud container clusters create
コマンドまたは Google Cloud コンソールを使用します。
Distributed Cloud connected クラスタは、作成されたプロジェクトのフリートに自動的に登録されます。フリートを手動で登録する必要はありません。Workload Identity 連携プールは自動的に使用可能になり、
PROJECT_ID.svc.id.goog という形式になります。
始める前に
Workload Identity 連携を設定する前に、次の API がプロジェクトで有効になっていることを確認してください。 Google Cloud API を有効にする方法については、 サービスの有効化をご覧ください。
iam.googleapis.comsts.googleapis.comiamcredentials.googleapis.comgkehub.googleapis.com
次のコマンドライン ツールがインストールされていることを確認します。
- 最新バージョンの Google Cloud CLI(
gcloudとやり取りするためのコマンドライン ツールである Google Cloudが含まれる)。 kubectl
を操作するシェル環境として Cloud Shell を使用する場合は、これらのツールがインストールされます。Google Cloud
- 最新バージョンの Google Cloud CLI(
プロジェクトで使用する gcloud CLI が 初期化されていることを確認します。
プロジェクトに次の IAM ロールが割り当てられていることを確認します。 設定を行うには、次のロールが必要です。
- オーナー(
roles/owner)または - IAM セキュリティ管理者(
roles/iam.securityAdmin)とサービス アカウント管理者(roles/iam.serviceAccountAdmin)
- オーナー(
以降のセクションでは、サービス アカウントを作成し、Workload Identity クラスタ認証に必要なロールを付与します。
推奨: Workload Identity 連携によるリソースへの直接アクセス
Workload Identity 連携によるリソースへの直接アクセスでは、 Workload Identity 連携を使用して Kubernetes ServiceAccount に IAM ロールを付与し、リソースに直接アクセスできるようにします。 Google Cloud
| ID | 目的 | ロール |
|---|---|---|
| Kubernetes サービス アカウント |
ワークロードが使用する Kubernetes ID。必要な Google Cloud リソースにアクセスするために必要な
ロールをこの ID に付与します。この例では、roles/storage.objectViewer ロールと roles/logging.admin ロールが付与されます。 |
roles/storage.objectViewerroles/logging.admin |
代替方法: IAM サービス アカウントの権限借用
または、IAM サービス アカウントの権限借用を使用するように Kubernetes ServiceAccount を構成することもできます。
| サービス アカウント | 目的 | ロール |
|---|---|---|
| Google サービス アカウント | クラスタ内ワークロードが権限を借用する Google サービス アカウント。必要なリソースにアクセスするために必要なロールをこのサービス アカウントに付与します。 Google Cloud | アクセスするリソースによって異なります。 |
| Kubernetes サービス アカウント |
Google サービス アカウントの権限を借用する権限をこの ID に付与します。
この付与では、ロール roles/iam.workloadIdentityUser を使用します。
|
roles/iam.workloadIdentityUser
|
サービス アカウントを設定する
以降のセクションでは、必要な Kubernetes ServiceAccount を作成し、Workload Identity 連携によるリソースへの直接アクセスまたは Google サービス アカウントの権限借用を使用して、Workload Identity クラスタ認証に必要なロールを付与する手順について説明します。
Kubernetes ServiceAccount を作成する
クラスタで、
kubectl create
コマンドを使用して、Pod の Kubernetes ServiceAccount を作成します。名前空間内のデフォルトの ServiceAccount など、既存の ServiceAccount を使用することもできます。
kubectl create serviceaccount KSA_NAME --namespace NAMESPACE
次の値を置き換えます。
KSA_NAME: Kubernetes ServiceAccount の名前NAMESPACE: クラスタの名前空間
Workload Identity 連携を使用してリソースへの直接アクセス権を付与する
Identity and Access Management ロールを Kubernetes ServiceAccount ID に直接付与するには、次の操作を行います。
gcloud projects describe コマンドを使用して、数値のプロジェクト番号を確認します。
gcloud projects describe PROJECT_ID --format="value(projectNumber)"PROJECT_IDは、プロジェクトの ID に置き換えます。gcloud projects add-iam-policy-binding コマンドを使用して、必要なロールを Kubernetes ID プリンシパルに付与します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role=roles/storage.objectViewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member="principal://iam.gserviceaccount.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \ --role=roles/logging.admin次の値を置き換えます。
PROJECT_NUMBER: 数値のプロジェクト番号NAMESPACE: クラスタの名前空間KSA_NAME: Kubernetes ServiceAccount の名前
代替手段: IAM サービス アカウントの権限借用を使用してアクセス権を付与する
ワークロードに Google サービス アカウントの権限を借用させる場合は、次の操作を行います。
gcloud iam service-accounts create コマンドを使用して、Google サービス アカウントを作成します。
gcloud iam service-accounts create my-app-sa \ --project=PROJECT_IDPROJECT_IDは、プロジェクトの ID に置き換えます。gcloud projects add-iam-policy-binding コマンドを使用して、必要なロールを Google サービス アカウントに付与します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/storage.objectViewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:my-app-sa@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/logging.admingcloud iam service-accounts add-iam-policy-binding コマンドを使用して、Google サービス アカウントの権限を借用する権限を Kubernetes ServiceAccount に付与します。
gcloud iam service-accounts add-iam-policy-binding my-app-sa@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/iam.workloadIdentityUser \ --member="serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"次の値を置き換えます。
NAMESPACE: クラスタの名前空間KSA_NAME: Kubernetes ServiceAccount の名前
kubectl annotate コマンドを使用して Kubernetes ServiceAccount にアノテーションを付け、Google サービス アカウントにリンクします。
kubectl annotate serviceaccount \ --namespace NAMESPACE KSA_NAME \ iam.gke.io/gcp-service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com
ワークロードを構成する
Kubernetes ServiceAccount を使用して、射影されたトークン ボリュームをマウントするように Pod 仕様を更新します。Distributed Cloud connected クラスタは
Google Cloudの外部にあるため、認証情報構成ファイルも指定し、そのファイルを指すように
GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定する必要があります。
Google Cloud Pod 内の クライアント ライブラリは、Security Token Service API を介して
Kubernetes トークンを Google Cloud アクセス トークンと交換するためにこれらを使用します。
credential-configuration.jsonファイルを生成します。Workload Identity 連携によるリソースへの直接アクセスを使用しているか、IAM サービス アカウントの権限借用を使用しているかに応じて、コマンドを選択します。Workload Identity 連携によるリソースへの直接アクセス
gcloud iam workload-identity-pools create-cred-config コマンドを使用します。
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \ --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \ --credential-source-type=text \ --output-file=credential-configuration.jsonIAM サービス アカウントの権限借用を使用してアクセス権を付与する
gcloud iam workload-identity-pools create-cred-config コマンドを使用します。
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/providers/attestor \ --service-account=my-app-sa@PROJECT_ID.iam.gserviceaccount.com \ --credential-source-file=/var/run/secrets/tokens/gcp-ksa/token \ --credential-source-type=text \ --output-file=credential-configuration.jsonPROJECT_NUMBERは、使用する Google Cloud プロジェクト 番号に置き換えます。プロジェクト番号は、gcloud projects describe PROJECT_ID --format="value(projectNumber)"を実行して確認できます。kubectl create configmapコマンドを使用して、構成ファイルを保存する KubernetesConfigMapを作成します。kubectl create configmap CREDENTIAL_CONFIG_MAP \ --namespace NAMESPACE \ --from-file=credential-configuration.json次の値を置き換えます。
CREDENTIAL_CONFIG_MAP: 認証情報構成ファイルを含むConfigMapの名前NAMESPACE: クラスタの名前空間
次の YAML コンテンツで Pod 仕様を更新します。
spec: serviceAccountName: KSA_NAME containers: - name: MY_CONTAINER image: MY_IMAGE env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/tokens/gcp-creds/credential-configuration.json volumeMounts: - mountPath: /var/run/secrets/tokens/gcp-ksa name: gcp-ksa - mountPath: /var/run/secrets/tokens/gcp-creds name: gcp-creds readOnly: true volumes: - name: gcp-ksa projected: defaultMode: 0420 sources: - serviceAccountToken: path: token audience: PROJECT_ID.svc.id.goog expirationSeconds: 3600 - name: gcp-creds configMap: name: CREDENTIAL_CONFIG_MAP次の値を置き換えます。
KSA_NAME: Kubernetes ServiceAccount の名前MY_CONTAINER: コンテナの名前MY_IMAGE: イメージの名前
制限事項
Distributed Cloud connected で Workload Identity 連携を使用する場合、次の機能はサポートされていません。
- トークン交換プロセスにプロキシ サーバーを使用する
VPC Service Controls で Workload Identity 連携を使用する方法については、 次を ご覧ください: VPC Service Controls 統合を構成する。