借助 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 标志。如果您在 CPU 或 TPU 节点池上将政策设置为 ENFORCE_SIGNED_MODULES,则会启用 Loadpin,但其会配置为允许从根文件系统外部加载内核模块。模块必须经过签名,并且系统仅允许经过 Google 签名的模块。
何时使用安全内核模块加载
如果您需要在任何 GKE 节点类型上加载 Google 签名的 OOT 内核模块(例如自定义驱动程序或 Lustre 等文件系统),请使用安全内核模块加载。借助此功能,您可以使用这些模块,而不会降低节点的安全状况。例如,您可以在 CPU 节点上加载所需的驱动程序,而无需使用限制较少的 GPU 映像类型。
要求和限制
在节点池上启用安全内核模块加载时,需要满足以下要求并遵守以下限制:
- 支持的模块:仅允许使用经过 Google 签名的 OOT 模块。
- cgroup v2:节点池必须使用 cgroup v2。Google Kubernetes Engine API 会拒绝在采用 cgroup v1 的节点池上启用此政策的请求。如需了解详情,请参阅 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-enforcementAutopilot
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
后续步骤
- 了解如何加固集群的安全。