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

監査

Google Cloudコンソールを使用する:
  1. Kubernetes Engine のウェブサイトにアクセスしてください。
  2. テスト対象のクラスターを選択し、各ノードプールをクリックしてノードプール詳細ページを表示します。各ノードプールのセキュリティ項目でサービスアカウントがデフォルトに設定されていないことを確認してください。
サービスアカウントに割り当てられた権限がクラスタ運用に必要な最小限であることを確認するには:
  1. IAMウェブサイトにアクセスしてください。
  2. サービスアカウントのリストから、各クラスターサービスアカウントが次の役割のみを持っていることを確認してください。
    • ログライター
    • 監視メトリックライター
    • モニタリングビューアー
コマンドラインの使用:
既存のクラスターに設定されているサービスアカウントを確認するには、次のコマンドを実行してください。
gcloud container node-pools describe $NODE_POOL --cluster $CLUSTER_NAME 
--zone $COMPUTE_ZONE --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コンソールを使用する:
最小特権サービスアカウントを作成するには:
  1. サービスアカウントのウェブサイトにアクセスしてください。
  2. CREATE SERVICE ACCOUNTをクリックします。
  3. サービスアカウントの詳細を入力してください。
  4. CREATE AND CONTINUEをクリックします。
  5. サービスアカウントの権限に次のロールを追加してください。
    • ログライター
    • モニタリングメトリックライター
    • モニタリングビューアー
  6. 続行をクリックしてください。
  7. ユーザにこのサービスアカウントへのアクセスを許可し、必要に応じてキーを作成してください。
  8. 完了をクリックしてください。
サービスアカウントを使用するためのノードプールを作成するには:
  1. Kubernetes Engine のウェブサイトに移動します。
  2. ノードプールを起動するクラスター名をクリックしてください。
  3. ADD NODE POOLをクリックします。
  4. Node Poolの詳細内で、Securityの小見出しを選択し、`Identity defaults`の下で、サービスアカウントのドロップダウンから最小特権のサービスアカウントを選択します。
  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>
注意
注意
ワークロードは新しいノードプールに移行する必要があり、デフォルトのサービスアカウントを使用している古いノードプールは修正を完了するために削除する必要があります。