GKE Sandbox


Questa pagina descrive in che modo GKE Sandbox protegge il kernel host sui tuoi nodi quando i container nel pod eseguono codice sconosciuto o non attendibile. Ad esempio, i cluster multi-tenant come i provider di software-as-a-service (SaaS) spesso eseguono codice sconosciuto inviato dai loro utenti. GKE Sandbox è anche un'utile misura di difesa in profondità per l'esecuzione di container di alto valore.

Questa pagina è rivolta agli esperti di sicurezza per scoprire i vantaggi di GKE Sandbox. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei Google Cloud contenuti, consulta Ruoli e attività utente comuni di GKE Enterprise.

Prima di leggere questa pagina, assicurati di conoscere la documentazione ufficiale di gVisor, il progetto open source utilizzato da GKE Sandbox.

Per istruzioni su come attivare e utilizzare GKE Sandbox, consulta Configurare GKE Sandbox.

Panoramica

GKE Sandbox fornisce un ulteriore livello di sicurezza per impedire al codice non attendibile di influire sul kernel host dei nodi del cluster. Prima di discutere del funzionamento di GKE Sandbox, è utile comprendere la natura dei potenziali rischi che aiuta a mitigare.

Un runtime del contenitore come containerd fornisce un certo grado di isolamento tra i processi del contenitore e il kernel in esecuzione sul nodo. Tuttavia, il runtime del contenitore viene spesso eseguito come utente privilegiato sul nodo e ha accesso alla maggior parte delle chiamate di sistema nel kernel dell'host.

Potenziali minacce

I cluster multi-tenant e i cluster i cui container eseguono carichi di lavoro non attendibili sono più esposti alle vulnerabilità di sicurezza rispetto ad altri cluster. Alcuni esempi sono fornitori SaaS, fornitori di servizi di hosting web o altre organizzazioni che consentono ai propri utenti di caricare ed eseguire codice. Un difetto nel runtime del container o nel kernel dell'host potrebbe consentire a un processo in esecuzione all'interno di un container di "uscire" dal container e influire sul kernel del nodo, causandone potenzialmente l'arresto.

Esiste anche la possibilità che un tenant malintenzionato acceda ai dati di un altro tenant in memoria o su disco e li esfiltri sfruttando questo tipo di difetto.

Infine, un carico di lavoro non attendibile potrebbe potenzialmente accedere ad altri Google Cloud servizi o metadati del cluster.

In che modo GKE Sandbox mitiga queste minacce

gVisor è una reimplementazione nello spazio utente dell'API del kernel Linux che non richiede privilegi elevati. In combinazione con un runtime del contenitore come containerd , il kernel dello spazio utente reimplementa la maggior parte delle chiamate di sistema e le gestisce per conto del kernel host. L'accesso diretto al kernel dell'host è limitato. Per informazioni dettagliate su come funziona, consulta la guida all'architettura di gVisor. Dal punto di vista del contenitore, gVisor è quasi trasparente e non richiede modifiche all'applicazione containerizzata.

Quando richiedi GKE Sandbox in un pod nei cluster Autopilot, GKE esegue il pod in una sandbox. In GKE Standard, se attivi GKE Sandbox sui nodi, tutti i pod in esecuzione su quei nodi vengono eseguiti in sandbox.

Ogni sandbox utilizza il proprio kernel nello spazio utente. Tenendo presente questo, puoi prendere decisioni su come raggruppare i container in pod in base al livello di isolamento richiesto e alle caratteristiche delle tue applicazioni.

GKE Sandbox è particolarmente adatto per i seguenti tipi di applicazioni. Per ulteriori informazioni su come decidere quali applicazioni inserire nella sandbox, consulta la sezione Limitazioni.

  • Applicazioni non attendibili o di terze parti che utilizzano runtime come Rust, Java, Python, PHP, Node.js o Golang
  • Front-end, cache o proxy del server web
  • Applicazioni che elaborano contenuti multimediali o dati esterni utilizzando le CPU
  • Carichi di lavoro di machine learning che utilizzano CPU
  • Applicazioni che utilizzano molta CPU o memoria
  • Carichi di lavoro che richiedono l'uso intensivo della GPU

Altri suggerimenti per la sicurezza

Quando utilizzi GKE Sandbox, ti consigliamo di seguire anche questi consigli:

  • Specifica limiti di risorse su tutti i container in esecuzione in una sandbox. In questo modo si evita il rischio che un'applicazione difettosa o dannosa prosciughi le risorse del nodo e influisca negativamente su 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, viene protetto il rischio che un'applicazione dannosa acceda a informazioni su dati potenzialmente privati come ID progetto, nome del nodo e zona. La federazione delle identità per i carichi di lavoro 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

