GKE コントロール プレーンへの Google 接続を確認する


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

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

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

このページでは、GKE のオプションのコントロール プレーン機能のセットについて説明します。この機能を使用すると、コントロール プレーンのセキュリティ対策の検証や、管理する鍵を使用してコントロール プレーンでの暗号化と認証情報の署名の構成などのタスクを実行できます。詳細については、GKE control plane authority についてをご覧ください。

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

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

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

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

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

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

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

コントロール プレーンへの接続を確認するには、クラスタのコントロール プレーン アクセス ログを見つけて、それらのログをアクセスの透明性と Access Approval の監査ログと照合します。これにより、コントロール プレーン インスタンスへのすべての SSH 接続が、Google 社員による承認済みの管理アクセスの結果であることを確認できます。クラスタで GKE コントロール プレーンの権限を有効にすると、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
  • ログにアクセスし、ログ エクスプローラと Log Analytics を使用する: プロジェクトに対するログビューア 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 接続のすべてのログタイプが表示されるかどうかです。すべての Access Transparency ログには、対応するコントロール プレーン接続ログと 1 つ以上の SSH ログが必要です。これらのログは、コントロール プレーン インスタンスで人間が実行するアクション用であるため、ログの量は少なくする必要があります。

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

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

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

  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.update メソッドClusterUpdate リソースの LoggingConfig オブジェクトに対応する値を設定します。

次のステップ