I container che eseguono codice sconosciuto o non attendibile nei cluster Google Kubernetes Engine (GKE) rappresentano un potenziale rischio per la sicurezza del kernel host dei nodi. Puoi proteggere il kernel host da queste minacce isolando il codice dal kernel. Questo documento descrive come GKE Sandbox crea questo livello di isolamento utilizzando tecnologie come gVisor e microVM.
Questo documento è destinato agli esperti di sicurezza che vogliono ridurre la superficie di attacco nei nodi GKE e proteggerli da codice non attendibile. Dovresti già avere familiarità con quanto segue:
Informazioni sul sandboxing in GKE
Il runtime del container installato sui nodi, ad esempio containerd, fornisce un certo livello di isolamento tra i processi del container e il kernel in esecuzione sul nodo. Tuttavia, il runtime del container viene spesso eseguito come utente con privilegi sul nodo e ha accesso alla maggior parte delle chiamate di sistema al kernel host.
In Kubernetes e GKE, il sandboxing isola i container in esecuzione per limitare il potenziale impatto di exploit o errori che interessano altri container o il runtime del container. Puoi eseguire i container in sandbox per proteggere il kernel dell'istanza Compute Engine sottostante da codice non attendibile o sconosciuto. Il sandboxing è anche una buona misura di difesa in profondità per proteggere i container di alto valore dall'influenza di altri carichi di lavoro. Puoi eseguire i workload in sandbox utilizzando GKE Sandbox.
Potenziali minacce
Un difetto nel runtime del container o nel kernel host potrebbe consentire a un processo in esecuzione all'interno di un container di"uscire" dal container e influire sul kernel del nodo. I cluster multi-tenant e i cluster in cui i container eseguono workload non attendibili sono più esposti alle vulnerabilità di sicurezza rispetto ad altri cluster. Alcuni esempi sono:
- Organizzazioni che consentono agli utenti di caricare ed eseguire codice, come fornitori SaaS e fornitori di hosting web.
- Agenti AI che generano ed eseguono codice, spesso senza supervisione.
Le tecnologie di sandboxing utilizzate da GKE Sandbox aiutano a mitigare il seguente potenziale impatto dei container escape:
- Codice dannoso o difettoso che causa l'arresto anomalo del kernel host e del nodo.
- Tenant malintenzionati che sottraggono i dati di un altro tenant presenti in memoria o su un disco.
- Workload non attendibili che accedono ad altri servizi Google Cloud o ai metadati del cluster.
Tecnologie sandbox in GKE
GKE Sandbox supporta le seguenti tecnologie sandbox, ognuna delle quali utilizza un approccio diverso per isolare i workload e funziona bene per diversi casi d'uso:
gVisor: una reimplementazione nello spazio utente dell'API del kernel Linux che non richiede privilegi elevati. Il kernel userspace e il runtime del container reimplementano la maggior parte delle chiamate di sistema e le gestiscono per conto del kernel host. L'accesso diretto al kernel host è limitato. Per maggiori informazioni sul funzionamento del kernel guest, consulta la Guida all'architettura di gVisor.
MicroVMs: macchine virtuali leggere che eseguono un kernel Linux completo e un sistema operativo. Ogni pod viene eseguito nella propria microVM, che fornisce un isolamento rigoroso dagli altri pod e dal nodo host. GKE Sandbox utilizza il software open source Kata Containers e il monitor della macchina virtuale Cloud Hypervisor (VMM) per creare e gestire le microVM.
La seguente tabella riassume le principali differenze tra gVisor e le microVM. Utilizza queste informazioni per scegliere la tecnologia sandbox appropriata per il tuo caso d'uso.
| gVisor | MicroVMs | |
|---|---|---|
| Accesso al kernel | Sottoinsieme di chiamate di sistema del kernel Linux | Kernel Linux completo |
| Livello di isolamento | Intercettazione delle chiamate di sistema in un kernel userspace | Virtualizzazione hardware completa con un kernel guest dedicato |
| Overhead di CPU e memoria | Overhead dinamico con memoria di base ridotta per il kernel dello spazio utente | Overhead fisso di 250 mCPU e 130 MiB di memoria per ogni pod |
| Ora di inizio | Meno di 200 ms | Circa 1-2 secondi |
| Configurazione dei nodi GKE | Disponibile in tutti i pool di nodi Standard e nei nodi Autopilot. Abilitato per impostazione predefinita nei cluster Autopilot. | Disponibile solo nei nodi che abilitano la virtualizzazione nidificata. |
| Supporto delle immagini dei nodi | Solo Container-Optimized OS | Container-Optimized OS o Ubuntu |
| Compatibilità dei tipi di macchina | Supportato dalla maggior parte delle CPU, dall'architettura Arm e dai tipi di macchine con acceleratore. | Supportato solo dai tipi di macchine che supportano la virtualizzazione nidificata. |
| Supporto degli acceleratori | Supporta modelli di GPU e versioni di TPU specifici. | Non supporta GPU o TPU. |
| Container con privilegi | Non supportati. | Supportato. I container con privilegi ottengono l'accesso root solo al sistema operativo guest nella microVM e non al nodo host. |
| Esempi di casi d'uso |
|
|
Per ulteriori informazioni che potrebbero aiutarti a decidere quali applicazioni eseguire in un tipo specifico di sandbox, consulta Limitazioni.
Come funziona la richiesta di sandbox
Per eseguire un'applicazione in una sandbox:
- Abilita una tecnologia sandbox nei nodi utilizzando ComputeClass per creare automaticamente i nodi o creando manualmente i node pool.
- Richiedi una sandbox per i pod utilizzando la classe RuntimeClass corrispondente per quel tipo di sandbox, ad esempio
gvisoromicrovm. Per maggiori informazioni, consulta Rafforzare l'isolamento dei workload con GKE Sandbox.
GKE pianifica i pod sui nodi che utilizzano la tecnologia della sandbox richiesta, che poi gestisce l'esecuzione dell'applicazione nella sandbox. Se vuoi, puoi eseguire i pod che non richiedono sandbox sui nodi in cui è abilitato GKE Sandbox utilizzando selettori di nodi e tolleranze, il che è utile per i workload attendibili, come gli strumenti di monitoraggio, che vuoi eseguire su ogni nodo.
Altri suggerimenti per la sicurezza
Quando utilizzi GKE Sandbox, ti consigliamo di seguire anche questi suggerimenti:
Specifica limiti delle risorse su tutti i container in esecuzione in un sandbox. In questo modo si protegge dal rischio che un'applicazione difettosa o dannosa privi il nodo di risorse e influenzino negativamente altre applicazioni o processi di sistema in esecuzione sul nodo.
Se utilizzi Workload Identity Federation for GKE, blocca l'accesso ai metadati del cluster utilizzando Network Policy per bloccare l'accesso a
169.254.169.254. In questo modo, si protegge dal rischio che un'applicazione malintenzionata acceda a informazioni potenzialmente private come ID progetto, nome del nodo e zona. La federazione delle identità per i workload per GKE è sempre abilitata nei cluster GKE Autopilot.
Limitazioni
GKE Sandbox funziona bene con molte applicazioni, ma non con tutte. Questa sezione fornisce maggiori informazioni sulle limitazioni attuali di GKE Sandbox.
GPU in GKE Sandbox
Puoi eseguire i workload della GPU in sandbox utilizzando gVisor. gVisor non mitiga tutte le vulnerabilità dei driver NVIDIA, ma mantiene la protezione contro le vulnerabilità del kernel Linux. Non utilizzare la condivisione del tempo della GPU nei pod in sandbox, perché la GPU non è completamente isolata tra i pod. Per saperne di più su come gVisor protegge i workload GPU, consulta la Guida al supporto delle GPU.
Ai carichi di lavoro GPU in GKE Sandbox si applicano le seguenti limitazioni:
- Le microVM non supportano le GPU.
- Per gVisor si applicano le seguenti limitazioni:
- Sono supportati solo i carichi di lavoro CUDA.
- È supportato solo un sottoinsieme dei modelli di GPU disponibili. Per ulteriori informazioni, vedi Supporto dei modelli di GPU.
- Per ogni versione di GKE sono supportate solo le versioni dei driver NVIDIA
latestedefault. Altre versioni del driver potrebbero non funzionare. - Non tutte le funzionalità della GPU, come RDMA o IMEX, sono supportate. A seconda delle esigenze dei clienti, gVisor potrebbe supportare funzionalità specifiche caso per caso. Per richiedere assistenza per una funzionalità specifica, apri una richiesta di assistenza o apri una richiesta di funzionalità gVisor.
Supporto dei modelli di GPU
La tabella seguente descrive il supporto per diversi modelli di GPU in GKE Sandbox:
| Modello | Anteprima | Assistenza GA | Note |
|---|---|---|---|
|
|
|
- | - |
|
|
|
- | - |
|
|
- |
|
Supportato dal lancio iniziale. |
|
|
non supportato | non supportato | Le GPU V100 e P100 utilizzano driver proprietari e non saranno supportate. |
|
|
- | - | GKE Sandbox non supporta i tipi di nodi Windows o Ubuntu, che sono richiesti per i nodi delle workstation virtuali. |
TPU in GKE Sandbox
In GKE versione 1.31.3-gke.1111001 e successive, puoi eseguire i workload TPU in sandbox utilizzando gVisor. gVisor non mitiga tutte le vulnerabilità dei driver TPU, ma mantiene la protezione contro le vulnerabilità del kernel Linux. Per saperne di più su come il progetto gVisor protegge i carichi di lavoro TPU, consulta la Guida all'assistenza TPU.
Ai carichi di lavoro TPU in GKE Sandbox si applicano le seguenti limitazioni:
- Le microVM non supportano le TPU.
gVisor supporta le seguenti versioni di TPU:
- V4pod
- V4lite
- V5litepod
- V5pod
- V6e
Configurazione dei nodi
Ai nodi che utilizzano GKE Sandbox si applicano le seguenti limitazioni:
- gVisor e le microVM supportano solo i nodi Linux. I nodi Windows Server non sono supportati.
- gVisor supporta solo l'immagine del nodo Container-Optimized OS. Le microVM supportano le immagini del nodo Container-Optimized OS e Ubuntu.
- Le microVM richiedono l'abilitazione della virtualizzazione nidificata sui nodi. Si applicano tutti i requisiti e le limitazioni della virtualizzazione nidificata.
- Nei cluster Standard, non puoi abilitare GKE Sandbox nel pool di nodi predefinito. Il cluster deve avere sempre almeno un pool di nodi che non utilizza GKE Sandbox. Questo pool di nodi deve contenere almeno un nodo, anche se tutti i tuoi workload sono in sandbox. Questa limitazione esiste per separare i servizi di sistema dai carichi di lavoro non attendibili.
Accesso ai metadati del cluster
Se i tuoi nodi utilizzano il tipo di sandbox gVisor, i pod sui nodi non possono accedere ai metadati del cluster a livello di sistema operativo del nodo. Inoltre, i pod non possono accedere ai servizi Google Cloud a meno che tu non utilizzi Workload Identity Federation for GKE per concedere ruoli alle identità dei pod.
Questa limitazione non si applica al tipo di sandbox microVM. Per impedire l'accesso ai metadati del cluster
dai pod nelle microVM, utilizza una
NetworkPolicy che nega
il traffico in uscita a 169.254.169.252/32 sulla porta 988 o, nei cluster che utilizzano
GKE Dataplane V2, a 169.254.169.254/32 sulla porta 80.
SMT potrebbe essere disattivato
Le impostazioni di multi-threading simultaneo (SMT), noto anche come Hyper-Threading sulle CPU Intel, vengono utilizzate per mitigare le vulnerabilità dei canali laterali che sfruttano i thread che condividono lo stato del core, come le vulnerabilità di Microarchitectural Data Sampling (MDS).
Per mitigare gli attacchi side-channel, gVisor utilizza Linux Core Scheduling. Le impostazioni SMT sono invariate rispetto ai valori predefiniti. La pianificazione dei core Linux si applica solo ai pod eseguiti nei sandbox gVisor.
L'impostazione SMT o Hyper-Threading predefinita per un tipo di macchina dipende dalla vulnerabilità della macchina a MDS, come segue:
- Pod Autopilot che utilizzano la
Scale-OutComputeClass: SMT è sempre disabilitato. - Tipi di macchine che utilizzano processori Intel: l'hyperthreading è disattivato per impostazione predefinita.
- Tipi di macchine che utilizzano processori AMD: SMT è attivato per impostazione predefinita.
- Tipi di macchina che utilizzano un solo thread per core, come i processori Arm: nessun supporto SMT. Tutte le vCPU richieste sono visibili.
Abilita SMT
Nei pool di nodi GKE Standard, puoi abilitare SMT se è disabilitato per impostazione predefinita per il tipo di macchina selezionato. Ti viene addebitato il costo di ogni vCPU, indipendentemente dal fatto che tu attivi o disattivi SMT. Per ulteriori informazioni, consulta i prezzi quando modifichi il numero di thread per core. Per modificare l'impostazione SMT, esegui una delle seguenti operazioni:
Imposta il flag
--threads-per-corequando crei un pool di nodi GKE Sandbox che utilizza gVisor:gcloud container node-pools create smt-enabled \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --machine-type=MACHINE_TYPE \ --threads-per-core=2 \ --sandbox=type=gvisorCLUSTER_NAME: il nome di un cluster esistente in cui vuoi creare il nuovo pool di nodi.LOCATION: la regione o la zona di Compute Engine del cluster.MACHINE_TYPE: il tipo di macchina.
Utilizza un DaemonSet per attivare SMT su un pool di nodi esistente:
Aggiungi l'etichetta del nodo
cloud.google.com/gke-smt-disabled=falsea un pool di nodi esistente che utilizza gVisor:gcloud container node-pools update NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION \ --node-labels=cloud.google.com/gke-smt-disabled=falseSostituisci quanto segue:
NODE_POOL_NAME: il nome del pool di nodi esistente.CLUSTER_NAME: il nome di un cluster esistente in cui vuoi creare il nuovo pool di nodi.LOCATION: la regione o la zona di Compute Engine del cluster.
Esegui il deployment di DaemonSet. DaemonSet viene eseguito solo sui nodi con l'etichetta
cloud.google.com/gke-smt-disabled=false.kubectl create -f \ https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-node-tools/master/disable-smt/gke/enable-smt.yamlAssicurati che i pod DaemonSet siano in stato di esecuzione.
kubectl get pods --selector=name=enable-smt -n kube-systemL'output è simile al seguente:
NAME READY STATUS RESTARTS AGE enable-smt-2xnnc 1/1 Running 0 6mVerifica che
SMT has been enabledvenga visualizzato nei log dei pod:kubectl logs enable-smt-2xnnc enable-smt -n kube-system
Funzionalità
Applicabile ai cluster Standard
Per impostazione predefinita, al container viene impedito di aprire socket non elaborati per ridurre il potenziale di attacchi dannosi. Alcuni strumenti correlati alla rete, come ping
e tcpdump, creano socket non elaborati nell'ambito del loro funzionamento principale. Per attivare i raw socket, devi aggiungere esplicitamente la funzionalità NET_RAW al contesto di sicurezza del container:
spec:
containers:
- name: my-container
securityContext:
capabilities:
add: ["NET_RAW"]
Se utilizzi GKE Autopilot, Google Cloud ti impedisce di
aggiungere l'autorizzazione NET_RAW ai container a causa delle implicazioni di sicurezza
di questa funzionalità.
Dipendenze esterne
Si applica ai cluster Autopilot e Standard
Il codice non attendibile in esecuzione all'interno della sandbox potrebbe essere autorizzato a raggiungere servizi esterni come server di database, API, altri container e driver CSI. Questi servizi vengono eseguiti al di fuori del limite della sandbox e devono essere protetti singolarmente. Un malintenzionato può tentare di sfruttare le vulnerabilità di questi servizi per uscire dalla sandbox. Devi considerare il rischio e l'impatto di questi servizi raggiungibili dal codice in esecuzione all'interno della sandbox e applicare le misure necessarie per proteggerli.
Sono incluse le implementazioni del file system per i volumi dei container, come ext4 e i driver CSI. I driver CSI vengono eseguiti al di fuori dell'isolamento della sandbox e potrebbero avere accesso privilegiato all'host e ai servizi. Un exploit in questi driver può influire sul kernel host e compromettere l'intero nodo. Ti consigliamo di eseguire il driver CSI all'interno di un container con la quantità minima di autorizzazioni richieste, per ridurre l'esposizione in caso di exploit. GKE Sandbox supporta l'utilizzo del driver CSI per Compute Engine Persistent Disk.
Funzionalità incompatibili
A GKE Sandbox si applicano le seguenti limitazioni delle funzionalità:
Si applicano le seguenti limitazioni sia alle sandbox gVisor che alle microVM:
- Cloud Service Mesh non è supportato per le sandbox nei cluster Autopilot.
- I moduli di sicurezza del kernel Linux come seccomp, AppArmor, SELinux, il
flag No New Privileges,
la
propagazione del montaggio bidirezionale
e il
contesto di sicurezza del pod
procMountnon sono supportati nei pod in modalità sandbox. - Le metriche di utilizzo della memoria a livello di contenitore non sono supportate. Tuttavia, l'utilizzo della memoria dei pod è supportato.
Le seguenti limitazioni si applicano solo alle sandbox gVisor:
- I container che utilizzano la modalità con privilegi non sono supportati.
- I volumi di blocchi non elaborati non sono supportati.
- Il port forwarding, ad esempio utilizzando
kubectl port-forward, non è supportato. - L'archiviazione hostpath non è supportata.
- L'impostazione dei parametri del kernel
sysctlnon è supportata. - I limiti di CPU e memoria vengono applicati solo ai pod con le classi QoS
GuaranteedoBurstablee solo quando i limiti di CPU e memoria vengono specificati per tutti i container nel pod.
Le seguenti limitazioni si applicano solo alle sandbox microVM:
- I pod che utilizzano l'impostazione
hostNetwork: truenon sono supportati. I pod che vengono eseguiti in un sandbox microVM e utilizzano l'impostazionehostNetwork: truenon possono accedere a risorse esterne al pod. - Qualsiasi strumento di diagnostica che si basa sul tracciamento a livello di socket può accedere solo alle interfacce di rete collegate alla microVM.
- I pod che utilizzano l'impostazione
Passaggi successivi
- Configura GKE Sandbox.
- Leggi la panoramica della sicurezza.
- Scopri di più sul ciclo di vita dei pod.