このドキュメントでは、Google Distributed Cloud コネクテッドで 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 連携をご覧ください。
メンテナンスの削減: サービス アカウント キーは、より多くのメンテナンスが必要です。これらの鍵を定期的にローテーションして保護することは、管理するうえで非常に負担がかかります。
このページは、基盤となる技術インフラストラクチャのライフサイクルの設定、モニタリング、管理を行う管理者、アーキテクト、オペレーターを対象としています。Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールとタスクをご覧ください。
クラスタ管理
このガイドでは、アプリケーションの Workload Identity 連携について説明します。クラスタレベルの Workload Identity 連携は、Distributed Cloud 接続クラスタで自動的に管理されます。
Distributed Cloud 接続クラスタは、Distributed Cloud Edge Container API を介して Google によって作成および管理されます。これは、gcloud edge-cloud container clusters create コマンドを使用するか、 Google Cloud コンソールで行います。
Distributed Cloud 接続クラスタは、作成されたプロジェクトのフリートに自動的に登録されます。手動でフリート登録を行う必要はありません。Workload Identity 連携プールは自動的に使用可能になり、PROJECT_ID.svc.id.goog 形式になります。
始める前に
Workload Identity 連携を設定する前に、 Google Cloud プロジェクトで次の API が有効になっていることを確認します。API の有効化については、サービスの有効化をご覧ください。
iam.googleapis.comsts.googleapis.comiamcredentials.googleapis.comgkehub.googleapis.com
次のコマンドライン ツールがインストールされていることを確認します。
- Google Cloud CLI の最新バージョン。 Google Cloudとやり取りするためのコマンドライン ツールである
gcloudが含まれています。 kubectl
Google Cloudを操作するシェル環境として Cloud Shell を使用する場合は、これらのツールがインストールされます。
- Google Cloud CLI の最新バージョン。 Google Cloudとやり取りするためのコマンドライン ツールである
プロジェクトで使用する 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。この ID に、必要な Google Cloud リソースにアクセスするために必要なロールを付与します。この例では、roles/storage.objectViewer ロールと roles/logging.admin ロールを付与しています。 |
roles/storage.objectViewerroles/logging.admin |
代替手段: IAM サービス アカウントの権限借用
または、IAM サービス アカウントの権限借用を使用するように Kubernetes ServiceAccount を構成することもできます。
| サービス アカウント | 目的 | ロール |
|---|---|---|
| Google サービス アカウント | クラスタ内ワークロードが権限を借用する Google サービス アカウント。このサービス アカウントに、必要な Google Cloudリソースにアクセスするために必要なロールを付与します。 | アクセスされるリソースによって異なります。 |
| Kubernetes サービス アカウント |
この ID に Google サービス アカウントの権限を借用する権限を付与します。この付与では、ロール roles/iam.workloadIdentityUser を使用します。 |
roles/iam.workloadIdentityUser
|
サービス アカウントを設定する
以降のセクションでは、Workload Identity 連携のリソースへの直接アクセスまたは Google サービス アカウントの権限借用を使用して、Workload Identity クラスタ認証に必要な Kubernetes ServiceAccount を作成し、必要なロールを付与する手順について説明します。
Kubernetes ServiceAccount を作成する
クラスタで、kubectl create コマンドを使用して、Pod の Kubernetes ServiceAccount を作成します。Namespace のデフォルトの ServiceAccount など、既存の ServiceAccount を使用することもできます。
kubectl create serviceaccount KSA_NAME --namespace NAMESPACE
次の値を置き換えます。
KSA_NAME: Kubernetes ServiceAccount の名前NAMESPACE: クラスタの Namespace
Workload Identity 連携を使用してリソースへの直接アクセス権を付与する
Kubernetes ServiceAccount ID に Identity and Access Management ロールを直接付与する手順は次のとおりです。
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: クラスタの NamespaceKSA_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 コマンドを使用して、Kubernetes ServiceAccount に Google サービス アカウントの権限を借用する権限を付与します。
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: クラスタの NamespaceKSA_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 接続クラスタはGoogle Cloudの外部にあるため、認証情報構成ファイルも指定し、そのファイルを指すように GOOGLE_APPLICATION_CREDENTIALS 環境変数を設定する必要があります。Pod 内のGoogle Cloud クライアント ライブラリは、これらを使用して 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: クラスタの 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 連携を使用する場合、次の機能はサポートされていません。
- トークン交換プロセスにプロキシ サーバーを使用する
Workload Identity 連携と VPC Service Controls の使用については、VPC Service Controls の統合を構成するをご覧ください。