Configurar o carregamento seguro de módulos do kernel

Com o carregamento seguro de módulos do kernel do Google Kubernetes Engine (GKE), é possível executar cargas de trabalho que exigem módulos do kernel assinados e fora da árvore (OOT) em imagens seguras do Container-Optimized OS. O carregamento seguro de módulos do kernel ajuda a melhorar a postura de segurança dos seus clusters e pools de nós, oferecendo mais controle sobre o carregamento de módulos em nós de CPU ou TPU com verificação de assinatura.

Como funciona o carregamento seguro de módulos do kernel

Por padrão, os nós do GKE usam diferentes imagens do Container-Optimized OS com configurações de segurança diferentes, dependendo do tipo de nó:

  • Nós de CPU e TPU: use uma imagem do Container-Optimized OS com o Loadpin do módulo de segurança do Linux (LSM) ativado. O Loadpin restringe o carregamento de qualquer módulo de kernel OOT. Essa configuração é segura, mas impede o carregamento de módulos OOT.
  • Nós de GPU: use uma imagem do Container-Optimized OS com o Loadpin desativado. Essa configuração permite carregar módulos OOT, como a instalação de drivers da NVIDIA, mas é menos segura por padrão.

Para ativar o carregamento seguro de módulos do kernel, use a configuração NodeKernelModuleLoading.Policy no LinuxNodeConfig de um pool de nós ou transmita a flag --enable-kernel-module-signature-enforcement ao criar ou atualizar um cluster ou pool de nós. Quando você define a política como ENFORCE_SIGNED_MODULES, nos pools de nós de CPU ou TPU, o Loadpin é ativado, mas configurado para permitir o carregamento de módulos do kernel de fora do sistema de arquivos raiz. Os módulos precisam ser assinados, e o sistema permite apenas módulos assinados pelo Google.

Quando usar o carregamento seguro de módulos do kernel

Use o carregamento seguro de módulos do kernel quando precisar carregar módulos do kernel OOT assinados pelo Google, como drivers personalizados ou sistemas de arquivos como o Lustre, em qualquer tipo de nó do GKE. Com esse recurso, é possível usar esses módulos sem reduzir a postura de segurança do nó. Por exemplo, é possível carregar um driver necessário em um nó de CPU sem precisar usar o tipo de imagem de GPU menos restritivo.

Requisitos e limitações

Ao ativar o carregamento seguro de módulos do kernel nos seus pools de nós, os seguintes requisitos e limitações se aplicam:

  • Módulos compatíveis: apenas módulos OOT assinados pelo Google são permitidos.
  • cgroup v2: o pool de nós precisa usar cgroup v2. A API Google Kubernetes Engine rejeita solicitações para ativar essa política em pools de nós que usam cgroup v1. Para mais informações, consulte a documentação do cgroup do Kubernetes.
  • Versão do GKE: esse recurso está disponível nas versões 1.34.1-gke.2364000 e mais recentes do cluster do GKE.
  • Tipos de imagens de GPU: apenas imagens de CPU e TPU são compatíveis com o carregamento seguro de módulos do kernel. GPUs não são compatíveis.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a CLI do Google Cloud para essa tarefa, instale e inicialize a gcloud CLI. Se você instalou a gcloud CLI anteriormente, instale a versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da gcloud CLI não sejam compatíveis com a execução dos comandos neste documento.

Configurar a política de carregamento seguro de módulos do kernel

É possível configurar a política de carregamento de módulos do kernel seguro em clusters individuais ou como uma configuração de pool de nós. As políticas disponíveis são:

  • ENFORCE_SIGNED_MODULES: exige que todos os módulos de kernel fora da árvore sejam assinados pelo Google. Essa política exige que o pool de nós use o cgroup v2.
  • DO_NOT_ENFORCE_SIGNED_MODULES: permite que qualquer módulo do kernel, assinado ou não assinado, seja carregado. Esse é o comportamento padrão.

Se você não especificar uma política, o GKE usará o comportamento padrão, que não exige módulos assinados.

Ativar o carregamento seguro de módulos do kernel em um cluster

Para ativar o carregamento seguro de módulos do kernel em um cluster, siga uma destas etapas:

  • Para ativar em um novo cluster, execute o seguinte comando:

    Padrão

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

    Piloto automático

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

    Substitua:

    • CLUSTER_NAME: o nome do novo cluster;
    • LOCATION: a região ou zona do cluster.
    • PROJECT_ID: o ID do projeto.
  • Para ativar em um cluster atual, execute o seguinte comando:

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

    Substitua:

    • CLUSTER_NAME: o nome do cluster.
    • LOCATION: a região ou zona do cluster.
    • PROJECT_ID: o ID do projeto.

    Quando você atualiza um cluster, os nós são recriados na próxima oportunidade disponível, a menos que uma janela de manutenção impeça isso.

Ativar o carregamento seguro de módulos do kernel em um pool de nós

Para ativar o carregamento seguro de módulos do kernel em um pool de nós, siga uma das etapas abaixo:

  • Para ativar em um novo pool de nós, execute o seguinte comando:

    gcloud container node-pools create NODEPOOL_NAME \
         --cluster=CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --enable-kernel-module-signature-enforcement
    

    Substitua:

    • NODEPOOL_NAME: o nome do novo pool de nós.
    • CLUSTER_NAME: o nome do cluster.
    • LOCATION: a região ou zona do cluster.
    • PROJECT_ID: o ID do projeto.
  • Para ativar em um pool de nós atual, execute o seguinte comando:

    gcloud container node-pools update NODEPOOL_NAME \
         --cluster=CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --enable-kernel-module-signature-enforcement
    

    Substitua:

    • NODEPOOL_NAME: o nome do pool de nós a ser atualizado;
    • CLUSTER_NAME: o nome do cluster.
    • LOCATION: a região ou zona do cluster.
    • PROJECT_ID: o ID do projeto.

Confirme se a política do módulo de kernel seguro está definida

Para confirmar se uma política está definida para um cluster, execute o seguinte comando:

gcloud container node-pools describe NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \
    --project=PROJECT_ID

Na saída, verifique a seção linuxNodeConfig. O campo kernelModuleLoading mostra a política atual:

...
config:
  linuxNodeConfig:
    kernelModuleLoading:
      policy: ENFORCE_SIGNED_MODULES
    cgroupMode: CGROUP_MODE_V2

Desativar o carregamento seguro de módulos do kernel

Para desativar o carregamento seguro de módulos do kernel, siga uma destas etapas:

  • Para desativar em um cluster, execute o seguinte comando:

    gcloud container clusters update CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --no-enable-kernel-module-signature-enforcement
    
  • Para desativar em um pool de nós atual, execute o seguinte comando:

    gcloud container node-pools update NODEPOOL_NAME \
         --cluster=CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --no-enable-kernel-module-signature-enforcement
    

A seguir