Esegui l'autenticazione alle API Google Cloud dai carichi di lavoro GKE


Questa pagina mostra come accedere in modo più sicuro alle API Google Cloud dai tuoi workload eseguiti nei cluster Google Kubernetes Engine (GKE) utilizzando Workload Identity Federation for GKE.

Questa pagina è dedicata agli amministratori di identità e account, agli operatori e agli sviluppatori che creano e gestiscono i criteri relativi alle autorizzazioni utente. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti di Google Cloud , consulta la pagina Ruoli utente e attività comuni di GKE Enterprise.

Prima di leggere questa pagina, assicurati di conoscere i concetti di Workload Identity Federation for GKE.

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à, installala e poi inizializzala. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo gcloud components update.

Abilita la federazione delle identità per i carichi di lavoro per GKE su cluster e pool di nodi

In Autopilot, la federazione delle identità per i carichi di lavoro per GKE è sempre abilitata. Vai alla sezione Configurare le applicazioni per utilizzare la federazione delle identità per i carichi di lavoro per GKE.

In Standard, puoi abilitare la federazione delle identità per i workload per GKE su cluster e pool di nodi utilizzando Google Cloud CLI o la console Google Cloud . Workload Identity Federation for GKE deve essere abilitata a livello di cluster prima di poter abilitare Workload Identity Federation for GKE sui pool di nodi.

Puoi abilitare la federazione delle identità per i carichi di lavoro per GKE in un cluster Standard esistente utilizzando gcloud CLI o la console Google Cloud . I pool di nodi esistenti non sono interessati, mentre i nuovi pool di nodi nel cluster utilizzano Workload Identity Federation for GKE.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Per abilitare la federazione delle identità per i carichi di lavoro per GKE in un cluster esistente, esegui il seguente comando:

    gcloud container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --workload-pool=PROJECT_ID.svc.id.goog
    

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del cluster esistente.
    • LOCATION: la posizione di Compute Engine del cluster.
    • PROJECT_ID: il tuo ID progetto Google Cloud .

Console

Per abilitare la federazione delle identità per i carichi di lavoro per GKE in un cluster esistente:

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud .

    Vai a Google Kubernetes Engine

  2. Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.

  3. Nella pagina dei dettagli del cluster, nella sezione Sicurezza, fai clic su Modifica Workload Identity.

  4. Nella finestra di dialogo Modifica Workload Identity, seleziona la casella di controllo Abilita Workload Identity.

  5. Fai clic su Salva modifiche.

Eseguire la migrazione dei carichi di lavoro esistenti a Workload Identity Federation for GKE

Dopo aver abilitato la federazione delle identità per i carichi di lavoro per GKE in un cluster esistente, potresti voler eseguire la migrazione dei carichi di lavoro in esecuzione per utilizzare la federazione delle identità per i carichi di lavoro per GKE. Seleziona la strategia di migrazione ideale per il tuo ambiente. Puoi creare nuovi pool di nodi con la federazione delle identità per i carichi di lavoro per GKE abilitata oppure aggiornare i pool di nodi esistenti per abilitare la federazione delle identità per i carichi di lavoro per GKE.

Puoi abilitare la federazione delle identità per i carichi di lavoro per GKE su un pool di nodi solo se la federazione delle identità per i carichi di lavoro per GKE è abilitata sul cluster.

Best practice:

Crea nuovi pool di nodi se devi anche modificare le tue applicazioni per renderle compatibili con la federazione delle identità per i carichi di lavoro per GKE.

Per impostazione predefinita, tutti i nuovi node pool che crei utilizzano la federazione delle identità per i carichi di lavoro per GKE se nel cluster è abilitata la federazione delle identità per i carichi di lavoro per GKE. Per creare un nuovo pool di nodi con la federazione delle identità per i carichi di lavoro per GKE abilitata, esegui questo comando:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --workload-metadata=GKE_METADATA

Sostituisci quanto segue:

  • NODEPOOL_NAME: il nome del nuovo pool di nodi.
  • CLUSTER_NAME: il nome del cluster esistente in cui è abilitata la federazione delle identità per i carichi di lavoro per GKE.
  • CONTROL_PLANE_LOCATION: la posizione di Compute Engine del control plane del tuo cluster. Fornisci una regione per i cluster regionali o una zona per i cluster zonali.

