ビュー:
プロファイル適用性: レベル1
GKEクラスターのノードを実行するために、Compute Engineのデフォルトのサービスアカウントを使用するのではなく、最小限の権限を持つサービスアカウントを作成して使用してください。ノードが侵害された場合、不必要な権限が悪用される可能性があります。
GCPサービスアカウント (Kubernetes ServiceAccountとは異なる) は、インスタンスやアプリケーションがGCP APIリクエストを実行するために使用できるアイデンティティです。このアイデンティティは、仮想マシンインスタンスを他のGoogle Cloud Platformサービスに識別するために使用されます。デフォルトでは、Kubernetes EngineノードはCompute Engineのデフォルトサービスアカウントを使用します。
このアカウントは、アクセススコープによって定義されるデフォルトで広範なアクセス権を持っており、VM上のさまざまなアプリケーションにとって便利ですが、Kubernetes Engineクラスターを実行するために必要な権限よりも多くの権限を持っています。
最小限の権限を持つサービスアカウントを作成し、Compute Engineのデフォルトサービスアカウントを使用する代わりにKubernetes Engineクラスターを実行するために使用し、各Kubernetesワークロードに対して個別のサービスアカウントを作成してください (推奨事項5.2.2を参照)。
Kubernetes Engineは、最低限、ノードサービスアカウントにmonitoring.viewermonitoring.metricWriterlogging.logWriterのロールが必要です。ノードがGCRからイメージを取得するために追加のロールが必要になる場合があります。
注意
注意
デフォルトでは、新しいクラスターを作成する際に、ノードはCompute Engineのデフォルトサービスアカウントを使用します。

影響

インスタンスには、すべてのGoogle Cloud APIsへの完全なアクセスを許可するために、cloud-platform scopeプラットフォームスコープが自動的に付与されます。これは、インスタンスのIAM権限がサービスアカウントのIAMロールによって完全に決定されるようにするためです。
したがって、KubernetesワークロードがGoogle APIを使用してアクションを実行するためにクラスターアクセススコープを使用していた場合、サービスアカウントの権限で許可されていない場合、もはや実行できない可能性があります。修正するには、推奨事項5.2.2に従ってください。ここに記載されているサービスアカウントのロールは、クラスターを実行するために必要な最小限のものです。
Google Container Registry (GCR) のプライベートインスタンスからプルするには、追加のロールが必要になる場合があります。

監査

Google Cloud Consoleを使用する:
  1. Google Cloud コンソール Kubernetes Engine ページ にアクセスして Kubernetes Engine に移動します
  2. テスト対象のクラスターを選択し、各ノードプールをクリックしてノードプールの詳細ページを表示します。
各ノードプールのサービスアカウントがセキュリティの見出しの下でデフォルトに設定されていないことを確認してください。サービスアカウントに割り当てられた権限がクラスタの運用に必要な最小限であることを確認するには:
  1. Google Cloud Console IAMページにアクセスしてIAMに移動してください
  2. サービスアカウントのリストから、各クラスタサービスアカウントが次の役割のみを持っていることを確認してください:
    • ログライター
    • モニタリングメトリックライター
    • 監視ビューアー
Command Lineを使用する:
既存のクラスターを確認するには、まずノードプール、クラスター名、ロケーション、プロジェクトの4つの変数を定義し、次のコマンドを実行します。
gcloud container node-pools describe $NODE_POOL --cluster $CLUSTER_NAME -- location $LOCATION --project $PROJECT_ID --format json | jq '.config.serviceAccount'
上記のコマンドの出力は、プロジェクトアクセスに使用されている特定のサービスアカウントを返します。サービスアカウントに割り当てられた権限がクラスタ操作に必要な最小限であることを確認するには:
gcloud projects get-iam-policy <project_id> \ --flatten="bindings[].members" \ --format='table(bindings.role)' \ --filter="bindings.members:<service_account>"
サービスアカウントがクラスターを実行するために必要な役割のみを持っていることを確認してください。
  • roles/logging.logWriter
  • roles/monitoring.metricWriter
  • roles/monitoring.viewer

修復

Google Cloud Consoleを使用する:
最小限の権限を持つサービスアカウントを作成するには:
  1. Google Cloud Consoleサービスアカウントページにアクセスして、サービスアカウントに移動します。
  2. サービスアカウントを作成をクリックします。
  3. サービスアカウントの詳細を入力してください。
  4. 作成して続行をクリックします。
  5. サービスアカウントの権限に次のロールを追加してください。
    • ログライター
    • モニタリングメトリックライター
    • モニタリングビューアー
  6. 続行をクリックしてください。
  7. ユーザにこのサービスアカウントへのアクセスを許可し、必要に応じてキーを作成します。
  8. 完了をクリックしてください。
サービスアカウントを使用するためのノードプールを作成するには:
  1. Google CloudコンソールKubernetes EngineページにアクセスしてKubernetes Engineに移動します。
  2. ノードプールが起動されるクラスター名をクリックしてください。
  3. ノードプールを追加をクリックします。
  4. Node Poolの詳細内で、セキュリティのサブ見出しを選択し、アイデンティティのデフォルトの下で、サービスアカウントのドロップダウンから最小特権のサービスアカウントを選択します。
  5. ノードプールを起動するにはCREATEをクリックしてください。
    注意
    注意
    ワークロードは新しいノードプールに移行する必要があり、デフォルトのサービスアカウントを使用している古いノードプールは、修正を完了するために削除する必要があります。
コマンドラインを使用する:
最小特権サービスアカウントを作成するために
gcloud iam service-accounts create <node_sa_name> --display-name "GKE Node 
Service Account" 
export NODE_SA_EMAIL=gcloud iam service-accounts list --format='value(email)' 
--filter='displayName:GKE Node Service Account' 
サービスアカウントに次のロールを付与してください:
export PROJECT_ID=gcloud config get-value project 
gcloud projects add-iam-policy-binding <project_id> --member 
serviceAccount:<node_sa_email> --role roles/monitoring.metricWriter 
gcloud projects add-iam-policy-binding <project_id> --member 
serviceAccount:<node_sa_email> --role roles/monitoring.viewer 
gcloud projects add-iam-policy-binding <project_id> --member 
serviceAccount:<node_sa_email> --role roles/logging.logWriter
サービスアカウントを使用して新しいノードプールを作成するには、次のコマンドを実行します。
gcloud container node-pools create <node_pool> --service- 
account=<sa_name>@<project_id>.iam.gserviceaccount.com-- 
cluster=<cluster_name> --zone <compute_zone>
注意
注意
ワークロードは新しいノードプールに移行する必要があり、デフォルトのサービスアカウントを使用している古いノードプールは、修正を完了するために削除する必要があります。