Protezione dei metadati del cluster


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:

  1. 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.

  2. 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 o UNSPECIFIED: 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:

  1. Apri una sessione di shell in un nuovo pod:

    kubectl run metadata-concealment -it --image=google/cloud-sdk:slim -- /bin/bash
    
  2. 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.

Passaggi successivi