In GKE 1.29.2-gke.1108000 e versioni successive, GKE Sandbox supporta l'utilizzo di GPU NVIDIA.

GKE Sandbox non mitiga tutte le vulnerabilità dei driver NVIDIA, ma mantiene la protezione contro le vulnerabilità del kernel Linux. Per informazioni dettagliate su come il progetto gVisor protegge i carichi di lavoro delle GPU, consulta la Guida all'assistenza GPU.

I seguenti limiti si applicano ai carichi di lavoro GPU in GKE Sandbox:

  • È supportata solo la versione latest del driver NVIDIA su una determinata versione GKE. I cluster Autopilot installano automaticamente le versioni dei driver NVIDIA che supportano GKE Sandbox.
  • Sono supportati solo i carichi di lavoro CUDA.
  • Sono supportati i seguenti modelli di GPU: nvidia-tesla-t4, nvidia-tesla-a100, nvidia-a100-80gb, nvidia-l4 e nvidia-h100-80gb.

Puoi utilizzare GKE Sandbox con i carichi di lavoro GPU senza costi aggiuntivi.

TPU in GKE Sandbox

In GKE 1.31.3-gke.1111001 e versioni successive, GKE Sandbox supporta l'utilizzo delle TPU di Google.

GKE Sandbox non riduce tutte le vulnerabilità dei driver TPU, ma mantiene la protezione contro le vulnerabilità del kernel Linux. Per informazioni dettagliate su come il progetto gVisor protegge i carichi di lavoro TPU, consulta la Guida all'assistenza TPU.

Sono supportate le seguenti versioni hardware di TPU: V4pod, V4lite, V5litepod, V5pod e V6e.

Puoi utilizzare GKE Sandbox con i carichi di lavoro TPU senza costi aggiuntivi.

Configurazione del node pool

Si applica ai cluster standard

  • Non puoi utilizzare GKE Sandbox nei pool di nodi Windows Server.
  • Non puoi attivare GKE Sandbox nel pool di nodi predefinito per separare i servizi di sistema in esecuzione nel pool di nodi predefinito dai carichi di lavoro non attendibili utilizzando GKE Sandbox.
  • Quando utilizzi GKE Sandbox, il cluster deve avere almeno due pool di nodi. Devi sempre avere almeno un pool di nodi in cui GKE Sandbox è disabilitato. Questo pool di nodi deve contenere almeno un nodo, anche se tutti i workload sono in sandbox.
  • Le versioni di GKE precedenti alla 1.24.2-gke.300 non supportano i tipi di macchine e2-micro, e2-small ed e2-medium. GKE versione 1.24.2-gke.300 e successive supportano questi tipi di macchine.
  • I nodi devono utilizzare l'immagine del nodo Container-Optimized OS con containerd (cos_containerd).

Accesso ai metadati del cluster

Si applica ai cluster Autopilot e Standard

  • Ai nodi che eseguono pod in sandbox viene impedito di accedere ai metadati del cluster a livello di sistema operativo sul nodo.
  • In GKE Standard, puoi eseguire pod regolari su un nodo con GKE Sandbox abilitato. Tuttavia, per impostazione predefinita, questi pod regolari non possono accedere ai Google Cloud servizi o ai metadati del cluster.
  • Utilizza Workload Identity Federation for GKE per grantare ai pod l'accesso ai servizi Google Cloud .

SMT potrebbe essere disattivato

Si applica ai cluster Autopilot e Standard

Le impostazioni del multi-threading simultaneo (SMT) vengono utilizzate per mitigare le vulnerabilità dei canali laterali che sfruttano i thread che condividono lo stato del core, ad esempio le vulnerabilità Microarchitectural Data Sampling (MDS).

In GKE 1.25.5-gke.2500 o versioni successive e 1.26.0-gke.2500 o successive, gVisor è configurato per utilizzare la pianificazione del core di Linux per mitigare gli attacchi lato canale. Le impostazioni SMT non sono state modificate rispetto ai valori predefiniti. La pianificazione Nucleo viene utilizzata solo per i carichi di lavoro in esecuzione con gVisor.

A partire dalla versione GKE 1.24.2-gke.300, SMT viene configurato in base al tipo di macchina in base alla vulnerabilità della macchina agli attacchi MDS, come segue:

  • Pod Autopilot in esecuzione sulla Scale-Out classe di calcolo: SMT disabilitato.

  • Tipi di macchine con processori Intel: SMT disabilitato per impostazione predefinita.

  • Tipi di macchine senza processori Intel: SMT abilitato per impostazione predefinita.

  • Tipi di macchine con un solo thread per core: nessun supporto SMT. Tutte le vCPU richieste visibili.

Prima della versione 1.24.2-gke.300, SMT è disabilitato su tutti i tipi di macchine.

