プロファイル適用性: レベル1
最小限の権限を持つサービスアカウントを作成して使用し、Compute Engineのデフォルトサービスアカウントの代わりにGKEクラスターのノードを実行してください。ノードが侵害された場合、不必要な権限が悪用される可能性があります。
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.viewer、monitoring.metricWriter、logging.logWriterのロールが必要です。ノードがGCRからイメージをプルするために追加のロールが必要になる場合があります。
注意デフォルトでは、新しいクラスターを作成する際に、ノードはCompute Engineのデフォルトサービスアカウントを使用します。
|
影響
インスタンスには、すべての Google Cloud API へのフルアクセスを許可するスコープが自動的に付与されます。これは、インスタンスの IAM 権限がサービスアカウントの
IAM ロールによって完全に決定されるようにするためです。そのため、Kubernetes ワークロードが Google API を使用してアクションを実行するためにクラスターアクセススコープを使用していた場合、サービスアカウントの権限で許可されていない場合は、もはや実行できない可能性があります。修正するには、推奨事項
5.2.2 に従ってください。
ここに記載されているサービスアカウントの役割は、クラスターを実行するために必要な最小限のものです。Google Container Registry (GCR) のプライベートインスタンスからプルするには、追加の役割が必要になる場合があります。
監査
Google Cloud Consoleを使用する
- Kubernetes Engine websiteに移動します。
- テスト対象のクラスターを選択し、各ノードプールをクリックしてノードプールの詳細ページを表示します。各ノードプールのセキュリティ見出しの下で、サービスアカウントがデフォルトに設定されていないことを確認してください。
サービスアカウントに割り当てられた権限がクラスタ運用に必要な最小限であることを確認するには:
- IAMウェブサイトにアクセスしてください。
- サービスアカウントのリストから、各クラスタサービスアカウントが次の役割のみを持っていることを確認してください:
- ログライター
- モニタリングメトリックライター
- モニタリングビューアー
コマンドラインの使用:
既存のクラスターに設定されているサービスアカウントを確認するには、次のコマンドを実行します。
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.logWriterroles/monitoring.metricWriterroles/monitoring.viewer
修復
Google Cloud Consoleを使用する
最小特権サービスアカウントを作成するには:
- サービスアカウントのウェブサイトに移動します。
CREATE SERVICE ACCOUNTをクリックしてください。- サービスアカウントの詳細を入力してください。
CREATE AND CONTINUEをクリックしてください。- サービスアカウントの権限に次のロールを追加してください:
Logs WriterMonitoring Metric WriterMonitoring Viewer
- 続行をクリックしてください。
- ユーザにこのサービスアカウントへのアクセスを許可し、必要に応じてキーを作成してください。
- 完了をクリックしてください。
サービスアカウントを使用するためのノードプールを作成するには:
- Kubernetes Engine のウェブサイトにアクセスしてください。
- ノードプールが起動されるクラスター名をクリックしてください。
ADD NODE POOLをクリックしてください。- Node Poolの詳細内で、
Securityの小見出しを選択し、`Identity defaults`の下で、サービスアカウントのドロップダウンから最小特権のサービスアカウントを選択します。 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>
注意ワークロードは新しいノードプールに移行する必要があり、デフォルトのサービスアカウントを使用する古いノードプールは修正を完了するために削除する必要があります。
|
