Rafforza la sicurezza del cluster

Questo documento descrive come rafforzare la sicurezza dei cluster creati con Google Distributed Cloud (solo software) su bare metal.

Protezione dei container mediante SELinux

Puoi proteggere i tuoi container attivando SELinux, che è supportato per Red Hat Enterprise Linux (RHEL). Se le tue macchine host eseguono RHEL e vuoi attivare SELinux per il tuo cluster, devi attivare SELinux in tutte le tue macchine host. Per maggiori dettagli, consulta la sezione Protezione dei container mediante SELinux.

Usa seccomp per limitare i container

La modalità di calcolo sicuro (seccomp) è disponibile nella versione 1.11 e successive di Google Distributed Cloud. L'esecuzione di contenitori con un profilo seccomp migliora la sicurezza del cluster perché limita le chiamate di sistema che i contenitori possono effettuare al kernel. In questo modo si riduce la possibilità che le vulnerabilità del kernel vengano sfruttate.

Il profilo seccomp predefinito contiene un elenco di chiamate di sistema che un contenitore è autorizzato a eseguire. Eventuali chiamate di sistema non presenti nell'elenco non sono consentite. seccomp è abilitato per impostazione predefinita nei cluster della versione 1.11 e successive. Ciò significa che tutti i contenitori di sistema e i carichi di lavoro dei clienti vengono eseguiti con il profilo seccomp predefinito del runtime del contenitore. Anche i container e i workload che non specificano un profilo seccomp nei file di configurazione sono soggetti alle limitazioni di seccomp.

Come disattivare seccomp a livello di cluster o su determinati workload

Puoi disattivare seccomp solo durante la creazione o l'upgrade del cluster. Non è possibile utilizzare bmctl update per disattivare questa funzionalità. Se vuoi disattivare seccomp all'interno di un cluster, aggiungi la seguente sezione clusterSecurity al file di configurazione del cluster:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: example
  namespace: cluster-example
spec:
...
  clusterSecurity:
    enableSeccomp: false
...

Nell'improbabile caso in cui alcuni dei tuoi carichi di lavoro debbano eseguire chiamate di sistema bloccate da seccomp per impostazione predefinita, non devi disattivare seccomp su tutto il cluster. In alternativa, puoi individuare carichi di lavoro specifici da eseguire in unconfined mode. L'esecuzione di un carico di lavoro in unconfined mode lo libera dalle limitazioni imposte dal profilo seccomp al resto del cluster.

Per eseguire un contenitore in unconfined mode, aggiungi la seguente sezione securityContext al manifest del pod:

apiVersion: v1
kind: Pod
....
spec:
  securityContext:
    seccompProfile:
      type: Unconfined
....

Non eseguire i container come utente root

Per impostazione predefinita, i processi nei container vengono eseguiti come root. Ciò rappresenta un potenziale problema di sicurezza, perché se un processo esce dal contenitore, viene eseguito come root sulla macchina host. Pertanto, ti consigliamo di eseguire tutti i carichi di lavoro come utente non root.

Le sezioni seguenti descrivono due modi per eseguire i contenitori come utente non root.

Metodo 1: aggiungi l'istruzione USER in Dockerfile

Questo metodo utilizza un Dockerfile per assicurarsi che i container non vengano eseguiti come utente root. In un Dockerfile, puoi specificare con quale utente deve essere eseguito il processo all'interno di un contenitore. Il seguente snippet di un Dockerfile mostra come eseguire questa operazione:

....

#Add a user with userid 8877 and name nonroot
RUN useradd −u 8877 nonroot

#Run Container as nonroot
USER nonroot
....

In questo esempio, il comando Linux useradd -u crea un utente denominato nonroot all'interno del contenitore. Questo utente ha un ID utente (UID) pari a 8877.

La riga successiva in Dockerfile esegue il comando USER nonroot. Questo comando specifica che da questo punto in poi nell'immagine i comandi vengono eseguiti come utente nonroot.

Concedi le autorizzazioni all'UID 8877 in modo che i processi del contenitore possano essere eseguiti correttamente per nonroot.

Metodo 2: aggiungi i campi securityContext nel file manifest di Kubernetes

Questo metodo utilizza un file manifest Kubernetes per assicurarsi che i container non vengano eseguiti come utente root. Le impostazioni di sicurezza vengono specificate per un pod e a loro volta applicate a tutti i container all'interno del pod.

L'esempio seguente mostra un estratto di un file manifest per un determinato pod:

apiVersion: v1
kind: Pod
metadata:
  name: name-of-pod
spec:
  securityContext:
    runAsUser: 8877
    runAsGroup: 8877
....

Il campo runAsUser specifica che per tutti i container del pod, tutti i processi vengono eseguiti con l'ID utente 8877. Il campo runAsGroup specifica che queste procedure hanno un ID gruppo principale (GID) pari a 8877. Ricordati di concedere le autorizzazioni necessarie e sufficienti all'UID 8877 in modo che i processi del contenitore possano essere eseguiti correttamente.

