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-enforcementPiloto automático
gcloud container clusters create-auto CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementSubstitua:
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-enforcementSubstitua:
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-enforcementSubstitua:
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-enforcementSubstitua:
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-enforcementPara 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
- Saiba como aumentar a segurança do cluster.