Autenticazione nelle API Google Cloud dai carichi di lavoro GKE


Questo documento mostra come accedere in modo più sicuro alle API Google Cloud da dei carichi di lavoro in esecuzione nei cluster Google Kubernetes Engine (GKE) utilizzando Federazione delle identità dei carichi di lavoro per GKE. Per saperne di più, vedi Informazioni sulla federazione delle identità per i carichi di lavoro per GKE.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti attività:

  • Attiva l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine .
  • Se vuoi utilizzare Google Cloud CLI per questa attività, install e poi initialize con gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente 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. Passa alle Sezione Configura le applicazioni per utilizzare la federazione delle identità per i carichi di lavoro per GKE.

In Standard, abiliti la federazione delle identità per i carichi di lavoro per GKE su cluster e nodi utilizzando Google Cloud CLI o la console Google Cloud. Per poter utilizzare la federazione delle identità per GKE di lavoro deve essere abilitata a livello di cluster abilita la federazione delle identità per i carichi di lavoro per GKE sui pool di nodi.

Crea un nuovo cluster

Puoi abilitare la federazione delle identità per i carichi di lavoro per GKE su un nuovo cluster Standard utilizzando gcloud CLI o la console Google Cloud.

gcloud

  1. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

    Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.

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

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

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del nuovo cluster.
    • LOCATION: il valore Località di Compute Engine per il cluster.
    • PROJECT_ID: l'ID del tuo progetto Google Cloud.

Console

Per abilitare la federazione delle identità per i carichi di lavoro per GKE in un nuovo cluster, segui questi passaggi:

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

    Vai a Google Kubernetes Engine

  2. Fai clic su Crea.

  3. Nella finestra di dialogo Crea cluster, per GKE Standard, fai clic su Configura.

  4. Nel menu di navigazione, nella sezione Cluster, fai clic su Sicurezza.

  5. Seleziona la casella di controllo Abilita Workload Identity.

  6. Continua a configurare il cluster, quindi fai clic su Crea.

Aggiorna un cluster esistente

Puoi abilitare la federazione delle identità per i carichi di lavoro per GKE su un cluster Standard esistente utilizzando gcloud CLI o la console Google Cloud. Pool di nodi esistenti non sono interessati, ma eventuali nuovi pool di nodi nel cluster utilizzano la federazione delle identità per i carichi di lavoro per GKE.

gcloud

  1. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

    Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.

  2. Per abilitare la federazione delle identità per i carichi di lavoro per GKE in un cluster esistente, esegui questo 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 località di Compute Engine del tuo cluster.
    • PROJECT_ID: l'ID del tuo progetto Google Cloud.

Console

Per abilitare la federazione delle identità per i carichi di lavoro per GKE in un cluster esistente, 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. 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.

Esegui la migrazione dei carichi di lavoro esistenti alla federazione delle identità per i carichi di lavoro per GKE

Dopo aver abilitato la federazione delle identità per i carichi di lavoro per GKE in un cluster esistente, è consigliabile eseguire la migrazione dei carichi di lavoro in esecuzione per utilizzare la federazione delle identità per i carichi di lavoro per GKE. Seleziona il 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 o aggiorna i pool di nodi esistenti per abilitare la federazione delle identità per i carichi di lavoro per GKE.

Ti consigliamo di creare nuovi pool di nodi se devi modificare anche i tuoi compatibili con la federazione delle identità per i carichi di lavoro per GKE.

Tutti i nuovi pool di nodi che crei utilizzano per impostazione predefinita 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 Federazione delle identità per i carichi di lavoro per GKE abilitata. Esegui questo comando:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --workload-metadata=GKE_METADATA

Sostituisci quanto segue:

  • NODEPOOL_NAME: il nome del nuovo pool di nodi.
  • CLUSTER_NAME: il nome del cluster esistente con Federazione delle identità per i carichi di lavoro per GKE abilitata.

