このページでは、アプリケーションの ID を提供する Google Kubernetes Engine(GKE)のサービス アカウントについて説明します。
サービス アカウントは、ユーザーではなくアプリケーションが使用する ID です。GKE では、Kubernetes サービス アカウントと Identity and Access Management サービス アカウントを操作します。
Kubernetes サービス アカウントと IAM サービス アカウント
次の表に、Kubernetes サービス アカウントと IAM サービス アカウントの主な違いを示します。
GKE のサービス アカウントの種類 | |
---|---|
Kubernetes ServiceAccount |
|
IAM サービス アカウント |
|
Kubernetes ServiceAccount
Kubernetes サービス アカウントはクラスタレベルで管理され、Kubernetes API サーバーに ServiceAccount
オブジェクトとして存在します。Kubernetes のドキュメントと GKE のドキュメントでは、これらの Kubernetes リソースを IAM などの他の環境のサービス アカウントと区別するために ServiceAccount という用語がよく使用されます。
Namespace に Kubernetes ServiceAccount を作成し、Pod マニフェストの serviceAccountName
フィールドを使用して、その ServiceAccount を Pod に割り当てます。ノードの kubelet プロセスは、割り当てられた ServiceAccount の有効期間の短い署名なしトークンを取得し、そのトークンを予測ボリュームとして Pod にマウントします。
有効期間の短い署名なしトークンは、OpenID Connect(OIDC)プロバイダである API サーバーによって署名された JSON ウェブトークン(JWT)です。署名なしトークンを検証するには、GKE API で projects.locations.clusters.getJwks
メソッドを呼び出して、クラスタの公開検証鍵を取得します。
- Kubernetes ServiceAccount の基本については、Kubernetes のドキュメントの Service Accounts をご覧ください。
- 新しい ServiceAccount を作成する方法、ロールベース アクセス制御(RBAC)を使用して権限を付与する方法、Pod に ServiceAccount を割り当てる方法については、Configure Service Accounts for Pods をご覧ください。
- Kubernetes ServiceAccount を管理する際のベスト プラクティスについては、GKE RBAC のベスト プラクティスをご覧ください。
- クラスタの Kubernetes API サーバーの OIDC 構成を読み取るには、GKE API で
projects.locations.clusters.well-known.getOpenid-configuration
メソッドを呼び出してください。
Kubernetes ServiceAccount の認証情報のローテーション
Kubernetes ServiceAccount の認証情報が不正使用された場合は、次のいずれかの方法で認証情報を取り消します。
- Pod を再作成する: 署名なしトークンは一意の Pod UID ごとにバインドされるため、Pod を再作成すると以前の認証情報が無効になります。
- Kubernetes ServiceAccount を再作成する: 署名なしトークンは、Kubernetes API の ServiceAccount オブジェクトの UID にバインドされます。ServiceAccount を削除し、同じ名前の新しい ServiceAccount を作成します。新しい ServiceAccount の UID が異なるため、以前のトークンは無効になります。
- 認証情報のローテーションを行う: これにより、クラスタ内のすべての Kubernetes ServiceAccount 認証情報が取り消されます。ローテーションによって、クラスタの CA 証明書と IP アドレスも変更されます。詳細については、認証情報のローテーションをご覧ください。
IAM サービス アカウント
IAM サービス アカウントは、IAM API を使用してプロジェクト レベルで管理されます。これらのサービス アカウントを使用して、プログラムでの Google Cloud APIs の呼び出しや、Google Cloud プロダクトで実行されているアプリケーションの権限の管理などの操作を実行できます。
詳細については、IAM サービス アカウントの概要をご覧ください。
GKE サービス エージェント
IAM サービス エージェントは、Google Cloud が管理する IAM サービス アカウントです。
GKE は Kubernetes Engine サービス エージェントを使用して、ノード、ディスク、ロードバランサなどのクラスタ リソースのライフサイクルを管理します。このサービス エージェントにはドメイン container-engine-robot.iam.gserviceaccount.com
があり、GKE API を有効にするとプロジェクトの Kubernetes Engine サービス エージェントのロール(roles/container.serviceAgent
)が付与されます。
このサービス エージェントの ID は次のとおりです。
service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
PROJECT_NUMBER
は、プロジェクト番号(数字)です。
GKE サービス エージェントを無効にする場合は、サービス アカウントの有効化の手順に沿ってこのエージェントを復元できます。
プロジェクト内のサービス エージェントの権限を削除した場合は、エラー 400/403: アカウントに対する編集権限がありませんの手順に沿って権限を復元できます。
GKE サービス エージェントを削除する場合は、サービス アカウントの削除の取り消しの手順に沿ってこのエージェントの削除を取り消すことができます。
GKE ノードのデフォルト サービス アカウント
デフォルトでは、GKE ノードは Compute Engine のデフォルトのサービス アカウントを使用します。デフォルトでは、このサービス アカウントには編集者ロール(roles/editor
)が付与され、GKE ノードに必要な権限よりも多くの権限が付与されています。クラスタでノードを実行するために必要な最小権限を使用するロールの使用を検討してください。
ユーザー管理サービス アカウントに移行する場合を除き、デフォルトの Compute Engine サービス アカウントを無効にしないでください。
最小権限
GKE では、クラスタを操作するために最小限の IAM 権限が必要です。最小権限の IAM サービス アカウントを作成する手順については、最小権限の Google サービス アカウントの使用をご覧ください。
特定のサービス アカウントを使用する場合
使用するサービス アカウントのタイプは、アプリケーションに提供する ID のタイプによって以下のように異なります。
- クラスタで使用する Pod の ID を提供する: Kubernetes ServiceAccount を使用します。すべての Kubernetes Namespace には
default
ServiceAccount がありますが、各 Namespace の各ワークロードに最小限権限の新しい ServiceAccount を作成することをおすすめします。 - クラスタ外で使用する Pod の ID を提供する: GKE 用 Workload Identity 連携を使用します。GKE 用 Workload Identity 連携を使用すると、IAM ポリシーのプリンシパルとして ServiceAccount などの Kubernetes リソースを指定できます。たとえば、Pod から Secret Manager や Spanner などの Google Cloud API を呼び出す場合に、GKE 用 Workload Identity 連携を使用します。
- ノードにデフォルトの ID を指定する: GKE クラスタまたはノードを作成するときに、カスタムの最小権限 IAM サービス アカウントを使用します。カスタムの IAM サービス アカウントを使用しない場合、GKE は Compute Engine のデフォルト サービス アカウントを使用します。このアカウントには、プロジェクト内で広範な権限があります。
次のステップ
- 最小権限の Google サービス アカウントを使用する方法を確認する。
- プリンシパルにロールを付与する方法を確認する。