Il flag --workload-metadata=GKE_METADATA configura il pool di nodi in modo che utilizzi il server metadati GKE.

Best practice:

Includi il flag in modo che la creazione pool di nodi non vada a buon fine se la federazione delle identità per i carichi di lavoro per GKE non è abilitata nel cluster.

Aggiornare un pool di nodi esistente

Puoi abilitare manualmente la federazione delle identità per i carichi di lavoro per GKE nei pool di nodi esistenti dopo aver abilitato la federazione delle identità per i carichi di lavoro per GKE nel cluster.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Per modificare un pool di nodi esistente in modo che utilizzi la federazione delle identità per i carichi di lavoro per GKE, esegui il seguente comando:

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --workload-metadata=GKE_METADATA
    

    Se un cluster ha abilitato la federazione delle identità per i carichi di lavoro per GKE, puoi disabilitarla selettivamente su un pool di nodi specifico specificando esplicitamente --workload-metadata=GCE_METADATA. Per saperne di più, consulta la sezione Protezione dei metadati del cluster.

Console

Per modificare un pool di nodi esistente in modo che utilizzi la federazione delle identità per i carichi di lavoro per GKE, segui questi passaggi:

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud .

    Vai a Google Kubernetes Engine

  2. Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.

  3. Fai clic sulla scheda Nodi.

  4. Nella sezione Pool di nodi, fai clic sul nome del pool di nodi che vuoi modificare.

  5. Nella pagina Dettagli del pool di nodi, fai clic su Modifica.

  6. Nella pagina Modifica pool di nodi, nella sezione Sicurezza, seleziona la casella di controllo Abilita server metadati GKE.

  7. Fai clic su Salva.

Configura le applicazioni per utilizzare Workload Identity Federation for GKE

Per consentire alle applicazioni GKE di autenticarsi nelle Google Cloud API utilizzando la federazione delle identità per i carichi di lavoro per GKE, crea criteri IAM per le API specifiche. L'entità in queste policy è un identificatore dell'entità IAM che corrisponde ai carichi di lavoro, agli spazi dei nomi o ai service account Kubernetes. Questo processo restituisce un token di accesso federato che il tuo workload può utilizzare nelle chiamate API.

In alternativa, puoi configurare gli account di servizio Kubernetes per impersonare gli account di servizio IAM, il che configura GKE per scambiare il token di accesso federato con un token di accesso dall&#3API Service Account Credentialsals. Per maggiori dettagli, consulta la sezione Alternativa: collegare i Service Account Kubernetes a IAM.

Configurare l'autorizzazione e i principal

  1. Recupera le credenziali per il tuo cluster:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
    

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del cluster con la federazione delle identità per i carichi di lavoro per GKE abilitata.
    • CONTROL_PLANE_LOCATION: la posizione di Compute Engine del control plane del tuo cluster. Fornisci una regione per i cluster regionali o una zona per i cluster zonali.
  2. Crea uno spazio dei nomi da utilizzare per il account di servizio Kubernetes. Puoi anche utilizzare lo spazio dei nomi default o qualsiasi spazio dei nomi esistente.

    kubectl create namespace NAMESPACE
    
  3. Crea un ServiceAccount Kubernetes da utilizzare per la tua applicazione. Puoi utilizzare anche qualsiasi ServiceAccount Kubernetes esistente in qualsiasi spazio dei nomi. Se non assegni un ServiceAccount al tuo carico di lavoro, Kubernetes assegna il ServiceAccount default nello spazio dei nomi.

    kubectl create serviceaccount KSA_NAME \
        --namespace NAMESPACE
    

    Sostituisci quanto segue:

    • KSA_NAME: il nome del nuovo ServiceAccount Kubernetes
    • NAMESPACE: il nome dello spazio dei nomi Kubernetes per ServiceAccount.
  4. Crea un criterio di autorizzazione IAM che faccia riferimento a Kubernetes ServiceAccount. Come best practice, concedi le autorizzazioni a risorseGoogle Cloud specifiche a cui la tua applicazione deve accedere. Devi disporre delle autorizzazioni IAM pertinenti per creare policy di autorizzazione nel tuo progetto.

    Ad esempio, il seguente comando concede il ruolo Visualizzatore cluster Kubernetes Engine (roles/container.clusterViewer) al ServiceAccount che hai creato:

    gcloud projects add-iam-policy-binding projects/PROJECT_ID \
        --role=roles/container.clusterViewer \
        --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME \
        --condition=None
    

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto Google Cloud .
    • PROJECT_NUMBER: il numero di progetto Google Cloud numerico.

    Puoi concedere ruoli su qualsiasi risorsa Google Cloud che supporta i criteri di autorizzazione IAM. La sintassi dell'identificatore dell'entità dipende dalla risorsa Kubernetes. Per un elenco degli identificatori supportati, vedi Identificatori principal per la federazione delle identità per i carichi di lavoro per GKE.

