Google Kubernetes Engine (GKE) utilizza metadati delle istanze per configurare le macchine virtuali (VM) dei nodi, ma alcuni di questi metadati sono potenzialmente sensibili e devono essere protetti dai carichi di lavoro in esecuzione nel cluster.
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à,
install e poi
inizializzare
con gcloud CLI. Se hai già installato gcloud CLI, ottieni la versione più recente eseguendo
gcloud components update
.
Configura account di servizio nodo
Le credenziali dell'account di servizio di ogni nodo continuano a essere esposte ai carichi di lavoro. Per impostazione predefinita, i nodi utilizzano l'account di servizio predefinito di Compute Engine. Devi configurare un account di servizio con privilegi minimi per i nodi da utilizzare al posto dell'account di servizio predefinito di Compute Engine. Quindi, allega questo account di servizio ai nodi, in modo che un utente malintenzionato non possa aggirare delle protezioni dei metadati GKE mediante l'uso dell'API Compute Engine e accedere direttamente alle istanze VM sottostanti.
Per ulteriori informazioni, consulta Utilizzare gli account di servizio dei nodi con privilegi minimi.
Per creare un account di servizio del nodo con privilegi minimi, svolgi i seguenti passaggi:
Crea un nuovo account di servizio Identity and Access Management (IAM) e salva l'indirizzo email in una variabile di ambiente:
gcloud iam service-accounts create NODE_SA_NAME \ --display-name="DISPLAY_NAME" export NODE_SA_EMAIL=$(gcloud iam service-accounts list --format='value(email)' \ --filter='displayName:DISPLAY_NAME')
Sostituisci quanto segue:
NODE_SA_NAME
: il nome del nuovo servizio nodo .DISPLAY_NAME
: il nome visualizzato del nuovo servizio .
L'indirizzo email dell'account di servizio del nodo ha il formato
NODE_SA_NAME@PROJECT_ID.iam.gserviceaccount.com
.Configura il tuo account di servizio con i ruoli e le autorizzazioni minimi per eseguire i tuoi nodi GKE:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$NODE_SA_EMAIL \ --role=roles/monitoring.metricWriter gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$NODE_SA_EMAIL \ --role=roles/monitoring.viewer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$NODE_SA_EMAIL \ --role=roles/logging.logWriter
Sostituisci
PROJECT_ID
con l'ID del tuo progetto Google Cloud.Inoltre, se il cluster estrae immagini private da Artifact Registry, aggiungi il ruolo
roles/artifactregistry.reader
:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$NODE_SA_EMAIL \ --role=roles/artifactregistry.reader
Occultamento dei metadati
L'occultamento dei metadati GKE protegge metadati di sistema sensibili dai carichi di lavoro utente in esecuzione nel cluster.
Puoi abilitare i metadati
per impedire ai pod degli utenti di accedere a determinati metadati della VM
ai nodi del cluster, ad esempio credenziali kubelet e informazioni sulle istanze VM.
In particolare, l'occultamento dei metadati protegge l'accesso a kube-env
(che contiene
le credenziali kubelet) e il token di identità dell'istanza della VM.
La funzionalità di occultamento dei metadati blocca il traffico dai pod utente (non in esecuzione su
HostNetwork
) al server dei metadati del cluster, consentendo solo query sicure. Il firewall impedisce ai pod utente di utilizzare le credenziali di kubelet per attacchi di escalation dei privilegi o di utilizzare l'identità VM per attacchi di escalation delle istanze.
Puoi abilitare l'occultamento dei metadati solo quando crei un nuovo cluster o quando l'aggiunta di un nuovo pool di nodi a un cluster esistente.
Limitazioni
- Il mascheramento dei metadati protegge solo l'accesso a
kube-env
e al token di identità dell'istanza del nodo. - L'oscuramento dei metadati non limita l'accesso all'account di servizio del nodo.
- L'oscuramento dei metadati non limita l'accesso ad altri metadati dell'istanza correlati.
- L'oscuramento dei metadati non limita l'accesso ad altre API legacy dei metadati.
- L'occultamento dei metadati non limita il traffico proveniente dai pod in esecuzione
rete host (
hostNetwork: true
nella specifica del pod).
Creazione di un nuovo cluster o pool di nodi con occultamento dei metadati
Dopo aver creato un account di servizio, puoi creare un nuovo cluster o un nuovo pool di nodi con l'occultamento dei metadati abilitato utilizzando Google Cloud CLI.
Crea un nuovo cluster
Per creare un cluster in cui è abilitato l'occultamento dei metadati, esegui questo comando: :
gcloud beta container clusters create CLUSTER_NAME \
--workload-metadata-from-node=SECURE \
--service-account=$NODE_SA_EMAIL
Sostituisci CLUSTER_NAME
con il nome del nuovo cluster.
Il flag --workload-metadata-from-node
accetta i seguenti valori:
SECURE
: attiva l'occultamento dei metadati.EXPOSED
oUNSPECIFIED
: disattiva l'occultamento dei metadati.
Crea un nuovo pool di nodi
Per creare un pool di nodi con l'occultamento dei metadati abilitato, esegui questo comando: :
gcloud beta container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--workload-metadata-from-node=SECURE \
--service-account=$NODE_SA_EMAIL
Sostituisci NODE_POOL_NAME
con il nome del nuovo nodo
piscina.
Verifica dei metadati del token di identità nascosti dal carico di lavoro del cluster
Quando nascondi i metadati, non dovrebbe essere possibile richiedere una firma tramite il token di identità istanza del nodo. Per verificare che le richieste informino esplicitamente gli utenti dei metadati nascosti:
Apri una sessione di shell in un nuovo pod:
kubectl run metadata-concealment -it --image=google/cloud-sdk:slim -- /bin/bash
Nel pod, prova a ottenere un endpoint nascosto:
curl -H "Metadata-Flavor: Google" \ 'http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=https://www.example.com'
L'output è simile al seguente:
This metadata endpoint is concealed.
Disabilitazione e transizione dalle API di metadati legacy
Gli endpoint del server di metadati di Compute Engine v0.1
e v1beta1
sono stati ritirati
e disattivati il 30 settembre 2020.
Per la pianificazione dell'interruzione, consulta la sezione Deprecation degli endpoint del server di metadati v0.1
e v1beta1
.