Attiva SMT

Si applica ai cluster standard

Nei cluster GKE Standard, puoi attivare SMT se è disabilitato sul tipo di macchina selezionato. Ti viene addebitato un costo per ogni vCPU, indipendentemente dal fatto che SMT sia attivo o meno. Per informazioni sui prezzi, consulta la pagina relativa ai prezzi di Compute Engine.

GKE 1.24.2-gke.300 e versioni successive

Imposta il flag --threads-per-core quando crei un pool di nodi GKE Sandbox:

gcloud container node-pools create smt-enabled \
  --cluster=CLUSTER_NAME \
  --machine-type=MACHINE_TYPE \
  --threads-per-core=2 \
  --sandbox type=gvisor
  • CLUSTER_NAME: il nome del cluster esistente.
  • MACHINE_TYPE: il tipo di macchina.

Per ulteriori informazioni su --threads-per-core, consulta Impostare il numero di thread per core.

Versioni GKE precedenti alla 1.24.2-gke.300

  1. Crea un nuovo pool di nodi nel tuo cluster con l'etichetta nodocloud.google.com/gke-smt-disabled=false:

    gcloud container node-pools create smt-enabled \
        --cluster=CLUSTER_NAME \
        --machine-type=MACHINE_TYPE \
        --node-labels=cloud.google.com/gke-smt-disabled=false \
        --image-type=cos_containerd \
        --sandbox type=gvisor
    
  2. Esegui il deployment del DaemonSet nel pool di nodi. Il DaemonSet verrà 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.yaml
    
  3. Verifica che i pod del DaemonSet siano in stato di esecuzione.

    kubectl get pods --selector=name=enable-smt -n kube-system
    

    L'output è simile al seguente:

    NAME               READY     STATUS    RESTARTS   AGE
    enable-smt-2xnnc   1/1       Running   0          6m
    
  4. Controlla che SMT has been enabled venga visualizzato nei log dei pod.

    kubectl logs enable-smt-2xnnc enable-smt -n kube-system
    

Funzionalità

Si applica ai cluster standard

Per impostazione predefinita, al contenitore viene impedito di aprire socket non elaborati per ridurre il potenziale di attacchi dannosi. Alcuni strumenti relativi alla rete, come ping e tcpdump, creano socket non elaborati come parte della loro funzionalità di base. Per attivare le socket non elaborate, devi aggiungere esplicitamente la funzionalità NET_RAW al contesto di sicurezza del contenitore:

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 contenitori a causa delle implicazioni di sicurezza di questa funzionalità.

Dipendenze esterne

Si applica ai cluster Autopilot e Standard

Al codice non attendibile in esecuzione all'interno della sandbox potrebbe essere consentito raggiungere servizi esterni come server di database, API, altri contenitori e driver CSI. Questi servizi vengono eseguiti al di fuori del confine 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 dell'accessibilità di questi servizi da parte del 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 i driver ext4 e 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ò colpire il kernel dell'host e compromettere l'intero nodo. Ti consigliamo di eseguire il driver CSI all'interno di un contenitore con il minor numero di autorizzazioni richieste per ridurre l'esposizione in caso di exploit. GKE Sandbox supporta l'utilizzo del driver CSI per il disco permanente di Compute Engine.

Funzionalità non compatibili

Non puoi utilizzare GKE Sandbox con le seguenti funzionalità Kubernetes:

Caratteristiche del carico di lavoro

Si applica ai cluster Autopilot e Standard

L'imposizione di un ulteriore livello di indirizzamento per accedere al kernel del nodo comporta dei compromessi in termini di prestazioni. GKE Sandbox offre il vantaggio più tangibile per i cluster multi-tenant di grandi dimensioni in cui l'isolamento è importante. Tieni presente le seguenti linee guida quando testi i tuoi carichi di lavoro con GKE Sandbox.

Chiamate di sistema

Si applica ai cluster Autopilot e Standard

I carichi di lavoro che generano un volume elevato di chiamate di sistema a basso overhead, ad esempio un gran numero di piccole operazioni di I/O, possono richiedere più risorse di sistema quando vengono eseguiti in una sandbox, pertanto potrebbe essere necessario utilizzare nodi più potenti o aggiungerne altri al cluster.

Accesso diretto all'hardware o alla virtualizzazione

Si applica ai cluster Autopilot e Standard

Se il tuo carico di lavoro richiede uno dei seguenti elementi, GKE Sandbox potrebbe non essere adatto perché impedisce l'accesso diretto al kernel dell'host sul nodo:

  • Accesso diretto all'hardware del nodo
  • Funzionalità di virtualizzazione a livello di kernel
  • Container con privilegi

Passaggi successivi