La carga segura de módulos del kernel de Google Kubernetes Engine (GKE) te permite ejecutar cargas de trabajo que requieren módulos del kernel firmados y externos al árbol (OOT) en imágenes seguras de Container-Optimized OS. La carga segura de módulos del kernel ayuda a mejorar la postura de seguridad de tus clústeres y grupos de nodos, ya que te brinda más control sobre la carga de módulos en nodos de CPU o TPU con verificación de firmas.
Cómo funciona la carga segura de módulos del kernel
De forma predeterminada, los nodos de GKE usan diferentes imágenes de Container-Optimized OS con diferentes configuraciones de seguridad, según el tipo de nodo:
- Nodos de CPU y TPU: Usa una imagen de Container-Optimized OS con Loadpin del módulo de seguridad de Linux (LSM) habilitado. Loadpin restringe la carga de cualquier módulo de kernel OOT. Este parámetro de configuración es seguro, pero impide la carga de módulos OOT.
- Nodos de GPU: Usa una imagen de Container-Optimized OS con Loadpin inhabilitado. Este parámetro de configuración permite cargar módulos OOT, como la instalación de controladores de NVIDIA, pero es menos seguro de forma predeterminada.
Para habilitar la carga segura de módulos del kernel, usa el parámetro de configuración NodeKernelModuleLoading.Policy en LinuxNodeConfig para un grupo de nodos o pasa la marca --enable-kernel-module-signature-enforcement cuando crees o actualices un clúster o un grupo de nodos. Cuando configuras la política en ENFORCE_SIGNED_MODULES en tus grupos de nodos de CPU o TPU, Loadpin se habilita, pero se configura para permitir la carga de módulos del kernel desde fuera del sistema de archivos raíz. Los módulos deben estar firmados, y el sistema solo permite módulos firmados por Google.
Cuándo usar la carga segura de módulos del kernel
Usa la carga segura de módulos del kernel cuando necesites cargar módulos del kernel OOT firmados por Google, como controladores personalizados o sistemas de archivos como Lustre, en cualquier tipo de nodo de GKE. Esta función te permite usar estos módulos sin reducir la postura de seguridad del nodo. Por ejemplo, puedes cargar un controlador requerido en un nodo de CPU sin necesidad de usar el tipo de imagen de GPU menos restrictivo.
Requisitos y limitaciones
Cuando habilitas la carga segura de módulos del kernel en tus grupos de nodos, se aplican los siguientes requisitos y limitaciones:
- Módulos admitidos: Solo se permiten los módulos OOT firmados por Google.
- cgroup v2: El grupo de nodos debe usar cgroup v2. La API de Google Kubernetes Engine rechaza las solicitudes para habilitar esta política en grupos de nodos que usan cgroup v1. Para obtener más información, consulta la documentación de cgroups de Kubernetes.
- Versión de GKE: Esta función está disponible en las versiones 1.34.1-gke.2364000 y posteriores del clúster de GKE.
- Tipos de imágenes de GPU: Solo las imágenes de CPU y TPU admiten la carga segura de módulos del kernel. No se admiten las GPU.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando
gcloud components updatepara obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos que se describen en este documento.
Configura la política de carga del módulo de kernel seguro
Puedes configurar la política de carga del módulo del kernel seguro en clústeres individuales o como un parámetro de configuración del grupo de nodos. Las políticas disponibles son las siguientes:
ENFORCE_SIGNED_MODULES: Aplica que Google firme todos los módulos del kernel externos al árbol. Esta política requiere que el grupo de nodos use cgroup v2.DO_NOT_ENFORCE_SIGNED_MODULES: Permite cargar cualquier módulo del kernel, firmado o sin firmar. Este es el comportamiento predeterminado.
Si no especificas una política, GKE usa el comportamiento predeterminado, que no aplica módulos firmados.
Habilita la carga segura de módulos del kernel en un clúster
Para habilitar la carga segura de módulos del kernel en un clúster, completa uno de los siguientes pasos:
Para habilitar la función en un clúster nuevo, ejecuta el siguiente comando:
Estándar
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-enforcementReemplaza lo siguiente:
CLUSTER_NAME: Es el nombre del clúster nuevo.LOCATION: Es la región o zona del clúster.PROJECT_ID: el ID de tu proyecto
Para habilitar la función en un clúster existente, ejecuta el siguiente comando:
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementReemplaza lo siguiente:
CLUSTER_NAME: El nombre de tu clúster.LOCATION: Es la región o zona del clúster.PROJECT_ID: el ID de tu proyecto
Cuando actualizas un clúster existente, los nodos se vuelven a crear en la próxima oportunidad disponible, a menos que lo impida un período de mantenimiento.
Habilita la carga segura de módulos del kernel en un grupo de nodos
Para habilitar la carga segura de módulos del kernel en un grupo de nodos, completa uno de los siguientes pasos:
Para habilitar esta opción en un grupo de nodos nuevo, ejecuta el siguiente comando:
gcloud container node-pools create NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementReemplaza lo siguiente:
NODEPOOL_NAME: es el nombre de tu grupo de nodos nuevo.CLUSTER_NAME: El nombre de tu clúster.LOCATION: Es la región o zona del clúster.PROJECT_ID: el ID de tu proyecto
Para habilitar esta opción en un grupo de nodos existente, ejecuta el siguiente comando:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementReemplaza lo siguiente:
NODEPOOL_NAME: el nombre del grupo de nodos que se actualizará.CLUSTER_NAME: El nombre de tu clúster.LOCATION: Es la región o zona del clúster.PROJECT_ID: el ID de tu proyecto
Confirma que se haya establecido la política del módulo del kernel seguro
Para confirmar que se estableció una política para un clúster, ejecuta el siguiente comando:
gcloud container node-pools describe NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--project=PROJECT_ID
En el resultado, verifica la sección linuxNodeConfig. El campo kernelModuleLoading muestra la política actual:
...
config:
linuxNodeConfig:
kernelModuleLoading:
policy: ENFORCE_SIGNED_MODULES
cgroupMode: CGROUP_MODE_V2
Inhabilita la carga segura de módulos del kernel
Para inhabilitar la carga segura de módulos del kernel, completa uno de los siguientes pasos:
Para inhabilitar la función en un clúster, ejecuta el siguiente comando:
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --no-enable-kernel-module-signature-enforcementPara inhabilitar la función en un grupo de nodos existente, ejecuta el siguiente comando:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --no-enable-kernel-module-signature-enforcement
¿Qué sigue?
- Obtén más información para endurecer la seguridad del clúster.