Configura la carga segura de módulos de kernel

La carga segura de módulos de kernel de Google Kubernetes Engine (GKE) te permite ejecutar cargas de trabajo que requieren módulos de kernel firmados y externos (OOT) en imágenes seguras de Container-Optimized OS. La carga segura de módulos de 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 firma.

Cómo funciona la carga segura de módulos de 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: usan una imagen de Container-Optimized OS con el módulo de seguridad de Linux (LSM) Loadpin habilitado. Loadpin restringe cualquier carga de módulo de kernel OOT. Esta configuración es segura, pero impide la carga de módulos OOT.
  • Nodos de GPU: usan una imagen de Container-Optimized OS con Loadpin inhabilitado. Esta configuración permite la carga de módulos OOT, como la instalación de controladores de NVIDIA, pero es menos segura de forma predeterminada.

Para habilitar la carga segura de módulos de 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 estableces la política en ENFORCE_SIGNED_MODULES, en tus grupos de nodos de CPU o TPU, Loadpin está habilitado, pero configurado para permitir la carga de módulos de 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 de kernel

Usa la carga segura de módulos de kernel cuando necesites cargar módulos de 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 de kernel en tus grupos de nodos, se aplican los siguientes requisitos y limitaciones:

  • Módulos compatibles: Solo se permiten módulos OOT firmados por Google.
  • cgroup v2: El grupo de nodos debe usar cgroup v2. La API de 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 de clúster de GKE 1.34.1-gke.2364000 y posteriores.
  • Tipos de imágenes de GPU: Solo las imágenes de CPU y TPU admiten la carga segura de módulos de kernel. No se admiten GPUs.

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 update para obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos de este documento.

Configura la política de carga segura de módulos de kernel

Puedes configurar la política de carga segura de módulos de kernel en clústeres individuales o como una configuración de grupo de nodos. Las políticas disponibles son las siguientes:

  • ENFORCE_SIGNED_MODULES: Aplica que Google firme cualquier módulo de kernel externo. Esta política requiere que el grupo de nodos use cgroup v2.
  • DO_NOT_ENFORCE_SIGNED_MODULES: Permite que se cargue cualquier módulo de kernel, firmado o no. 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 de kernel en un clúster

Para habilitar la carga segura de módulos de kernel en un clúster, completa uno de los siguientes pasos:

  • Para habilitar 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
    

    Reemplaza 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 en un clúster existente, ejecuta el siguiente comando:

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

    Reemplaza 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 de kernel en un grupo de nodos

Para habilitar la carga segura de módulos de kernel en un grupo de nodos, completa uno de los siguientes pasos:

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

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

    Reemplaza 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 estableció la política de carga segura de módulos de kernel

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 de kernel

Para inhabilitar la carga segura de módulos de kernel, completa uno de los siguientes pasos:

  • Para inhabilitar 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 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?