クラスタ コントロール プレーンへの Google の接続を確認する


このページでは、GKE ログとアクセスの透明性ログを関連付けて、Google の担当者が Google Kubernetes Engine(GKE)クラスタ コントロール プレーンに接続したことを確認する方法について説明します。

アクセスの透明性ログには、Google の担当者がお客様のコンテンツにアクセスした際に行った操作が記録されます。このガイドは、GKE の追加のログソースと関連付けて、アクセスの透明性ログの内容と関連するアクセス承認を追加で確認する必要があるセキュリティ管理者を対象としています。この検証は完全に任意であり、コントロール プレーンの保護に必要ではありません。

次のコンセプトを理解しておいてください。

このページでは、GKE におけるオプションのコントロール プレーン機能について説明します。これらの機能を使用すると、コントロール プレーンのセキュリティ ポスチャーを確認する、ユーザーが管理する鍵を使用してコントロール プレーンでの暗号化と認証情報の署名を構成するといったタスクを行えます。詳細については、control plane authority についてをご覧ください。

デフォルトでは、Google Cloud はマネージド コントロール プレーンにさまざまなセキュリティ対策を適用します。このページでは、コントロール プレーンの可視性と制御性をさらに高めるオプション機能について説明します。

クラスタ コントロール プレーン インスタンスへの Google のアクセスについて

トラブルシューティングのセッション中やその他の正当なビジネス上の理由で、サイト信頼性エンジニアや Cloud カスタマーケア担当者などの Google の担当者が、コントロール プレーンをホストする Compute Engine インスタンスへの管理者権限を必要とする場合があります。カスタマーケアのサポート パッケージと構成によっては、アクセスの透明性により、この管理者権限の詳細な監査ログが提供されます。アクセス承認を使用すると、Google の担当者がリソースにアクセスする前に明示的な承認を要求することができます。管理者権限と、アクセス権の承認と変更の記録に使用できるツールの詳細については、Google 社員の管理者権限をご覧ください。

コントロール プレーン アクセスログ

GKE control plane authority を有効にすると、GKE はコントロール プレーン アクセスログを生成します。このログは、必要に応じて、アクセスの透明性とアクセス承認によって生成された監査ログとの相互参照に使用できます。GKE は、コントロール プレーン アクセスログを Logging の _Default バケットに追加し、コントロール プレーン インスタンスで受信ネットワーク接続と特定の SSH イベントを記録します。クラスタのコントロール プレーン アクセスログを生成するには、プロジェクトで GKE control plane authority を有効にする必要があります。

GKE は、コントロール プレーンに対して次のアクセスログを生成します。

コントロール プレーンの接続ログの量は、クラスタ内のノードの数、コントロール プレーン インスタンスの数(リージョン クラスタにはゾーンクラスタよりも多くのコントロール プレーン インスタンスがあります)、ワークロードが Kubernetes API サーバーを呼び出す頻度などの要因によって変動します。SSH ログの量は少なく、ノードの再起動回数によって異なります。

コントロール プレーンへの接続を確認するには、クラスタのコントロール プレーン アクセスログを見つけて、それらのログをアクセスの透明性とアクセス承認の監査ログと照合します。これにより、コントロール プレーン インスタンスへのすべての SSH 接続が、Google の担当者による承認済みの管理者権限の結果であることを確認できます。クラスタで GKE control plane authority を有効にすると、Google の担当者によるコントロール プレーンへのすべての SSH アクセスは非対話型になり、すべての SSH 接続で、承認した単一のコマンドが実行されます。

料金

次の料金に関する考慮事項が適用されます。

  • コントロール プレーン アクセスログには、Logging の料金が適用されます。
  • アクセスの透明性は、特定のカスタマーケア サブスクリプションに含まれています。詳細については、アクセスの透明性の料金をご覧ください。

始める前に

始める前に、次の作業が完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

要件

コントロール プレーン アクセスログには、GKE バージョン 1.31.1-gke.1846000 以降が必要です。

必要なロールと権限

ログの生成を有効にしてログにアクセスして処理するために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

  • クラスタでコントロール プレーン接続のロギングを有効にする: プロジェクトの Kubernetes Engine Cluster 管理者roles/container.clusterAdmin
  • ログにアクセスし、ログ エクスプローラとログ分析を使用する: プロジェクトに対するログビューアroles/logging.viewer
  • 組織でアクセスの透明性を有効にする: 組織のアクセスの透明性管理者roles/axt.admin

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