(Facoltativo) Configura le opzioni mesh di servizi

Se utilizzi Istio o Cloud Service Mesh per gestire il tuo ambiente, aggiungi la seguente annotazione al campo metadata.annotations nella specifica del pod:

metadata:
  annotations:
    proxy.istio.io/config: '{ "holdApplicationUntilProxyStarts": true }'

Questa annotazione impedisce l'avvio dei container finché il proxy mesh di servizi non è pronto a reindirizzare il traffico dalle tue applicazioni.

Verifica la configurazione di Workload Identity Federation for GKE

In questa sezione, creerai un bucket Cloud Storage e concederai l'accesso in visualizzazione al bucket al ServiceAccount Kubernetes che hai creato nella sezione precedente. Successivamente, esegui il deployment di un workload e verifica che il container possa elencare i cluster nel progetto.

  1. Crea un bucket Cloud Storage vuoto:

    gcloud storage buckets create gs://BUCKET
    

    Sostituisci BUCKET con un nome per il nuovo bucket.

  2. Concedi il ruolo Visualizzatore oggetti Storage (roles/storage.objectViewer) al service account che hai creato:

    gcloud storage buckets add-iam-policy-binding gs://BUCKET \
        --role=roles/storage.objectViewer \
        --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME \
        --condition=None
    

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto Google Cloud .
    • PROJECT_NUMBER: il numero di progetto Google Cloud numerico.
    • NAMESPACE: lo spazio dei nomi Kubernetes che contiene il ServiceAccount.
    • KSA_NAME: il nome di ServiceAccount.
  3. Salva il seguente manifest come test-app.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
      namespace: NAMESPACE
    spec:
      serviceAccountName: KSA_NAME
      containers:
      - name: test-pod
        image: google/cloud-sdk:slim
        command: ["sleep","infinity"]
        resources:
          requests:
            cpu: 500m
            memory: 512Mi
            ephemeral-storage: 10Mi
    
  4. Solo nei cluster Standard, aggiungi quanto segue al campo template.spec per posizionare i pod nei pool di nodi che utilizzano la federazione delle identità per i carichi di lavoro per GKE.

    Salta questo passaggio nei cluster Autopilot, che rifiutano questo nodeSelector perché ogni nodo utilizza Workload Identity Federation for GKE.

    spec:
      nodeSelector:
        iam.gke.io/gke-metadata-server-enabled: "true"
    
  5. Applica la configurazione al cluster:

    kubectl apply -f test-app.yaml
    
  6. Attendi che il pod sia pronto. Per controllare lo stato del pod, esegui questo comando:

    kubectl get pods --namespace=NAMESPACE
    

    Quando il pod è pronto, l'output è simile al seguente:

    NAME       READY   STATUS    RESTARTS   AGE
    test-pod   1/1     Running   0          5m27s
    
  7. Apri una sessione shell nel pod:

    kubectl exec -it pods/test-pod --namespace=NAMESPACE -- /bin/bash
    
  8. Recupera un elenco di oggetti nel bucket:

    curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        "https://storage.googleapis.com/storage/v1/b/BUCKET/o"
    

    L'output è il seguente:

    {
      "kind": "storage#objects"
    }
    

    Questo output mostra che il pod può accedere agli oggetti nel bucket.

