このドキュメントでは、ベアメタル上の Google Distributed Cloud(ソフトウェアのみ)で Workload Identity クラスタ認証を設定して使用する方法について説明します。Workload Identity クラスタ認証では、サービス アカウント キーの代わりに有効期間の短いトークンと Workload Identity 連携を使用し、クラスタを作成して保護します。サービス アカウントの有効期間の短い認証情報は、OAuth 2.0 アクセス トークン形式になっています。デフォルトでは、アクセス トークンは 1 時間後に期限切れになります。ただし、イメージプル トークンは 12 時間後に期限切れになります。
Workload Identity クラスタ認証は、バージョン 1.30 以降のクラスタでのみ使用できます。
一方、クラスタの作成と保護の標準方法であるキーモードでは、ダウンロードされたサービス アカウント キーが使用されます。セルフマネージド(管理、ハイブリッド、スタンドアロン)クラスタを作成する場合は、ダウンロードしたキーのパスを指定します。キーは、クラスタとマネージド ユーザー クラスタに Secret として保存されます。デフォルトでは、サービス アカウント キーに有効期限はなく、正しく管理しないとセキュリティ上のリスクになります。
Workload Identity クラスタ認証には、サービス アカウント キーを使用する場合と比べて主に次の 2 つのメリットがあります。
セキュリティの強化: サービス アカウント キーは、正しく管理されていないとセキュリティ リスクになります。OAuth 2.0 トークンと Workload Identity 連携は、サービス アカウント キーのベスト プラクティスの代替手段と見なされます。サービス アカウント トークンの詳細については、有効期間の短いサービス アカウント認証情報をご覧ください。Workload Identity 連携の詳細については、Workload Identity 連携をご覧ください。
メンテナンスの削減: サービス アカウント キーは、より多くのメンテナンスが必要です。これらのキーを定期的にローテーションして保護することは、管理するうえで非常に負担がかかります。
始める前に
次のセクションでは、サービス アカウントを作成し、Workload Identity クラスタ認証に必要なロールを付与します。このドキュメントの設定手順は、 Google Cloud リソースを設定するの手順に代わるものではなく、標準の Google Distributed Cloud ソフトウェアのみのインストールの前提条件に加えて必要となります。Workload Identity クラスタ認証に必要なサービス アカウントは、 Google Cloud リソースを設定するで説明されているサービス アカウントに似ていますが、一意の名前が付けられているため、デフォルトのサービス アカウント キーを使用するクラスタと競合しません。
このページは、基盤となる技術インフラストラクチャのライフサイクルの設定、モニタリング、管理を行う管理者、アーキテクト、オペレーターを対象としています。Google Cloud のコンテンツで参照する一般的なロールとタスク例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。
次の表に、Workload Identity クラスタ認証に必要なサービス アカウントを示します。
サービス アカウント | 目的 | ロール |
---|---|---|
ADMIN_SA |
このサービス アカウントを使用してトークンを生成します。各トークンには、サービス アカウントのロールに関連付けられた権限があります。 |
roles/gkehub.admin roles/logging.admin roles/monitoring.admin roles/monitoring.dashboardEditor roles/iam.serviceAccountAdmin roles/iam.serviceAccountTokenCreator
|
baremetal-controller |
Connect Agent は、このサービス アカウントを使用して、クラスタと Google Cloud 間の接続を維持し、 フリートにクラスタを登録します。このサービス アカウントは、baremetal-gcr サービス アカウントのトークンも更新します。 |
roles/gkehub.admin roles/monitoring.dashboardEditor roles/serviceusage.serviceUsageViewer
|
baremetal-cloud-ops |
Stackdriver Agent は、このサービス アカウントを使用して、クラスタから Cloud Logging と Cloud Monitoring にログと指標をエクスポートします。 |
roles/logging.logWriter roles/monitoring.metricWriter roles/stackdriver.resourceMetadata.writer roles/opsconfigmonitoring.resourceMetadata.writer roles/monitoring.dashboardEditor roles/monitoring.viewer roles/serviceusage.serviceUsageViewer roles/kubernetesmetadata.publisher
|
baremetal-gcr |
Google Distributed Cloud は、このサービス アカウントを使用して Container Registry からコンテナ イメージをダウンロードします。 | なし |
Workload Identity クラスタ認証用のサービス アカウントを作成して構成する
以降のセクションでは、必要なサービス アカウントを作成し、Workload Identity クラスタ認証に必要なロールを付与する手順について説明します。サービス アカウントと必要なロールの一覧については、前のセクションの表をご覧ください。
サービス アカウントを作成する
Workload Identity クラスタ認証のサービス アカウントを作成するには、次の操作を行います。
管理ワークステーションで Google Cloud CLI にログインします。
gcloud auth login
必要に応じて、管理サービス アカウントを作成します。
ADMIN_SA
サービス アカウントの名前は任意です。前のセクションの表に示されているロールが付与されている場合は、既存のサービス アカウントを使用することもできますが、最小権限の原則に反するためおすすめしません。gcloud iam service-accounts create ADMIN_SA \ --project=PROJECT_ID
PROJECT_ID
は、Google Cloud プロジェクトの ID に置き換えます。Workload Identity クラスタ認証用の標準サービス アカウントを作成します。
Workload Identity クラスタ認証の標準サービス アカウントには、必要に応じてカスタマイズできる事前定義された名前があります。
gcloud iam service-accounts create baremetal-controller \ --project=PROJECT_ID gcloud iam service-accounts create baremetal-cloud-ops \ --project=PROJECT_ID gcloud iam service-accounts create baremetal-gcr \ --project=PROJECT_ID
PROJECT_ID
は、Google Cloud プロジェクトの ID に置き換えます。
サービス アカウントの Identity and Access Management ポリシー バインディングを追加する
ADMIN_SA
サービス アカウントに必要なロールの IAM ポリシー バインディングを追加します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/gkehub.admin gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/logging.admin gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.admin gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.dashboardEditor gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountAdmin gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
baremetal-controller
サービス アカウントに必要なロールの IAM ポリシー バインディングを追加します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/gkehub.admin gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.dashboardEditor gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/serviceusage.serviceUsageViewer
baremetal-cloud-ops
サービス アカウントに必要なロールの IAM ポリシー バインディングを追加します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/logging.logWriter gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.dashboardEditor gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.metricWriter gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/opsconfigmonitoring.resourceMetadata.writer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/stackdriver.resourceMetadata.writer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/monitoring.viewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/serviceusage.serviceUsageViewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/kubernetesmetadata.publisher
baremetal-controller
サービス アカウントに、baremetal-gcr
サービス アカウントに代わってアクセス トークンを生成する権限を付与します。gcloud iam service-accounts add-iam-policy-binding \ baremetal-gcr@PROJECT_ID.iam.gserviceaccount.com \ --member=serviceAccount:baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
クラスタの Workload Identity 連携を構成する
Workload Identity Federation for GKE を使用して Google Cloud のアクセス権を付与するには、アプリケーションの ID に対応するプリンシパルに特定のGoogle Cloud リソースに対するアクセス権を付与する IAM 許可ポリシーを作成します。この場合、Workload Identity 連携はクラスタ内の特定のオペレーターへのアクセス権を付与します。Workload Identity Federation for GKE の詳細については、IAM ドキュメントの Workload Identity 連携をご覧ください。
クラスタ オペレーターの IAM ポリシー バインディングを追加する
次のコマンドは、anthos-cluster-operator
Kubernetes サービス アカウントに、baremetal-controller
サービス アカウントの権限借用と、クラスタに代わって Google Cloud リソースの操作を行う権限を付与します。
Workload Identity クラスタ認証用に構成されているクラスタ(または Workload Identity クラスタ認証を使用する予定のクラスタ)ごとに、ブートストラップ クラスタを含むクラスタ内の
anthos-cluster-operator
にbaremetal-controller
サービス アカウントの権限を付与します。次のコマンドでは、
principalSet
は Workload Identity プールと、kube-system
Namespace 内の Kubernetes サービス アカウントanthos-cluster-operator
で構成されています。gcloud iam service-accounts add-iam-policy-binding \ baremetal-controller@PROJECT_ID.iam.gserviceaccount.com \ --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/anthos-cluster-operator \ --role=roles/iam.workloadIdentityUser \ --project=PROJECT_ID
次のように置き換えます。
PROJECT_NUM
: 自動的に生成されるプロジェクトに対する固有識別子。REGION
: クラスタのフリート メンバーシップのロケーション。デフォルトはglobal
です。詳細については、フリート メンバーシップのロケーションをご覧ください。CLUSTER_NAME
: クラスタの名前。デフォルトでは、ブートストラップ クラスタ名はbmctl-MACHINE_NAME
です。
baremetal-controller
サービス アカウントのポリシー バインディングを確認します。gcloud iam service-accounts get-iam-policy \ baremetal-controller@PROJECT_ID.iam.gserviceaccount.com
レスポンスは次のようになります。
bindings: - members: - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/anthos-cluster-operator - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/anthos-cluster-operator - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/anthos-cluster-operator role: roles/iam.workloadIdentityUser etag: BwYoN3QLig0= version: 1
Google Cloud Observability オペレーターの IAM ポリシー バインディングを追加する
次のコマンドは、次の Google Cloud Observability Kubernetes サービス アカウントに、baremetal-cloud-ops
サービス アカウントの権限借用と、クラスタに代わって Google Cloud リソースの操作を行う権限を付与します。
cloud-audit-logging
gke-metrics-agent
kubestore-collector
metadata-agent
stackdriver-log-forwarder
Workload Identity クラスタ認証用に構成されているクラスタ(または Workload Identity クラスタ認証を使用する予定のクラスタ)ごとに、ブートストラップ クラスタを含むクラスタ内の Google Cloud Observability オペレーターに
baremetal-cloud-ops
サービス アカウントの権限を付与します。次の各コマンドでは、
principalSet
は Workload Identity プールと、kube-system
Namespace 内の Kubernetes サービス アカウント(cloud-audit-logging
など)で構成されています。gcloud iam service-accounts add-iam-policy-binding \ baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/cloud-audit-logging \ --role=roles/iam.workloadIdentityUser \ --project=PROJECT_ID gcloud iam service-accounts add-iam-policy-binding \ baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/gke-metrics-agent \ --role=roles/iam.workloadIdentityUser \ --project=PROJECT_ID gcloud iam service-accounts add-iam-policy-binding \ baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/kubestore-collector \ --role=roles/iam.workloadIdentityUser \ --project=PROJECT_ID gcloud iam service-accounts add-iam-policy-binding \ baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/metadata-agent \ --role=roles/iam.workloadIdentityUser \ --project=PROJECT_ID gcloud iam service-accounts add-iam-policy-binding \ baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com \ --member=principalSet://iam.googleapis.com/projects/PROJECT_NUM/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/attribute.fleetclusteridentity/projects/PROJECT_ID/locations/REGION/memberships/CLUSTER_NAME/ns/kube-system/sa/stackdriver-log-forwarder \ --role=roles/iam.workloadIdentityUser \ --project=PROJECT_ID
baremetal-cloud-ops
サービス アカウントのポリシー バインディングを確認します。gcloud iam service-accounts get-iam-policy \ baremetal-cloud-ops@PROJECT_ID.iam.gserviceaccount.com
レスポンスは次のようになります。
bindings: - members: - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/cloud-audit-logging - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/gke-metrics-agent - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/kubestore-collector - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/metadata-agent - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/bmctl-admin-ws/kube-system/stackdriver-log-forwarder - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/cloud-audit-logging - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/gke-metrics-agent - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/kubestore-collector - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/metadata-agent - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/admin-cluster/kube-system/stackdriver-log-forwarder - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/cloud-audit-logging - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/gke-metrics-agent - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/kubestore-collector - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/metadata-agent - principalSet://iam.googleapis.com/projects/112233445566/locations/global/workloadIdentityPools/my-project.svc.id.goog/attribute.fleetclusteridentity/user-cluster/kube-system/stackdriver-log-forwarder role: roles/iam.workloadIdentityUser etag: BwYhT4gL-dY= version: 1
クラスタ構成
Workload Identity クラスタ認証を使用するクラスタとのクラスタ構成の最も明らかな違いは、ダウンロードしたサービス アカウント キーのパスを指定しないことです。
構成ファイルにクラスタ設定を入力する場合は、次の例に示すように、認証情報セクションのサービス アカウント キーパスを空白のままにします。
gcrKeyPath: sshPrivateKeyPath: /home/USERNAME/.ssh/id_rsa gkeConnectAgentServiceAccountKeyPath: gkeConnectRegisterServiceAccountKeyPath: cloudOperationsServiceAccountKeyPath: --- apiVersion: v1 kind: Namespace metadata: name: cluster-CLUSTER_NAME --- apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: cluster-CLUSTER_NAME spec: type: admin profile: default anthosBareMetalVersion: 1.30.0-gke.1930 ...
必要に応じて、Workload Identity クラスタ認証サービス アカウントにカスタム名を設定します。
カスタム名を指定すると、既存のサービス アカウントを使用できます。複数のサービス アカウントに同じカスタム名を指定すると、サービス アカウントを統合できます。
apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: cluster-CLUSTER_NAME annotations: baremetal.cluster.gke.io/controller-service-account: "CUSTOM_CONTROLLER_GSA" baremetal.cluster.gke.io/cloud-ops-service-account: "CUSTOM_CLOUD_OPS_GSA" baremetal.cluster.gke.io/gcr-service-account: "CUSTOM_GCR_GSA" spec: type: admin profile: default anthosBareMetalVersion: 1.30.0-gke.1930 ...
クラスタ オペレーション
Workload Identity クラスタ認証を使用するクラスタを作成、アップグレード、削除する準備ができたら、次の手順を使用します。
Google Cloud CLI にログインします。
gcloud auth login
管理ワークステーションで、
ADMIN_SA
サービス アカウントのキーを作成してダウンロードします。gcloud iam service-accounts keys create TMP_KEY_FILE_PATH \ --iam-account=ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com
TMP_KEY_FILE_PATH
は、ダウンロードしたキーファイルのパスとファイル名に置き換えます。ADMIN_SA
サービス アカウントを使用して、 Google Cloud へのアクセスを承認します。gcloud auth activate-service-account ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com \ --key-file=TMP_KEY_FILE_PATH
ダウンロードした JSON キーファイルを削除します。
rm TMP_KEY_FILE_PATH
管理ワークステーションで、
ADMIN_SA
サービス アカウントによって作成されたアクセス トークンの値を使用してGCP_ACCESS_TOKEN
環境変数を作成します。export GCP_ACCESS_TOKEN=$(gcloud auth print-access-token \ --impersonate-service-account=ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com)
デフォルトでは、アクセス トークンの有効期間は 1 時間です。
トークンが
ADMIN_SA
サービス アカウントによって生成され、有効期限が正しいことを確認します。curl "https://oauth2.googleapis.com/tokeninfo?access_token=$GCP_ACCESS_TOKEN"
レスポンスには、次のような行が含まれます。
... "expires_in": "3582", "email": "ADMIN_SA@PROJECT_ID.iam.gserviceaccount.com)", ...
有効期限の値は秒単位で、
3600
未満にする必要があります。これは、トークンが 1 時間未満で期限切れになることを示します。bmctl
コマンドを実行して、クラスタを作成、アップグレード、削除します。bmctl
は、GCP_ACCESS_TOKEN
環境変数が設定されていることを検出すると、トークン検証を実行します。トークンが有効な場合、bmctl
はクラスタ オペレーションにトークンを使用します。Workload Identity クラスタ認証を使用するクラスタの場合、次のコマンドでは、
GCP_ACCESS_TOKEN
環境変数を有効かつアクティブなアクセス トークンに設定する必要があります。bmctl create cluster -c CLUSTER_NAME
bmctl reset cluster -c CLUSTER_NAME
bmctl upgrade cluster -c CLUSTER_NAME
制限事項
Workload Identity クラスタ認証はプレビュー版であるため、次の機能はサポートされていません。
- プロキシ サーバーの使用
- VPC Service Controls