設定安全的核心模組載入

Google Kubernetes Engine (GKE) 安全核心模組載入功能可讓您在安全的 Container-Optimized OS 映像檔上,執行需要簽署的樹外 (OOT) 核心模組的工作負載。安全核心模組載入功能可讓您進一步控管 CPU 或 TPU 節點上的模組載入作業,並驗證簽章,進而提升叢集和節點集區的安全防護機制。

安全核心模組載入的運作方式

根據節點類型,GKE 節點預設會使用不同的 Container-Optimized OS 映像檔,以及不同的安全性設定:

  • CPU 和 TPU 節點:使用已啟用 Linux 安全性模組 (LSM) Loadpin 的 Container-Optimized OS 映像檔。Loadpin 會限制載入任何 OOT 核心模組。這項設定很安全,但會禁止載入 OOT 模組。
  • GPU 節點:使用已停用 Loadpin 的 Container-Optimized OS 映像檔。這項設定可載入 OOT 模組,例如安裝 NVIDIA 驅動程式,但預設安全性較低。

如要啟用安全核心模組載入功能,請在節點集區的 LinuxNodeConfig 中使用 NodeKernelModuleLoading.Policy 設定,或在建立/更新叢集或節點集區時傳遞 --enable-kernel-module-signature-enforcement 標記。如果將政策設為 ENFORCE_SIGNED_MODULES,系統會在 CPU 或 TPU 節點集區中啟用 Loadpin,但會設定為允許從根檔案系統外部載入核心模組。模組必須經過簽署,且系統只允許 Google 簽署的模組。

安全核心模組載入的使用時機

如要在任何 GKE 節點類型上載入 Google 簽署的 OOT 核心模組 (例如自訂驅動程式或 Lustre 等檔案系統),請使用安全核心模組載入功能。這項功能可讓您使用這些模組,同時維持節點的安全性狀態。舉例來說,您可以在 CPU 節點上載入必要驅動程式,不必使用限制較少的 GPU 映像檔類型。

需求條件和限制

在節點集區啟用安全核心模組載入功能時,須遵守下列規定和限制:

  • 支援的模組:僅允許 Google 簽署的 OOT 模組。
  • cgroup v2:節點集區必須使用 cgroup v2。如果節點集區使用 cgroup v1,Google Kubernetes Engine API 會拒絕啟用這項政策的要求。詳情請參閱 Kubernetes cgroup 說明文件
  • GKE 版本:這項功能適用於 GKE 叢集 1.34.1-gke.2364000 以上版本。
  • GPU 映像檔類型:只有 CPU 和 TPU 映像檔支援載入安全核心模組。不支援 GPU。

事前準備

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

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。

設定安全核心模組載入政策

您可以在個別叢集上設定安全核心模組載入政策,也可以將其設為節點集區設定。可用的政策如下:

  • ENFORCE_SIGNED_MODULES:強制規定任何樹狀結構外的核心模組都必須由 Google 簽署。這項政策規定節點集區必須使用 cgroup v2。
  • DO_NOT_ENFORCE_SIGNED_MODULES:允許載入任何已簽署或未簽署的核心模組。這是預設行為。

如果您未指定政策,GKE 會使用預設行為,不會強制執行簽署模組。

在叢集上啟用安全核心模組載入功能

如要為叢集啟用安全核心模組載入功能,請完成下列任一步驟:

  • 如要在新叢集上啟用這項功能,請執行下列指令:

    標準

    gcloud container clusters create CLUSTER_NAME \
       --location=LOCATION \
       --project=PROJECT_ID \
       --enable-kernel-module-signature-enforcement
    

    Autopilot

    gcloud container clusters create-auto CLUSTER_NAME \
       --location=LOCATION \
       --project=PROJECT_ID \
       --enable-kernel-module-signature-enforcement
    

    更改下列內容:

    • CLUSTER_NAME:新叢集的名稱。
    • LOCATION:叢集所在的區域或可用區。
    • PROJECT_ID:您的專案 ID。
  • 如要在現有叢集上啟用這項功能,請執行下列指令:

    gcloud container clusters update CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --enable-kernel-module-signature-enforcement
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • LOCATION:叢集所在的區域或可用區。
    • PROJECT_ID:您的專案 ID。

    更新現有叢集時,系統會在下次有機會時重新建立節點,除非維護期間阻止了這項作業。

在節點集區上啟用安全核心模組載入功能

如要在節點集區上啟用安全的核心模組載入功能,請完成下列任一步驟:

  • 如要在新的節點集區上啟用這項功能,請執行下列指令:

    gcloud container node-pools create NODEPOOL_NAME \
         --cluster=CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --enable-kernel-module-signature-enforcement
    

    更改下列內容:

    • NODEPOOL_NAME:新節點集區的名稱。
    • CLUSTER_NAME:叢集名稱。
    • LOCATION:叢集所在的區域或可用區。
    • PROJECT_ID:您的專案 ID。
  • 如要在現有節點集區中啟用這項功能,請執行下列指令:

    gcloud container node-pools update NODEPOOL_NAME \
         --cluster=CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --enable-kernel-module-signature-enforcement
    

    更改下列內容:

    • NODEPOOL_NAME:要更新的節點集區名稱。
    • CLUSTER_NAME:叢集名稱。
    • LOCATION:叢集所在的區域或可用區。
    • PROJECT_ID:您的專案 ID。

確認已設定安全核心模組政策

如要確認叢集是否已設定政策,請執行下列指令:

gcloud container node-pools describe NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID

在輸出內容中,查看 linuxNodeConfig 區段。「kernelModuleLoading」欄位會顯示目前的政策:

...
config:
  linuxNodeConfig:
    kernelModuleLoading:
      policy: ENFORCE_SIGNED_MODULES
    cgroupMode: CGROUP_MODE_V2

停用安全核心模組載入功能

如要停用安全核心模組載入功能,請完成下列任一步驟:

  • 如要在叢集上停用,請執行下列指令:

    gcloud container clusters update CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --no-enable-kernel-module-signature-enforcement
    
  • 如要停用現有節點集區的自動升級功能,請執行下列指令:

    gcloud container node-pools update NODEPOOL_NAME \
         --cluster=CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --no-enable-kernel-module-signature-enforcement
    

後續步驟