Il caricamento sicuro dei moduli del kernel di Google Kubernetes Engine (GKE) ti consente di eseguire carichi di lavoro che richiedono moduli del kernel firmati e out-of-tree (OOT) su immagini Container-Optimized OS sicure. Il caricamento sicuro dei moduli del kernel contribuisce a migliorare la postura di sicurezza dei cluster e dei pool di nodi, offrendoti un maggiore controllo sul caricamento dei moduli sui nodi CPU o TPU con la verifica della firma.
Come funziona il caricamento dei moduli del kernel protetto
Per impostazione predefinita, i nodi GKE utilizzano immagini di Container-Optimized OS diverse con configurazioni di sicurezza diverse, a seconda del tipo di nodo:
- Nodi CPU e TPU: utilizza un'immagine Container-Optimized OS con Linux Security Module (LSM) Loadpin abilitato. Loadpin limita il caricamento di qualsiasi modulo kernel OOT. Questa impostazione è sicura, ma impedisce il caricamento dei moduli OOT.
- Nodi GPU: utilizza un'immagine Container-Optimized OS con Loadpin disattivato. Questa impostazione consente il caricamento di moduli OOT, ad esempio l'installazione di driver NVIDIA, ma è meno sicura per impostazione predefinita.
Puoi attivare il caricamento sicuro dei moduli del kernel utilizzando l'impostazione NodeKernelModuleLoading.Policy in LinuxNodeConfig per un node pool o passando il flag --enable-kernel-module-signature-enforcement durante la creazione o l'aggiornamento di un cluster o di un pool di nodi. Quando imposti il criterio su ENFORCE_SIGNED_MODULES, nei pool di nodi CPU o TPU, Loadpin è abilitato, ma configurato per consentire il caricamento dei moduli kernel
dall'esterno del file system root. I moduli devono essere firmati e il sistema consente
solo i moduli firmati da Google.
Quando utilizzare il caricamento sicuro dei moduli del kernel
Utilizza il caricamento sicuro dei moduli kernel quando devi caricare moduli kernel OOT firmati da Google, come driver personalizzati o file system come Lustre, su qualsiasi tipo di nodo GKE. Questa funzionalità ti consente di utilizzare questi moduli senza ridurre il livello di sicurezza del nodo. Ad esempio, puoi caricare un driver richiesto su un nodo CPU senza dover utilizzare il tipo di immagine GPU meno restrittivo.
Requisiti e limitazioni
Quando attivi il caricamento sicuro dei moduli kernel sui tuoi node pool, si applicano i seguenti requisiti e limitazioni:
- Moduli supportati: sono consentiti solo i moduli OOT firmati da Google.
- cgroup v2: il pool di nodi deve utilizzare cgroup v2. L'API Google Kubernetes Engine rifiuta le richieste di attivazione di questo criterio sui pool di nodi che utilizzano cgroup v1. Per ulteriori informazioni, consulta la documentazione sui cgroup di Kubernetes.
- Versione GKE: questa funzionalità è disponibile nelle versioni 1.34.1-gke.2364000 e successive del cluster GKE.
- Tipi di immagini GPU: solo le immagini CPU e TPU supportano il caricamento sicuro dei moduli del kernel. Le GPU non sono supportate.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Google Kubernetes Engine. Attiva l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza
gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il comando
gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
Configura il criterio di caricamento del modulo kernel sicuro
Puoi configurare la policy di caricamento del modulo del kernel sicuro su singoli cluster o come impostazione del pool di nodi. I criteri disponibili sono:
ENFORCE_SIGNED_MODULES: impone che tutti i moduli del kernel out-of-tree siano firmati da Google. Questo criterio richiede che il pool di nodi utilizzi cgroup v2.DO_NOT_ENFORCE_SIGNED_MODULES: consente il caricamento di qualsiasi modulo kernel, firmato o non firmato. Questo è il comportamento standard.
Se non specifichi una policy, GKE utilizza il comportamento predefinito, che non applica i moduli firmati.
Abilitare il caricamento sicuro dei moduli kernel su un cluster
Per attivare il caricamento sicuro dei moduli del kernel in un cluster, completa uno dei seguenti passaggi:
Per abilitare su un nuovo cluster, esegui questo comando:
Standard
gcloud container clusters create CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementAutopilot
gcloud container clusters create-auto CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementSostituisci quanto segue:
CLUSTER_NAME: il nome del nuovo cluster.LOCATION: la regione o la zona del cluster.PROJECT_ID: il tuo ID progetto.
Per abilitare questa funzionalità su un cluster esistente, esegui questo comando:
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementSostituisci quanto segue:
CLUSTER_NAME: il nome del tuo cluster.LOCATION: la regione o la zona del cluster.PROJECT_ID: il tuo ID progetto.
Quando aggiorni un cluster esistente, i nodi vengono ricreati alla prima opportunità disponibile, a meno che non sia impedito da un periodo di manutenzione.
Abilitare il caricamento sicuro dei moduli kernel su un pool di nodi
Per attivare il caricamento sicuro dei moduli kernel in un pool di nodi, completa uno dei seguenti passaggi:
Per abilitare un nuovo pool di nodi, esegui il comando seguente:
gcloud container node-pools create NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementSostituisci quanto segue:
NODEPOOL_NAME: il nome del nuovo pool di nodi.CLUSTER_NAME: il nome del tuo cluster.LOCATION: la regione o la zona del cluster.PROJECT_ID: il tuo ID progetto.
Per abilitare un pool di nodi esistente, esegui questo comando:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --enable-kernel-module-signature-enforcementSostituisci quanto segue:
NODEPOOL_NAME: il nome del pool di nodi da aggiornare.CLUSTER_NAME: il nome del tuo cluster.LOCATION: la regione o la zona del cluster.PROJECT_ID: il tuo ID progetto.
Conferma che il criterio del modulo del kernel sicuro sia impostato
Per confermare che una policy sia impostata per un cluster, esegui questo comando:
gcloud container node-pools describe NODEPOOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--project=PROJECT_ID
Nell'output, controlla la sezione linuxNodeConfig. Il campo kernelModuleLoading
mostra le norme correnti:
...
config:
linuxNodeConfig:
kernelModuleLoading:
policy: ENFORCE_SIGNED_MODULES
cgroupMode: CGROUP_MODE_V2
Disattivare il caricamento sicuro dei moduli kernel
Per disattivare il caricamento del modulo del kernel sicuro, completa uno dei seguenti passaggi:
Per disattivare un cluster, esegui questo comando:
gcloud container clusters update CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --no-enable-kernel-module-signature-enforcementPer disattivare un pool di nodi esistente, esegui questo comando:
gcloud container node-pools update NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --project=PROJECT_ID \ --no-enable-kernel-module-signature-enforcement
Passaggi successivi
- Scopri come rafforzare la sicurezza del cluster.