Alternativa: collega i service account Kubernetes a IAM

Best practice:

Utilizza gli identificatori dei principal IAM per configurare Workload Identity Federation for GKE. Tuttavia, questa identità federata presenta limitazioni specifiche per ogni API Google Cloud supportata. Se queste limitazioni ti riguardano, segui i passaggi seguenti per configurare l'accesso a queste API dai tuoi workload GKE.

  1. Crea uno spazio dei nomi Kubernetes:

    kubectl create namespace NAMESPACE
    
  2. Crea un ServiceAccount Kubernetes:

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    
  3. Crea un account di servizio IAM. Puoi anche utilizzare qualsiasi account di servizio IAM esistente in qualsiasi progetto della tua organizzazione.

    gcloud iam service-accounts create IAM_SA_NAME \
        --project=IAM_SA_PROJECT_ID
    

    Sostituisci quanto segue:

    • IAM_SA_NAME: un nome per il nuovo account di servizio IAM.
    • IAM_SA_PROJECT_ID: l'ID progetto per il tuo account di serviziot IAM.

    Per informazioni sull'autorizzazione degli account di servizio IAM ad accedere alle Google Cloud API, consulta Informazioni sui service account.

  4. Concedi al tuo account di servizio IAM i ruoli necessari per API Google Cloud specifiche:

    gcloud projects add-iam-policy-binding IAM_SA_PROJECT_ID \
        --member "serviceAccount:IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com" \
        --role "ROLE_NAME"
    

    Sostituisci ROLE_NAME con il nome del ruolo, ad esempio roles/spanner.viewer.

  5. Crea una policy IAM di tipo Consenti che conceda al service account Kubernetes l'accesso per rappresentare l'account di servizio IAM:

    gcloud iam service-accounts add-iam-policy-binding IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
    

    Il nome del membro deve includere lo spazio dei nomi e il nome dell'account di servizio Kubernetes. Ad esempio, serviceAccount:example-project.svc.id.goog[example-namespace/example-serviceaccount].

  6. Aggiungi un'annotazione all'oggetto Kubernetes ServiceAccount in modo che GKE veda il collegamento tra gli account di servizio:

    kubectl annotate serviceaccount KSA_NAME \
        --namespace NAMESPACE \
        iam.gke.io/gcp-service-account=IAM_SA_NAME@IAM_SA_PROJECT_ID.iam.gserviceaccount.com
    

    Quando utilizzi questo metodo, sono necessari sia il criterio di autorizzazione IAM che l'annotazione.

Utilizzare la federazione delle identità per i carichi di lavoro per GKE dal codice

L'autenticazione ai servizi Google Cloud dal tuo codice è la stessa procedura dell'autenticazione tramite il server di metadati di Compute Engine. Quando utilizzi Workload Identity Federation for GKE, le tue richieste al server metadati dell'istanza vengono indirizzate al server metadati GKE. Il codice esistente che esegue l'autenticazione utilizzando il server dei metadati dell'istanza (ad esempio il codice che utilizza le librerie client) dovrebbe funzionare senza modifiche.Google Cloud

Utilizzare la quota di un progetto diverso con la federazione delle identità per i carichi di lavoro per GKE

Nei cluster che eseguono GKE versione 1.24 o successive, puoi configurare facoltativamente il account di servizio Kubernetes in modo che utilizzi la quota di un progetto Google Cloud diverso quando effettua chiamate ai metodi GenerateAccessToken e GenerateIdToken nell'API IAM Service Account Credentials. In questo modo puoi evitare di utilizzare l'intera quota nel progetto principale e utilizzare invece la quota di altri progetti per questi servizi nel cluster.

Per configurare un progetto quota con la federazione delle identità per i carichi di lavoro per GKE, procedi nel seguente modo:

  1. Concedi l'autorizzazione serviceusage.services.use sul progetto di quota all'account di servizio Kubernetes.

    gcloud projects add-iam-policy-binding QUOTA_PROJECT_ID \
        --role=roles/serviceusage.serviceUsageConsumer \
        --member='principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME' \
    

    Sostituisci QUOTA_PROJECT_ID con l'ID progetto del progetto di quota.

  2. Annota il account di servizio Kubernetes con il progetto quota:

    kubectl annotate serviceaccount KSA_NAME \
        --namespace NAMESPACE \
        iam.gke.io/credential-quota-project=QUOTA_PROJECT_ID
    

