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 abilitare SELinux per il tuo cluster, devi abilitare SELinux in tutte le tue macchine host. Per maggiori dettagli, consulta Protezione dei container mediante SELinux.
Utilizzare 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 container con un profilo seccomp
migliora la
sicurezza del cluster perché limita le chiamate di sistema che i container
possono effettuare al kernel. In questo modo si riduce la possibilità di sfruttamento delle vulnerabilità del kernel.
Il profilo seccomp
predefinito contiene un elenco di chiamate di sistema che un container
è autorizzato a effettuare. Le chiamate di sistema non presenti nell'elenco non sono consentite. seccomp
è abilitato per impostazione predefinita nei cluster versione 1.11 e successive. Ciò significa che tutti
i container di sistema e i carichi di lavoro dei clienti vengono eseguiti con il profilo seccomp
predefinito
del runtime del container. Anche i container e i carichi di lavoro che non specificano un profilo seccomp
nei file di configurazione sono soggetti a limitazioni seccomp
.
Come disattivare seccomp
a livello di cluster o su workload specifici
Puoi disattivare seccomp
solo durante la creazione o l'upgrade del cluster.
bmctl update
non può essere utilizzato 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 workload debbano eseguire chiamate di sistema che seccomp
blocca per impostazione predefinita, non devi disattivare seccomp
sull'intero cluster. Puoi invece selezionare carichi di lavoro specifici da eseguire in unconfined mode
. L'esecuzione di un workload in unconfined mode
libera il workload
dalle limitazioni che il profilo seccomp
impone al resto del
cluster.
Per eseguire un container 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ò pone un potenziale
problema di sicurezza, perché se un processo esce dal container, viene eseguito come root
sulla macchina host. Pertanto, è consigliabile eseguire tutti i carichi di lavoro come utente non root.
Le sezioni seguenti descrivono due modi per eseguire i container come utente non root.
Metodo n. 1: aggiungi l'istruzione USER
in Dockerfile
Questo metodo utilizza un Dockerfile
per garantire che i container non vengano eseguiti come utente root
. In un Dockerfile
, puoi specificare l'utente con cui deve essere eseguito il processo all'interno di un container. Il seguente snippet di un Dockerfile
mostra come procedere:
....
#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 container. Questo utente ha un ID utente (UID) di 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 container possano essere eseguiti
correttamente per nonroot
.
Metodo 2: aggiungi i campi securityContext nel file manifest Kubernetes
Questo metodo utilizza un file manifest Kubernetes per garantire che i container non vengano eseguiti
come utente root
. Le impostazioni di sicurezza vengono specificate per un pod e a loro volta vengono 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 nel pod, tutti i processi vengono eseguiti con l'ID utente 8877
. Il campo runAsGroup
specifica che questi
processi hanno un ID gruppo (GID) principale di 8877
. Ricordati di concedere le autorizzazioni
necessarie e sufficienti all'UID 8877
in modo che i processi del container
possano essere eseguiti correttamente.
In questo modo, i processi all'interno di un container vengono eseguiti come UID 8877
, che ha meno privilegi rispetto a root.
I contenitori di sistema nel software Google Distributed Cloud solo software aiutano a installare e
gestire i cluster. Gli UID e i GID utilizzati da questi container possono essere controllati dal campo
startUIDRangeRootlessContainers
nella specifica del cluster. startUIDRangeRootlessContainers
è un
campo facoltativo che, se non specificato, ha un valore di 2000
. I valori consentiti
per startUIDRangeRootlessContainers
sono 1000
-57000
. Il valore
startUIDRangeRootlessContainers
può essere modificato solo durante gli upgrade. I
container di sistema utilizzano UID e GID nell'intervallo
startUIDRangeRootlessContainers
a startUIDRangeRootlessContainers
+ 2999.
L'esempio seguente mostra un estratto di un file manifest per una risorsa 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 container di sistema non si sovrappongano a quelli assegnati ai workload
dell'utente.
Come disattivare la modalità rootless
A partire dalla release 1.10 di Google Distributed Cloud, i container del control plane Kubernetes e i container 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
GID sono già stati assegnati a processi in esecuzione all'interno del tuo ambiente.
A partire dalla release 1.11, puoi disattivare la modalità rootless quando esegui l'upgrade del cluster. Quando la modalità rootless è disattivata, i contenitori del piano di controllo Kubernetes e i contenitori di sistema vengono eseguiti come utente root.
Per disattivare la modalità rootless, segui questi passaggi:
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 ...
Esegui l'upgrade del cluster. Per maggiori dettagli, vedi Eseguire l'upgrade dei cluster.
Limitare la possibilità per i workload di modificarsi autonomamente
Alcuni carichi di lavoro Kubernetes, in particolare quelli di sistema, hanno l'autorizzazione per modificarsi autonomamente. Ad esempio, alcuni carichi di lavoro vengono scalati automaticamente in verticale. Sebbene comodo, questo può consentire a un malintenzionato che ha già compromesso un nodo di ottenere privilegi più elevati nel cluster. Ad esempio, un malintenzionato potrebbe fare in modo che un workload sul nodo venga eseguito come un account di servizio con più privilegi che esiste nello stesso spazio dei nomi.
Idealmente, ai workload non dovrebbe essere concessa l'autorizzazione a modificarsi. Quando è necessaria l'automodifica, puoi limitare le autorizzazioni applicando i vincoli di Gatekeeper o Policy Controller, ad esempio NoUpdateServiceAccount dalla libreria open source Gatekeeper, che fornisce diverse norme di sicurezza utili.
Quando implementi i criteri, in genere è necessario consentire ai controller che
gestiscono il ciclo di vita del cluster di ignorare i criteri. Questo è necessario affinché
i controller possano apportare modifiche al cluster, ad esempio applicare gli
upgrade del cluster. Ad esempio, se implementi il criterio NoUpdateServiceAccount
sui tuoi
cluster, devi impostare i seguenti parametri in Constraint
:
parameters:
allowedGroups:
- system:masters
allowedUsers: []
Disabilita la porta di sola lettura di Kubelet
A partire dalla versione 1.15.0, Google Distributed Cloud disabilita per impostazione predefinita la porta
10255
, 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 l'upgrade del cluster alla
versione 1.15.0 o successive.
Questa modifica è stata apportata perché kubelet perde informazioni a bassa sensibilità sulla porta 10255
, che non è autenticata. Le informazioni includono i dati di configurazione completi di tutti i pod in esecuzione su un nodo, che possono essere preziosi per un malintenzionato. Espone inoltre 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 misure di sicurezza importanti da adottare una volta che i cluster sono operativi.
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 comune di numerazione delle vulnerabilità e sono collegati alla pagina principale dei bollettini e alle note di rilascio. Google Cloud Google Cloud
Quando è necessaria un'azione del cliente per risolvere queste vulnerabilità critiche e gravi, Google contatta i clienti via email. Inoltre, Google potrebbe contattare i clienti con contratti di assistenza anche tramite i canali di assistenza.
Per saperne di più su come Google gestisce le vulnerabilità di sicurezza e le patch per GKE e GKE Enterprise, consulta Applicazione di patch di sicurezza.
Esegui l'upgrade dei cluster
Kubernetes introduce regolarmente nuove funzionalità di sicurezza e fornisce patch di sicurezza. Le release di Google Distributed Cloud incorporano miglioramenti della sicurezza di Kubernetes che risolvono le vulnerabilità di sicurezza che potrebbero interessare i tuoi cluster.
Sei responsabile dell'aggiornamento dei cluster. Per ogni release, esamina le note di rilascio. Per ridurre al minimo i rischi per la sicurezza dei tuoi cluster, pianifica di eseguire l'aggiornamento alle nuove release delle patch ogni mese e alle versioni secondarie ogni quattro mesi.
Uno dei tanti 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 alta disponibilità che ti consentono di trasferire dati in modo affidabile tra le tue macchine bare metal on-premise e leGoogle Cloud reti Virtual Private Cloud (VPC). 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 tua rete Virtual Private Cloud (VPC) tramite una connessione 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 ulteriore sicurezza ai tuoi cluster. I Controlli di servizio VPC contribuiscono a mitigare il rischio di esfiltrazione di dati. Utilizzando i Controlli di servizio VPC, puoi aggiungere progetti ai perimetri di servizio che proteggono risorse e 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 il VIP limitato 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) (
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
)