GKE ノードによるデフォルトサービスアカウントの使用

GKE ノードには、必要なロールだけを持つ専用サービスアカウントを使用します。

説明

GKE ノードがデフォルトのサービスアカウントを共有したり、過剰な IAM ロールを持ったりすると、ノード侵害の影響が他の Google Cloud リソースに広がるおそれがあります。デフォルトのアカウントが必ず管理者であるわけではないため、実際のロールを確認する必要があります。

想定される影響

ノードの認証情報が悪用されると、そのアカウントに許可されたリソースを参照・変更されるおそれがあります。アカウントの共有は、権限の分離や利用主体の追跡も難しくします。

対処方法

node_config.service_account に、ノードの運用に必要なロールだけを持つ専用アカウントのメールアドレスを指定してください。アカウントとロールを先に用意し、変更の影響を確認してください。アプリケーションの Google Cloud 権限は Workload Identity Federation for GKE で別途管理してください。

例

ノードサービスアカウントを選択する抜粋です。node_service_account_email に作成済みアカウントのメールアドレスを指定し、必要なノード用ロールを別途付与してください。プロジェクトと Ansible 実行用の JSON 認証情報ファイルのパスも指定します。

変更前

yaml
- name: create a cluster
  google.cloud.gcp_container_cluster:
    name: my-cluster
    initial_node_count: 2
    node_config:
      machine_type: n1-standard-4
      disk_size_gb: 500
    location: us-central1-a
    project: "{{ gcp_project }}"
    auth_kind: serviceaccount
    service_account_file: "{{ gcp_service_account_file }}"
    state: present

ノード用アカウントを指定していないため、デフォルトのサービスアカウントを使用します。実際のリスクは付与されたロールによって異なります。

変更後

yaml
- name: create a cluster
  google.cloud.gcp_container_cluster:
    name: my-cluster
    initial_node_count: 2
    node_config:
      machine_type: n1-standard-4
      disk_size_gb: 500
      service_account: "{{ node_service_account_email }}"
    location: us-central1-a
    project: "{{ gcp_project }}"
    auth_kind: serviceaccount
    service_account_file: "{{ gcp_service_account_file }}"
    state: present

ノードに別のアカウントを指定しています。名前を分けるだけでは最小権限を保証できないため、IAM ロールを確認してください。

参考資料