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 fuera del árbol (OOT) firmados en imágenes de Container-Optimized OS seguras. La carga segura de módulos del kernel te ayuda a mejorar la seguridad de tus clústeres y grupos de nodos, ya que te permite controlar mejor la carga de módulos en nodos de CPU o TPU mediante la 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 distintas 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 del kernel OOT. Este ajuste es seguro, pero impide cargar módulos OOT.
- Nodos de GPU: usa una imagen de Container-Optimized OS con Loadpin inhabilitado. Este ajuste 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 ajuste NodeKernelModuleLoading.Policy en LinuxNodeConfig de un grupo de nodos o pasa la marca --enable-kernel-module-signature-enforcement al crear o actualizar un clúster o un grupo de nodos. Si asignas el valor ENFORCE_SIGNED_MODULES a la política, Loadpin se habilitará en tus grupos de nodos de CPU o TPU, pero se configurará 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 seguridad del nodo. Por ejemplo, puedes cargar un controlador necesario en un nodo de CPU sin tener que usar el tipo de imagen de GPU menos restrictivo.
Requisitos y limitaciones
Si habilitas la carga segura de módulos del kernel en tus grupos de nodos, se aplicarán los siguientes requisitos y limitaciones:
- Módulos admitidos: solo se permiten 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 cgroup de Kubernetes.
- Versión de GKE: esta función está disponible en las versiones 1.34.1-gke.2364000 y posteriores de los clústeres 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. Las GPUs no son compatibles.
Antes de empezar
Antes de empezar, asegúrate de que has realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la CLI de gcloud, obtén la versión más reciente ejecutando el comando
gcloud components update. Es posible que las versiones anteriores de la interfaz de línea de comandos de gcloud no admitan la ejecución de los comandos de este documento.
Configurar la política de carga del módulo del kernel seguro
Puedes configurar la política de carga de módulos del kernel seguro en clústeres concretos o como ajuste de un pool de nodos. Las políticas disponibles son las siguientes:
ENFORCE_SIGNED_MODULES: obliga a que todos los módulos del kernel externos al árbol estén firmados por Google. 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 ninguna política, GKE usará el comportamiento predeterminado, que no aplica módulos firmados.
Habilitar 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, siga uno de estos pasos:
Para habilitarlo 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-enforcementHaz los cambios siguientes:
CLUSTER_NAME: el nombre del nuevo clúster.LOCATION: la región o la zona del clúster.PROJECT_ID: tu ID de proyecto.
Para habilitarlo en un clúster, ejecuta el siguiente comando:
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementHaz los cambios siguientes:
CLUSTER_NAME: el nombre de tu clúster.LOCATION: la región o la zona del clúster.PROJECT_ID: tu ID de proyecto.
Cuando actualizas un clúster, los nodos se vuelven a crear en la siguiente oportunidad disponible, a menos que lo impida una ventana de mantenimiento.
Habilitar 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 habilitarlo en un nuevo grupo de nodos, ejecuta el siguiente comando:
gcloud container node-pools create NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementHaz los cambios siguientes:
NODEPOOL_NAME: el nombre del nuevo grupo de nodos.CLUSTER_NAME: el nombre de tu clúster.LOCATION: la región o la zona del clúster.PROJECT_ID: tu ID de proyecto.
Para habilitarlo en un grupo de nodos, ejecuta el siguiente comando:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementHaz los cambios siguientes:
NODEPOOL_NAME: el nombre del grupo de nodos que se va a actualizar.CLUSTER_NAME: el nombre de tu clúster.LOCATION: la región o la zona del clúster.PROJECT_ID: tu ID de proyecto.
Confirmar que se ha definido la política del módulo del kernel seguro
Para confirmar que se ha definido 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, comprueba la sección linuxNodeConfig. En el campo kernelModuleLoading se muestra la política actual:
...
config:
linuxNodeConfig:
kernelModuleLoading:
policy: ENFORCE_SIGNED_MODULES
cgroupMode: CGROUP_MODE_V2
Inhabilitar la carga segura de módulos del kernel
Para inhabilitar la carga segura de módulos del kernel, siga uno de estos pasos:
Para inhabilitar esta opció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 esta opción en un grupo de nodos, 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
Siguientes pasos
- Consulta cómo reforzar la seguridad de tu clúster.