Configurar la carga segura de módulos del kernel

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-enforcement
    

    Autopilot

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

    Haz 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-enforcement
    

    Haz 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-enforcement
    

    Haz 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-enforcement
    

    Haz 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-enforcement
    
  • Para 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