GKE クラスタ コントロール プレーン アクセスログを有効にする

Autopilot モードと Standard モードのクラスタでコントロール プレーン アクセスログの生成を有効にするには、対応するロギング コンポーネントを有効にします。コントロール プレーンのログの種類の詳細については、GKE ログを表示するをご覧ください。

コントロール プレーン アクセスログでサポートされているロギング コンポーネント名は次のとおりです。

  • コントロール プレーンの SSH ログ: KCP_SSHD
  • コントロール プレーンの接続ログ: KCP_CONNECTION

新しいクラスタでコントロール プレーン アクセスログを有効にする

次の例では、両方のタイプのコントロール プレーン アクセスログが有効になっている Autopilot モードクラスタを作成します。1 種類のコントロール プレーン アクセスログのみを有効にするには、コマンドから対応するコンポーネント名を省略します。

gcloud container clusters create-auto CLUSTER_NAME \
    --location=LOCATION \
    --logging=SYSTEM,KCP_SSHD,KCP_CONNECTION

次のように置き換えます。

  • CLUSTER_NAME: 新しいクラスタの名前。
  • LOCATION: データセットを作成するロケーション。

GKE API を使用してクラスタを作成するときにロギング コンポーネントを指定するには、projects.locations.clusters.create メソッドで、Cluster リソースの LoggingConfig オブジェクトに対応する値を設定します。

既存のクラスタでコントロール プレーン アクセスログを有効にする

既存のクラスタのロギング構成を更新してコントロール プレーン アクセスログを有効にするには、次の操作を行う必要があります。

  1. クラスタで使用されている既存のロギング コンポーネントを確認します。
  2. これらのロギング コンポーネントを有効に保つために、gcloud CLI の --logging フラグで指定する対応する値を特定します。
  3. クラスタのロギング構成を更新して、既存のロギング構成と並行してコントロール プレーン アクセスログを有効にします。

gcloud container clusters update コマンドの --logging フラグに指定する値は、クラスタの記述時に表示される値とは異なります。

  1. クラスタの既存のロギング構成を確認します。

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --flatten=loggingConfig \
        --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'
    

    出力は次のようになります。

    SYSTEM_COMPONENTS,WORKLOADS,APISERVER,SCHEDULER,CONTROLLER_MANAGER
    
  2. 前の手順の出力から、ロギング コンポーネントの構成に対応する --logging フラグの gcloud CLI 値を特定します。特定のロギング コンポーネントに対応する gcloud CLI 値の一覧については、使用可能なログの表をご覧ください。

  3. コントロール プレーン アクセスログを使用してロギング構成を更新します。

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --logging=SYSTEM,EXISTING_LOGS,KCP_ACCESS_LOGS
    

    次のように置き換えます。

    • EXISTING_LOGS: クラスタですでに使用されているロギング コンポーネントのカンマ区切りのリスト。これらのロギング コンポーネントに対応する gcloud CLI 値を指定します。値は、使用可能なログの表から取得します。
    • KCP_ACCESS_LOGS: クラスタで有効にするコントロール プレーン アクセスログの種類のカンマ区切りのリスト。次に例を示します。

      • コントロール プレーンの SSH ログの場合は、KCP_SSHD を指定します。
      • コントロール プレーンの接続ログの場合は、KCP_CONNECTION を指定します。

GKE API を使用してクラスタを更新するときにロギング コンポーネントを指定するには、projects.locations.clusters.update メソッドで、ClusterUpdate リソースLoggingConfig オブジェクトに既存のロギング コンポーネント値と新しいロギング コンポーネント値を設定します。

コントロール プレーン アクセスログを有効にするクラスタ更新の例

gcloud container clusters describe コマンドのロギング構成が次のようになっているクラスタについて考えてみましょう。

SYSTEM_COMPONENTS,WORKLOADS,APISERVER,SCHEDULER,CONTROLLER_MANAGER

次のクラスタ更新コマンドは、このサンプル クラスタの既存のログ構成を保持しながら、両方のタイプのコントロール プレーン アクセスログを有効にします。

gcloud container clusters update example-cluster \
    --location=us-central1 \
    --logging=SYSTEM,WORKLOAD,API_SERVER,SCHEDULER,CONTROLLER_MANAGER,KCP_SSHD,KCP_CONNECTION

コントロール プレーン アクセスログとアクセスの透明性ログを照合する