Per verificare che la configurazione funzioni correttamente:

  1. Crea un pod e avvia una sessione shell. Consulta la documentazione di Kubernetes per ottenere una shell per un container in esecuzione.

  2. Invia una richiesta al server di metadati:

    curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token
    
  3. Vai alla pagina API IAM Service Accounts Credentials nella console Google Cloud per il tuo progetto di quota:

    Vai alle API

  4. Controlla se il traffico è cambiato.

Esegui la pulizia

Per interrompere l'utilizzo di Workload Identity Federation for GKE, revoca l'accesso al account di servizio IAM e disabilita Workload Identity Federation for GKE sul cluster.

Revoca l'accesso

Per revocare l'accesso all'entità, rimuovi il criterio di autorizzazione IAM che hai creato nella sezione Configurare le applicazioni per utilizzare la federazione delle identità per i carichi di lavoro per GKE.

Ad esempio, per revocare l'accesso a un repository Artifact Registry, esegui questo comando:

gcloud artifacts repositories remove-iam-policy-binding REPOSITORY_NAME \
    --location=REPOSITORY_LOCATION \
    --member='principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME' \
    --role='roles/artifactregistry.reader' \
    --all

Disabilita la federazione delle identità per i carichi di lavoro per GKE

Puoi disabilitare Workload Identity Federation for GKE solo sui cluster Standard.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. Disabilita la federazione delle identità per i carichi di lavoro per GKE su ogni pool di nodi:

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --workload-metadata=GCE_METADATA
    

    Ripeti questo comando per ogni pool di nodi nel cluster.

  3. Disabilita la federazione delle identità per i carichi di lavoro per GKE nel cluster:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --disable-workload-identity
    

Console

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud .

    Vai a Google Kubernetes Engine

  2. Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.

  3. Fai clic sulla scheda Nodi.

  4. Per disabilitare la federazione delle identità per i carichi di lavoro per GKE su ciascun pool di nodi, procedi nel modo seguente per ciascun pool di nodi nella sezione Node pool:

    1. Fai clic sul nome del pool di nodi che vuoi modificare.
    2. Nella pagina Dettagli del pool di nodi, fai clic su Modifica.
    3. Nella pagina Modifica pool di nodi, nella sezione Sicurezza, deseleziona la casella di controllo Abilita server metadati GKE.
    4. Fai clic su Salva.
  5. Per disabilitare la federazione delle identità per i carichi di lavoro per GKE per il cluster, procedi nel seguente modo:

    1. Fai clic sulla scheda Dettagli.
    2. Nella sezione Sicurezza, accanto a Workload Identity, fai clic su Modifica.
    3. Nella finestra di dialogo Modifica Workload Identity, deseleziona la casella di controllo Abilita Workload Identity.
    4. Fai clic su Salva modifiche.

Disabilita la federazione delle identità per i carichi di lavoro per GKE nella tua organizzazione

Dal punto di vista della sicurezza, la federazione delle identità per i carichi di lavoro per GKE consente a GKE di asserire le identità degli account di servizio Kubernetes che possono essere autenticate e autorizzate per Google Cloud le risorse. Se sei un amministratore che ha intrapreso azioni per isolare i carichi di lavoro dalle risorseGoogle Cloud , ad esempio disattivando la creazione di account di servizio o disattivando la creazione di chiavi dell'account di servizio, potresti anche voler disattivare la federazione delle identità per i carichi di lavoro per GKE per la tua organizzazione.

Consulta queste istruzioni per disabilitare la federazione delle identità per i carichi di lavoro per GKE per la tua organizzazione.

Risoluzione dei problemi

Per informazioni sulla risoluzione dei problemi, consulta la sezione Risoluzione dei problemi relativi a Workload Identity Federation for GKE.

Passaggi successivi