In questo modo, i processi all'interno di un container vengono eseguiti come UID 8877, che ha meno privilegi di root.

I contenitori di sistema in Google Distributed Cloud solo software consentono di installare e gestire i cluster. Gli UID e i GID utilizzati da questi contenitori possono essere controllati tramite il campo startUIDRangeRootlessContainers nella specifica del cluster. startUIDRangeRootlessContainers è un campo facoltativo che, se non specificato, ha un valore 2000. I valori consentiti per startUIDRangeRootlessContainers sono 1000-57000. Il valore startUIDRangeRootlessContainers può essere modificato solo durante gli upgrade. I contenuti dei container di sistema utilizzano gli UID e i GID nell'intervallo startUIDRangeRootlessContainers a startUIDRangeRootlessContainers + 2999.

L'esempio seguente mostra un estratto di un file manifest per una risorsa del cluster:

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: name-of-cluster
spec:
 clusterSecurity:
    startUIDRangeRootlessContainers: 5000
...

Scegli il valore per startUIDRangeRootlessContainers in modo che gli spazi UID e GID utilizzati dai contenitori di sistema non si sovrappongano a quelli assegnati ai workload degli utenti.

Come disattivare la modalità senza root

A partire dalla release 1.10 di Google Distributed Cloud, i contenitori del piano di controllo Kubernetes e i contenitori di sistema vengono eseguiti come utenti non root per impostazione predefinita. Google Distributed Cloud assegna a questi utenti UID e GID nell'intervallo 2000-4999. Tuttavia, questa assegnazione può causare problemi se questi UID e 2000-4999 sono già stati allocati ai processi in esecuzione all'interno del tuo ambiente.

A partire dalla release 1.11, puoi disattivare la modalità senza root durante l'upgrade del cluster. Quando la modalità senza root è disattivata, i contenitori del piano di controllo di Kubernetes e i contenitori di sistema vengono eseguiti come utente root.

Per disattivare la modalità senza root, segui questi passaggi:

  1. Aggiungi la seguente sezione clusterSecurity al file di configurazione del cluster:

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: example
      namespace: cluster-example
    spec:
    ...
      clusterSecurity:
        enableRootlessContainers: false
    ...
    
  2. Esegui l'upgrade del cluster. Per maggiori dettagli, vedi Eseguire l'upgrade dei cluster.

Limitare la capacità dei carichi di lavoro di automodificarsi

Alcuni carichi di lavoro Kubernetes, in particolare quelli di sistema, hanno l'autorizzazione per automodificarsi. Ad esempio, alcuni carichi di lavoro eseguono la scalabilità automatica verticale. Sebbene sia comodo, questo può consentire a un malintenzionato che ha già compromesso un nodo di eseguire un'ulteriore riassegnazione nel cluster. Ad esempio, un malintenzionato potrebbe modificare un carico di lavoro sul nodo in modo che venga eseguito come account di servizio con privilegi maggiori esistente nello stesso spazio dei nomi.

Idealmente, ai carichi di lavoro non dovrebbe essere concessa l'autorizzazione per modificarsi. Quando è necessaria l'automodifica, puoi limitare le autorizzazioni applicando vincoli di Gatekeeper o Policy Controller, ad esempio NoUpdateServiceAccount dalla libreria open source Gatekeeper, che fornisce diversi criteri di sicurezza utili.

Quando esegui il deployment dei criteri, in genere è necessario consentire ai controller che gestiscono il ciclo di vita del cluster di aggirarli. Questo è necessario affinché i controller possano apportare modifiche al cluster, ad esempio applicare upgrade. Ad esempio, se esegui il deployment del criterio NoUpdateServiceAccount nei tuoi cluster, devi impostare i seguenti parametri in Constraint:

parameters:
  allowedGroups:
  - system:masters
  allowedUsers: []

Disattiva la porta di sola lettura di Kubelet

A partire dalla release 1.15.0, Google Distributed Cloud disattiva per impostazione predefinita la porta10255, la porta di sola lettura di kubelet. Tutti i carichi di lavoro dei clienti configurati per leggere i dati da questa porta kubelet non sicura 10255 devono eseguire la migrazione per utilizzare la porta kubelet sicura 10250.

Solo i cluster creati con la versione 1.15.0 o successive hanno questa porta disattivata per impostazione predefinita. La porta di sola lettura di kubelet 10255 rimane accessibile per i cluster creati con una versione precedente alla 1.15.0, anche dopo un upgrade del cluster alla versione 1.15.0 o successiva.

Questa modifica è stata apportata perché kubelet divulga informazioni a bassa sensibilità tramite la porta 10255, che non è autenticata. Le informazioni includono le informazioni di configurazione complete per tutti i pod in esecuzione su un nodo, che possono essere utili per un malintenzionato. Mette inoltre in evidenza metriche e informazioni sullo stato, che possono fornire approfondimenti sensibili per l'attività.