クラスタのコントロール プレーン アクセスを確認するには、そのクラスタのコントロール プレーン接続ログ、コントロール プレーン SSH ログ、アクセスの透明性ログを取得します。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページを開きます。

    [ログ エクスプローラ] に移動

  2. コントロール プレーン アクセスログやアクセスの透明性ログなど、特定のクラスタのすべてのログを取得するには、次のクエリを実行します。

    (logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fkcp-connection"
    resource.labels.cluster_name="CLUSTER_NAME"
    jsonPayload.connection.dest_port="22")
    OR
    (logName="projects/PROJECT_ID/logs/container.googleapis.com%2Fkcp-sshd"
    resource.labels.cluster_name="CLUSTER_NAME")
    OR
    (logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Faccess_transparency"
    json_payload.accesses.methodName="GoogleInternal.SSH.Master"
    json_payload.accesses.resourceName="//container.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/clusters/CLUSTER_NAME")
    

出力には、クラスタの次のタイプのログがすべて表示されます。

  • アクセスの透明性ログ
  • コントロール プレーンの接続ログ
  • 各 SSH セッションの SSH ログ

検証チェックを実行する

主な検証チェックは、前のセクションの Logging クエリを実行したときに、SSH 接続のすべてのログタイプが表示されるかどうかです。すべてのアクセスの透明性ログには、対応するコントロール プレーン接続ログと 1 つ以上の SSH ログが必要です。これらのログは、コントロール プレーン インスタンスで人間が実行するアクションのためのものであるため、ログの量は少なくする必要があります。

必要に応じて、ログの内容について次の追加チェックを実施します。

  1. コントロール プレーンの SSH ログごとに、SSH ログのタイムスタンプの 15 分前の期間にアクセスの透明性ログが存在するかどうかを確認します。この時間枠は、アクセスの透明性によって最初の接続がログに記録されてから数分後に最終的な SSH セッションが終了することを考慮しています。
  2. コントロール プレーン接続ログごとに、コントロール プレーン接続ログのタイムスタンプの 5 分前の期間にアクセスの透明性ログが存在するかどうかを確認します。
  3. クラスタにアクセス承認を使用する場合は、各アクセスの透明性ログに対応する accessApprovals フィールドがあるかどうかを確認します。このフィールドをクラスタのアクセス承認リクエストと照らし合わせてください。

    プロジェクトのアクセス承認リクエストを取得するには、アクセス承認リクエストの履歴を表示するをご覧ください。アクセス承認には除外が適用される場合があります。

  4. 必要に応じて、アクセスの透明性ログに関連付けられている署名付きアクセス承認の署名を検証します。

コントロール プレーン アクセスログの詳細

このセクションでは、Google の担当者がコントロール プレーン インスタンスに接続したときに GKE が生成するコントロール プレーン アクセスログの詳細と例について説明します。

コントロール プレーンの接続ログ

GKE は、コントロール プレーン インスタンスへの新しい受信ネットワーク接続ごとにコントロール プレーン接続ログを追加します。これらのログには、次のような具体的な詳細情報が含まれます。

  • 送信元と宛先の IP アドレスとポート
  • 接続方向とプロトコル

次の例は、コントロール プレーンの接続ログを示しています。

{
  insertId: "z1eq8wonio335a5h",
  jsonPayload: {
    instance: {
      vm_name: "gke-dee49f0d6fa34ce3a2ac-f513-d195-vm",
      zone: "us-central1-c"
    },
    cluster: {
      cluster_id: "CLUSTER_ID",
      cluster_urn: "//container.googleapis.com/projects/PROJECT_NUMBER/locations/us-central1-c/clusters/CLUSTER_NAME"
    },
    connection: {
      state: "NEW",
      src_ip: "192.0.2.100",
      src_port: 32774,
      dest_ip: "203.0.113.12",
      dest_port: 22,
      direction: "INGRESS"
      protocol: "TCP"
    },
  }
  logName: "projects/PROJECT_ID/logs/container.googleapis.com%2Fkcp-connection",
  receiveTimestamp: "2024-04-11T04:08:01.883070399Z",
  resource: {
    labels: {
      cluster_name: "CLUSTER_NAME",
      location: "us-central1-c",
      project_id: "PROJECT_ID"
    }
    type: "gke_cluster",
  }
  severity: "NOTICE",
  timestamp: "2024-04-11T04:07:59.019330Z"
}

