Configure o carregamento seguro de módulos do kernel

O carregamento seguro de módulos do kernel do Google Kubernetes Engine (GKE) permite-lhe executar cargas de trabalho que requerem módulos do kernel assinados e fora da árvore (OOT) em imagens seguras do SO otimizado para contentores. O carregamento seguro de módulos do kernel ajuda a melhorar a postura de segurança dos seus clusters e conjuntos de nós, dando-lhe mais controlo sobre o carregamento de módulos em nós de CPU ou TPU com validação de assinatura.

Como funciona o carregamento do módulo do kernel seguro

Por predefinição, os nós do GKE usam imagens do SO otimizado para contentores diferentes com configurações de segurança diferentes, consoante o tipo de nó:

  • Nós de CPU e TPU: use uma imagem do SO otimizado para contentores com o Loadpin do módulo de segurança do Linux (LSM) ativado. O Loadpin restringe o carregamento de módulos do kernel OOT. Esta definição é segura, mas impede o carregamento de módulos OOT.
  • Nós de GPU: use uma imagem do SO otimizado para contentores com o Loadpin desativado. Esta definição permite o carregamento de módulos OOT, como a instalação de controladores NVIDIA, mas é menos segura por predefinição.

Ativa o carregamento seguro de módulos do kernel através da definição NodeKernelModuleLoading.Policy no LinuxNodeConfig para um conjunto de nós ou transmitindo o sinalizador --enable-kernel-module-signature-enforcement quando cria ou atualiza um cluster ou um conjunto de nós. Quando define a política como ENFORCE_SIGNED_MODULES, nos seus conjuntos de nós da CPU ou da TPU, o Loadpin é ativado, mas configurado para permitir o carregamento de módulos do kernel de fora do sistema de ficheiros raiz. Os módulos têm de ser assinados e o sistema só permite módulos assinados pela Google.

Quando usar o carregamento seguro de módulos do kernel

Use o carregamento seguro de módulos do kernel quando precisar de carregar módulos do kernel OOT assinados pela Google, como controladores personalizados ou sistemas de ficheiros como o Lustre, em qualquer tipo de nó do GKE. Esta funcionalidade permite-lhe usar estes módulos sem reduzir a postura de segurança do nó. Por exemplo, pode carregar um controlador necessário num nó da CPU sem ter de usar o tipo de imagem de GPU menos restritivo.

Requisitos e limitações

Quando ativa o carregamento seguro de módulos do kernel nos seus conjuntos de nós, aplicam-se os seguintes requisitos e limitações:

  • Módulos suportados: apenas são permitidos módulos OOT assinados pela Google.
  • cgroup v2: o node pool tem de usar o cgroup v2. A API Google Kubernetes Engine rejeita pedidos para ativar esta política em pools de nós que usam cgroup v1. Para mais informações, consulte a documentação sobre cgroups do Kubernetes.
  • Versão do GKE: esta funcionalidade está disponível nas versões 1.34.1-gke.2364000 e posteriores do cluster do GKE.
  • Tipos de imagens de GPU: apenas as imagens de CPU e TPU suportam o carregamento seguro de módulos do kernel. As GPUs não são suportadas.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize a CLI gcloud. Se instalou anteriormente a CLI gcloud, execute o comando gcloud components update para obter a versão mais recente. As versões anteriores da CLI gcloud podem não suportar a execução dos comandos neste documento.

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

Pode configurar a política de carregamento de módulos do kernel seguro em clusters individuais ou como uma definição do conjunto de nós. As políticas disponíveis são:

  • ENFORCE_SIGNED_MODULES: aplica que todos os módulos do kernel fora da árvore sejam assinados pela Google. Esta política requer que o conjunto de nós use o cgroup v2.
  • DO_NOT_ENFORCE_SIGNED_MODULES: permite o carregamento de qualquer módulo de kernel, assinado ou não assinado. Este é o comportamento predefinido.

Se não especificar uma política, o GKE usa o comportamento predefinido, que não aplica módulos assinados.

Ative o carregamento seguro de módulos do kernel num cluster

Para ativar o carregamento seguro de módulos do kernel num cluster, conclua um dos seguintes passos:

  • Para ativar num novo cluster, execute o seguinte comando:

    Standard

    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 o seguinte:

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

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

    Substitua o seguinte:

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

    Quando atualiza um cluster existente, os nós são recriados na próxima oportunidade disponível, a menos que seja impedido por um período de manutenção.

Ative o carregamento seguro de módulos do kernel num conjunto de nós

Para ativar o carregamento seguro de módulos do kernel num conjunto de nós, conclua um dos seguintes passos:

  • Para ativar num novo conjunto 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 o seguinte:

    • NODEPOOL_NAME: o nome do novo node pool.
    • CLUSTER_NAME: o nome do seu cluster.
    • LOCATION: a região ou a zona do cluster.
    • PROJECT_ID: o ID do projeto.
  • Para ativar num conjunto de nós existente, 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 o seguinte:

    • NODEPOOL_NAME: o nome do node pool a atualizar.
    • CLUSTER_NAME: o nome do seu cluster.
    • LOCATION: a região ou a zona do cluster.
    • PROJECT_ID: o ID do projeto.

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

Para confirmar que 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

No resultado, verifique a secção linuxNodeConfig. O campo kernelModuleLoading mostra a política atual:

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

Desative o carregamento do módulo do kernel seguro

Para desativar o carregamento de módulos do kernel seguros, conclua um dos seguintes passos:

  • Para desativar num cluster, execute o seguinte comando:

    gcloud container clusters update CLUSTER_NAME \
         --location=LOCATION \
         --project=PROJECT_ID \
         --no-enable-kernel-module-signature-enforcement
    
  • Para desativar num conjunto de nós existente, 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
    

O que se segue?