La disattivazione della porta di sola lettura di Kubelet è consigliata dal benchmark CIS Kubernetes.

Manutenzione

Il monitoraggio dei bollettini sulla sicurezza e l'upgrade dei cluster sono importanti misure di sicurezza da adottare dopo l'avvio dei cluster.

Monitorare i bollettini sulla sicurezza

Il team di sicurezza di GKE pubblica bollettini sulla sicurezza per le vulnerabilità di gravità elevata e critica.

Questi bollettini seguono uno schema di numerazione delle vulnerabilità di Google Cloud comune e sono collegati dalla pagina principale dei bollettini di Google Cloud e dalle note di rilascio.

Utilizza questo feed XML per iscriverti ai bollettini sulla sicurezza per Google Kubernetes Engine (GKE) e prodotti correlati. Iscriviti

Quando è necessaria un'azione da parte del cliente per risolvere queste vulnerabilità gravi e critiche, Google contatta i clienti via email. Inoltre, Google potrebbe anche contattare i clienti con contratti di assistenza tramite i canali di assistenza.

Per saperne di più su come Google gestisce le vulnerabilità e i patch di sicurezza per GKE e GKE Enterprise, consulta Patch di sicurezza.

Eseguire l'upgrade dei cluster

Kubernetes introduce regolarmente nuove funzionalità di sicurezza e fornisce patch di sicurezza. Le release di Google Distributed Cloud includono miglioramenti alla sicurezza di Kubernetes che risolvono le vulnerabilità di sicurezza che potrebbero interessare i tuoi cluster.

Sei responsabile del mantenimento aggiornato dei tuoi cluster. Per ogni release, esamina le note di rilascio. Per ridurre al minimo i rischi di sicurezza per i tuoi cluster, pianifica di eseguire l'aggiornamento alle nuove release delle patch ogni mese e alle versioni minori ogni quattro mesi.

Uno dei molti vantaggi dell'upgrade di un cluster è che aggiorna automaticamente il file kubeconfig del cluster. Il file kubeconfig autentica un utente in un cluster. Il file kubeconfig viene aggiunto alla directory del cluster quando crei un cluster con bmctl. Il nome e il percorso predefiniti sono bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig. Quando esegui l'upgrade di un cluster, il file kubeconfig del cluster viene rinnovato automaticamente. In caso contrario, il file kubeconfig scade un anno dopo la creazione.

Per informazioni su come eseguire l'upgrade dei cluster, consulta Eseguire l'upgrade dei cluster.

Utilizzare i Controlli di servizio VPC con Cloud Interconnect o Cloud VPN

Cloud Interconnect fornisce connessioni a bassa latenza e ad alta disponibilità che ti consentono di trasferire dati in modo affidabile tra le tue macchine bare metal on-premise e le reti VPC (Virtual Private Cloud) di Google Cloud. Per scoprire di più su Cloud Interconnect, consulta la panoramica del provisioning di Dedicated Interconnect.

Cloud VPN connette in sicurezza la tua rete peer alla rete Virtual Private Cloud (VPC) tramite una connessione VPN IPsec. Per scoprire di più su Cloud VPN, consulta la panoramica di Cloud VPN.

I Controlli di servizio VPC funzionano con Cloud Interconnect o Cloud VPN per fornire sicurezza aggiuntiva ai tuoi cluster. I Controlli di servizio VPC contribuiscono a mitigare il rischio di esfiltrazione di dati. Con Controlli di servizio VPC, puoi aggiungere progetti ai perimetri di servizio che proteggono le risorse e i servizi dalle richieste provenienti dall'esterno del perimetro. Per scoprire di più sui perimetri di servizio, consulta Dettagli e configurazione dei perimetri di servizio.

Per proteggere completamente i cluster creati con Google Distributed Cloud, devi utilizzare VIP con restrizioni e aggiungere le seguenti API al perimetro di servizio:

  • API Artifact Registry (artifactregistry.googleapis.com)
  • API Resource Manager (cloudresourcemanager.googleapis.com)
  • API Compute Engine (compute.googleapis.com)
  • API Connect Gateway (connectgateway.googleapis.com)
  • API Google Container Registry (containerregistry.googleapis.com)
  • API GKE Connect (gkeconnect.googleapis.com)
  • API GKE Hub (gkehub.googleapis.com)
  • API GKE On-Prem (gkeonprem.googleapis.com)
  • API Identity and Access Management (iam.googleapis.com)
  • API Cloud Logging (logging.googleapis.com)
  • API Cloud Monitoring (monitoring.googleapis.com)
  • Monitoraggio della configurazione per l'API Ops (opsconfigmonitoring.googleapis.com)
  • API Service Control (servicecontrol.googleapis.com)
  • API Cloud Storage (storage.googleapis.com)

Quando utilizzi bmctl per creare o eseguire l'upgrade di un cluster, utilizza il flag --skip-api-check per bypassare l'API Service Usage (serviceusage.googleapis.com). L'API Service Usage non è supportata dai Controlli di servizio VPC.