Il flag --workload-metadata=GKE_METADATA configura il pool di nodi da utilizzare il server di metadati GKE. Ti consigliamo di includere il flag in modo che la creazione del pool di nodi non riesca se la federazione delle identità per i carichi di lavoro per GKE non è abilitata nel in un cluster Kubernetes.

Aggiorna un pool di nodi esistente

Puoi abilitare manualmente la federazione delle identità per i carichi di lavoro per GKE su pool di nodi esistenti abilita la federazione delle identità per i carichi di lavoro per GKE sul cluster.

gcloud

  1. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

    Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.

  2. Per modificare un pool di nodi esistente per utilizzare la federazione delle identità per i carichi di lavoro per GKE, esegui questo comando :

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --region=COMPUTE_REGION \
        --workload-metadata=GKE_METADATA
    

    Se in un cluster è abilitata la federazione delle identità per i carichi di lavoro per GKE, puoi disabilitarla selettivamente su una pool di nodi specifico specificando esplicitamente --workload-metadata=GCE_METADATA. Vedi Protezione del cluster metadati per ulteriori informazioni informazioni.

Console

Per modificare un pool di nodi esistente per utilizzare la federazione delle identità per i carichi di lavoro per GKE, esegui queste operazioni: 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 che vuoi modificare.

  3. Fai clic sulla scheda Nodi.

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

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

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

  7. Fai clic su Salva.

Configura le applicazioni per utilizzare la federazione delle identità per i carichi di lavoro per GKE

Per consentire l'autenticazione delle applicazioni GKE in Google Cloud che utilizzano la federazione delle identità per i carichi di lavoro per GKE, devi creare i criteri IAM le API specifiche. L'entità di questi criteri è identificatore entità che corrisponde ai carichi di lavoro, agli spazi dei nomi Account di servizio.

Configura autorizzazione e entità

  1. Richiedi le credenziali per il tuo cluster:

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

    Sostituisci quanto segue:

    • CLUSTER_NAME: il nome del cluster in cui è abilitata la federazione delle identità per i carichi di lavoro per GKE.
    • LOCATION: la località del cluster.
  2. Crea uno spazio dei nomi da utilizzare per l'account di servizio Kubernetes. Puoi anche utilizza lo spazio dei nomi default o qualsiasi spazio dei nomi esistente.

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

    kubectl create serviceaccount KSA_NAME \
        --namespace NAMESPACE
    

    Sostituisci quanto segue:

    • KSA_NAME: il nome del tuo nuovo Kubernetes Account di servizio.
    • NAMESPACE: il nome dello spazio dei nomi Kubernetes per l'Account di servizio.
  4. Crea un criterio di autorizzazione IAM che fa riferimento a Kubernetes Account di servizio. È buona prassi concedere autorizzazioni a specifiche Risorse Google Cloud a cui la tua applicazione deve accedere. Devi dispongono delle autorizzazioni IAM pertinenti per creare criteri di autorizzazione in del progetto.

    Ad esempio, il seguente comando concede Visualizzatore cluster Kubernetes Engine (roles/container.clusterViewer) all'Account di servizio che 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: l'ID del tuo progetto Google Cloud.
    • PROJECT_NUMBER: il valore numerico di Google Cloud del progetto.

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

Verifica la configurazione della federazione delle identità per i carichi di lavoro per GKE

In questa sezione, creerai un bucket Cloud Storage e concederai l'accesso in visualizzazione il bucket all'account di servizio Kubernetes che hai creato . Poi esegui il deployment di un carico di lavoro e verifica che il container possa elencare dei 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 Visualizzatore oggetti Storage (roles/storage.objectViewer) all'Account di servizio che 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: l'ID del tuo progetto Google Cloud.
    • PROJECT_NUMBER: il valore numerico di Google Cloud del progetto.
    • NAMESPACE: lo spazio dei nomi Kubernetes l'Account di servizio.
    • KSA_NAME: il nome dell'account di servizio.
  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 a 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 la federazione delle identità per i carichi di lavoro per 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 seguente 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 di shell nel pod:

    kubectl exec -it pods/test-pod --namespace=NAMESPACE -- /bin/bash
    
  8. Recupera un elenco degli 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: collegare gli account di servizio Kubernetes a IAM