ログエントリの次のフィールドは、Google のアクションの確認に関連しています。

  • cluster.cluster_urn: クラスタの完全修飾リソース識別子。この ID の形式は //container.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/clusters/CLUSTER_NAME で、次の変数を使用します。

    • PROJECT_NUMBER: クラスタ プロジェクトの数値プロジェクト番号。
    • LOCATION: クラスタの Google Cloud のロケーション。
    • CLUSTER_NAME: クラスタの名前。
  • connection: 接続試行の詳細。このフィールドには次の情報が含まれます。

    • state: 接続の状態。新しい接続の場合、値は NEW です。
    • src_ip: 接続元の IP アドレス。
    • src_port: 接続元のポート番号。
    • dest_ip: コントロール プレーン VM の内部 IP アドレス。
    • dest_port: 宛先ポート番号。
    • direction: 接続の方向。値は常に INGRESS です。
    • protocol: IP プロトコル(TCP など)。

コントロール プレーンの SSH ログ

GKE は、コントロール プレーン インスタンスへの SSH 接続に関連するイベントのコントロール プレーン SSH ログを追加します。GKE は次のイベントを記録します。

  • ユーザー用に承認済みの SSH 認証鍵
  • セッションのステータスが 0 から 1 に変化した。ユーザーがログインに成功したことを示している
  • SSH セッションが開いている
  • SSH セッションが閉じられている
  • セッションのステータスが 1 から 0 に変化した。ユーザーがログアウトしたことを示している
  • SSH セッションに失敗した

たとえば、次のコントロール プレーン SSH ログは、開いている SSH セッションに関するものです。

{
  insertId: "8llczemdulwbbwpa",
  jsonPayload: {
    instance: {
      vm_name: "gke-06cb920c609941c0a5ce-6840-40e9-vm",
      zone: "us-central1-c"
    },
    cluster: {
      cluster_id: "891e6d12889747748c1ac16ffcc6cb7c0a96450b36864eb680917c119fd801d0",
      cluster_urn: "//container.googleapis.com/projects/PROJECT_NUMBER/locations/us-central1/clusters/CLUSTER_NAME",
    },
    message: "pam_unix(sshd:session): session opened for user REDACTED by (uid=0)",
  },
  logName: "projects/PROJECT_ID/logs/container.googleapis.com%2Fkcp-ssh",
  receiveTimestamp: "2024-04-09T13:21:55.231436462Z"
  resource: {
    type: "gke_cluster",
    labels: {
      cluster_name: "CLUSTER_NAME",
      location: "us-central1",
      project_id: "PROJECT_ID"
    }
  },
  severity: "NOTICE",
  timestamp: "2024-04-09T13:21:50.742246Z"
}

ログエントリの次のフィールドは、Google のアクションの確認に関連しています。

  • cluster.cluster_urn: クラスタの完全修飾リソース識別子。この ID の形式は //container.googleapis.com/projects/PROJECT_NUMBER/locations/LOCATION/clusters/CLUSTER_NAME で、次の変数を使用します。

    • PROJECT_NUMBER: クラスタ プロジェクトの数値プロジェクト番号。
    • LOCATION: クラスタの Google Cloud のロケーション。
    • CLUSTER_NAME: クラスタの名前。
  • message: SSH 接続の詳細。

コントロール プレーン アクセスログを無効にする

  1. クラスタで使用されている特定のログタイプを表示するには、次のコマンドを実行します。

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --flatten=loggingConfig \
        --format='csv[delimiter=",",no-heading](componentConfig.enableComponents)'
    

    出力は次のようになります。

    SYSTEM_COMPONENTS,WORKLOADS,API_SERVER,SCHEDULER,CONTROLLER_MANAGER,KCP_SSHD,KCP_CONNECTION
    
  2. クラスタのコントロール プレーン アクセスログを無効にするには、次のコマンドを実行します。

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --logging=SYSTEM,WORKLOAD,API_SERVER,SCHEDULER,CONTROLLER_MANAGER
    

--logging フラグで、前のコマンドの出力からロギング コンポーネントを指定します。このコマンドの例では、コントロール プレーン アクセスログは無効になりますが、他のコントロール プレーン コンポーネントのログは有効のままになります。

GKE API を使用してロギング コンポーネントを無効にするには、projects.locations.clusters メソッドCluster リソースの LoggingConfig オブジェクトに対応する値を設定します。

次のステップ