確認 Google 與 GKE 控制層的連線


聯絡。

本頁說明如何比對 GKE 記錄與資料存取透明化控管機制記錄,驗證 Google 人員與 Google Kubernetes Engine (GKE) 叢集控制層建立的連線。

資料存取透明化控管機制記錄會記錄 Google 人員存取您內容時執行的操作。本指南適用於安全管理員,他們希望透過關聯 GKE 的其他記錄來源,進一步驗證資料存取透明化控管機制記錄的內容,以及相關的存取權核准核准項目。這項驗證完全是選擇性步驟,不影響控制層的安全。

請務必熟悉下列概念:

本頁說明 GKE 中一組選用控制層功能,可讓您執行驗證控制層安全狀態等工作,或使用您管理的金鑰在控制層中設定加密和憑證簽署。詳情請參閱「關於 GKE 控制層授權」。

根據預設, Google Cloud 會對受管理控制層套用各種安全措施。 本頁說明選用功能,可讓您進一步瞭解或控管 GKE 控制層。

關於 Google 對叢集控制層執行個體的存取權

在疑難排解期間或基於其他正當業務理由,Google 人員 (例如網站可靠性工程師和 Cloud 客服人員) 可能需要取得主控平面的 Compute Engine 執行個體管理員存取權。視 Customer Care 支援方案和設定而定,資料存取透明化控管機制會提供這類管理存取的詳細稽核記錄。Access Approval 可讓您要求明確核准,Google 人員才能存取您的資源。如要進一步瞭解管理員存取權,以及可用於授權存取權和記錄變更的工具,請參閱「Google 員工的管理員存取權」。

控制層存取記錄

啟用 GKE 控制層授權後,GKE 會產生控制層存取記錄,您可以選擇使用這些記錄,與資料存取透明化控管機制和 Access Approval 產生的稽核記錄進行交叉參照。GKE 會將控制層存取記錄新增至 Logging 中的 _Default 儲存空間,記錄控制層執行個體中的傳入網路連線和特定 SSH 事件。您必須在專案中啟用 GKE 控制層授權,才能為叢集產生控制層存取記錄。

GKE 會為控制層產生下列存取記錄:

控制層連線記錄的量取決於多項因素,例如叢集中的節點數量、控制層執行個體數量 (區域叢集的控制層執行個體數量比區域叢集多),以及工作負載呼叫 Kubernetes API 伺服器的頻率。SSH 記錄量較小,取決於節點重新啟動的次數。

如要驗證與控制層的連線,請找出叢集的控制層存取記錄,並將這些記錄與資料存取透明化控管機制和存取核准的稽核記錄進行比對。確認所有連線至控制層執行個體的 SSH 連線,都是 Google 人員獲得授權的管理存取權所致。為叢集啟用 GKE 控制層授權後,Google 人員對控制層的所有 SSH 存取權都會是非互動式,也就是說,每項 SSH 連線都會執行您授權的單一指令。

定價

請注意下列價格注意事項:

事前準備

開始之前,請確認你已完成下列工作:

  • 啟用 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 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

啟用 GKE 叢集控制層存取記錄

如要為 Autopilot 模式和 Standard 模式叢集啟用控制層存取記錄檔產生功能,請啟用對應的記錄檔元件。如要進一步瞭解控制層記錄類型,請參閱「查看 GKE 記錄」。

控制層存取記錄支援的記錄元件名稱如下:

  • 控制層 SSH 記錄:KCP_SSHD
  • 控制層連線記錄:KCP_CONNECTION

在新叢集上啟用控制層存取記錄

下列範例會建立 Autopilot 模式叢集,並啟用兩種控制層存取記錄。如要只啟用一種控制平面存取記錄,請從指令中省略對應的元件名稱。

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. 更新叢集記錄設定,一併啟用控制層存取記錄,並保留現有的記錄設定。

您在 --logging 指令中為 gcloud container clusters update 旗標指定的值,與您描述叢集時看到的值不同。

  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 控制台中,開啟「Logs Explorer」頁面。

    前往「Logs Explorer」頁面

  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 記錄

執行驗證檢查

主要驗證檢查是,當您從前一節執行記錄查詢時,是否看到任何 SSH 連線的所有記錄類型。每筆資料存取透明化控管機制記錄都應有對應的控制平面連線記錄,以及一或多筆 SSH 記錄。這些記錄是針對使用者在控制平面執行個體中執行的動作,因此記錄量應該很小。

您也可以視需要對記錄內容執行下列額外檢查:

  1. 針對每個控制平面 SSH 記錄,請檢查 SSH 記錄的時間戳記前 15 分鐘內,是否有資料存取透明化控管機制記錄。這是因為資料存取透明化控管機制記錄初始連線後,最終 SSH 工作階段會在幾分鐘後關閉。
  2. 針對每個控制平面連線記錄,請在控制平面連線記錄的時間戳記前 5 分鐘內,檢查是否有資料存取透明化控管機制記錄。
  3. 如果叢集使用存取核准,請檢查每筆資料存取透明化控管機制記錄是否都有對應的 accessApprovals 欄位。請參照叢集的存取權核准要求,交叉比對這個欄位。

    如要取得專案的存取權核准要求,請參閱「查看先前的存取權核准要求」。存取核准可能會有排除條件

  4. (選用) 驗證簽章,確認簽署的 Access Approval 與資料存取透明化控管機制記錄相關聯。

控制層存取記錄詳細資料

本節提供詳細資料和範例,說明 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。 這個 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 會記錄下列事件:

  • 使用者接受的安全殼層金鑰
  • 工作階段狀態從 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。 這個 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 物件中對應的值設為 LoggingConfig

後續步驟