Ti consigliamo di utilizzare gli identificatori entità IAM per configurare Federazione delle identità per i carichi di lavoro per GKE. Tuttavia, questa identità federata ha limitazioni specifiche. per ogni API Google Cloud supportata. Per un elenco delle limitazioni, vedi Prodotti supportati e limitazioni.

Se queste limitazioni si applicano al tuo caso, segui questi passaggi per configurare e l'accesso alle API dai carichi di lavoro GKE:

  1. Crea uno spazio dei nomi Kubernetes:

    kubectl create namespace NAMESPACE
    
  2. Crea un ServiceAccount per Kubernetes:

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    
  3. Creare un account di servizio IAM. Puoi anche utilizzare qualsiasi modello Account di servizio IAM in qualsiasi progetto nell'organizzazione.

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

    Sostituisci quanto segue:

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

    Per informazioni su come autorizzare gli account di servizio IAM ad accedere a Google Cloud Per le API, consulta la sezione Informazioni sugli account di servizio.

  4. Concedi al tuo account di servizio IAM i ruoli di cui ha bisogno su 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 un criterio di autorizzazione IAM che fornisca a Kubernetes Accesso ServiceAccount 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 l'Account di servizio Kubernetes . Ad esempio, serviceAccount:example-project.svc.id.goog[example-namespace/example-serviceaccount].

  6. Annota l'Account di servizio Kubernetes in modo che GKE veda 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
    

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

La procedura per l'autenticazione nei servizi Google Cloud dal tuo codice è la stessa come autenticazione mediante i metadati di Compute Engine o server web. Quando utilizzi la federazione delle identità per i carichi di lavoro per GKE, le richieste al server dei metadati dell'istanza vengono instradate Server di metadati GKE. Codice esistente che esegue l'autenticazione mediante il server di metadati dell'istanza (come il codice utilizzando le librerie client di Google Cloud) dovrebbe funzionare senza modifiche.

Utilizza la quota di un altro progetto con la federazione delle identità per i carichi di lavoro per GKE

Sui cluster che eseguono GKE versione 1.24 o successive, puoi facoltativamente configurare il tuo account di servizio Kubernetes per l'utilizzo della quota da un altro progetto Google Cloud quando si effettuano chiamate a i metodi GenerateAccessToken e GenerateIdToken nell'API IAM Service Account Credentials. Ciò ti consente di evitare di utilizzare l'intera quota il tuo progetto principale e utilizza la quota di altri progetti questi servizi nel tuo cluster.

Per configurare un progetto quota con la federazione delle identità per i carichi di lavoro per GKE, esegui la seguenti:

  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 l'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, segui questi passaggi:

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

  2. Effettua una richiesta al server dei 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. Verifica la presenza di variazioni nel traffico.

Esegui la pulizia

Per interrompere l'utilizzo della federazione delle identità per i carichi di lavoro per GKE, revoca l'accesso a IAM e disabilita la federazione delle identità per i carichi di lavoro per GKE sul cluster.

Revoca l'accesso

Per revocare l'accesso all'entità, rimuovi il criterio di autorizzazione IAM che hai creato Sezione Configura 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 la federazione delle identità per i carichi di lavoro per GKE solo su Standard cluster.

gcloud

  1. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

    Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.

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

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --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 \
        --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 che vuoi 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, segui questi passaggi per Ogni pool di nodi nella sezione Pool di nodi:

    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, cancella il valore 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, segui questi passaggi:

    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, cancella il 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 Identità degli account di servizio Kubernetes che possono essere autenticate e autorizzate in Google Cloud Google Cloud. Se sei un amministratore che ha intrapreso delle azioni per isolare i carichi di lavoro Risorse Google Cloud, ad esempio la disattivazione della creazione di account di servizio disattivando la creazione della chiave dell'account di servizio, potresti anche voler disabilitare 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 Risoluzione dei problemi relativi alla federazione delle identità per i carichi di lavoro per GKE.

Passaggi successivi