Questa pagina mostra come accedere in modo più sicuro alle API Google Cloud dai carichi di lavoro in esecuzione nei cluster Google Kubernetes Engine (GKE) utilizzando la federazione delle identità per i carichi di lavoro per GKE. Per scoprire di più, consulta Informazioni su Workload Identity Federation per GKE.
Questa pagina è rivolta ad amministratori di identità e account, operatori e 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 Ruoli e attività comuni degli utenti di GKE Enterprise.
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à,
installa e poi
inizializza gcloud CLI. Se hai già installato gcloud CLI, ottieni la versione più recente eseguendo
gcloud components update
.
- Assicurati che le API Google Cloud a cui vuoi accedere siano supportate dalla federazione delle identità per i carichi di lavoro per GKE. Per un elenco delle API supportate, consulta Prodotti supportati e limitazioni. Se l'API non è supportata o se il tuo caso d'uso è bloccato dalle limitazioni della federazione Workload Identity per quel servizio, consulta la sezione Alternativa: collega gli account di servizio Kubernetes a IAM in questa pagina.
Assicurati di aver attivato l'API Credentials dell'account di servizio IAM.
Assicurati di disporre dei seguenti ruoli IAM:
roles/container.admin
roles/iam.serviceAccountAdmin
Assicurati di comprendere le limitazioni di Workload Identity Federation for GKE.
Abilita Workload Identity Federation for 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 l'utilizzo di Workload Identity Federation per GKE.
In Standard, puoi attivare la Federazione delle identità per i carichi di lavoro per GKE su cluster e pool di nodi utilizzando Google Cloud CLI o la console Google Cloud. Workload Identity Federation for GKE deve essere abilitato a livello di cluster prima di poter attivare Workload Identity Federation for 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 la gcloud CLI o la console Google Cloud.
gcloud
-
In the Google Cloud console, 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.
Per abilitare Workload Identity Federation for GKE in un nuovo cluster, esegui il seguente 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
: la posizione Compute Engine per il cluster.PROJECT_ID
: il tuo ID progetto Google Cloud.
Console
Per abilitare Workload Identity Federation for GKE in un nuovo cluster, segui questi passaggi:
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Fai clic su add_box Crea.
Nella finestra di dialogo Crea cluster, per GKE Standard, fai clic su Configura.
Nel menu di navigazione, fai clic su Sicurezza nella sezione Cluster.
Seleziona la casella di controllo Abilita Workload Identity.
Continua a configurare il cluster, quindi fai clic su Crea.
Aggiornare un cluster esistente
Puoi attivare la federazione delle identità per i carichi di lavoro per GKE in un cluster standard esistente utilizzando la 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
-
In the Google Cloud console, 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.
Per attivare 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 Compute Engine del tuo 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, segui questi passaggi:
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.
Nella pagina dei dettagli del cluster, nella sezione Sicurezza, fai clic su
Modifica Workload Identity.Nella finestra di dialogo Modifica Workload Identity, seleziona la casella di controllo Abilita Workload Identity.
Fai clic su Salva modifiche.
Esegui la migrazione dei carichi di lavoro esistenti a Workload Identity Federation for GKE
Dopo aver attivato la federazione delle identità per i carichi di lavoro per GKE in un cluster esistente, ti consigliamo di eseguire la migrazione dei carichi di lavoro in esecuzione in modo che utilizzino 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 attivare Workload Identity Federation for GKE in un pool di nodi solo se la federazione delle identità per i carichi di lavoro per GKE è attivata sul cluster.
Crea nuovi pool di nodi se devi anche modificare le tue applicazioni in modo che siano compatibili con la federazione delle identità per i carichi di lavoro per GKE.
Crea un nuovo node pool
Per impostazione predefinita, tutti i nuovi pool di nodi che crei utilizzano Workload Identity Federation for GKE se nel cluster è abilitata Workload Identity Federation for GKE. Per creare un nuovo pool di nodi con la federazione delle identità per i carichi di lavoro per GKE abilitata, esegui il seguente 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 in cui è attivata la federazione delle identità per i carichi di lavoro per GKE.
Il flag --workload-metadata=GKE_METADATA
configura il pool di nodi in modo da utilizzare il server metadati GKE.
Includi il flag in modo che la creazione del pool di nodi non vada a buon fine se la federazione delle identità per i carichi di lavoro per GKE non è abilitata sul cluster.
Aggiornare un pool di nodi esistente
Puoi abilitare manualmente Workload Identity Federation for GKE nei pool di nodi esistenti dopo aver attivato Workload Identity Federation for GKE nel cluster.
gcloud
-
In the Google Cloud console, 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.
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 \ --region=COMPUTE_REGION \ --workload-metadata=GKE_METADATA
Se in un cluster è abilitata la federazione delle identità per i carichi di lavoro per GKE, puoi disattivarla in modo selettivo in un pool di nodi specifico specificando esplicitamente
--workload-metadata=GCE_METADATA
. Per ulteriori informazioni, 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, svolgi i seguenti passaggi:
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.
Fai clic sulla scheda Nodi.
Nella sezione Pool di nodi, fai clic sul nome del pool di nodi che vuoi modificare.
Nella pagina Dettagli del pool di nodi, fai clic su
Modifica.Nella pagina Modifica pool di nodi, nella sezione Sicurezza, seleziona la casella di controllo Abilita server metadati GKE.
Fai clic su Salva.
Configurare le applicazioni per utilizzare la federazione delle identità per i carichi di lavoro per GKE
Per consentire alle applicazioni GKE di autenticarsi alle API Google Cloud utilizzando la federazione delle identità per i carichi di lavoro per GKE, devi creare criteri IAM per le API specifiche. L'entità in questi criteri è un identificatore dell'entità IAM che corrisponde ai carichi di lavoro, agli spazi dei nomi o ai service account. 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 rubare l'identità degli account di servizio IAM, in modo che GKE scambi il token di accesso federato con un token di accesso dall'API IAM Credentials for Service Account. Per maggiori dettagli, consulta la sezione Alternativa: collega gli account servizio Kubernetes a IAM.
Configurare l'autorizzazione e i principali
Recupera 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 posizione del cluster.
Crea uno spazio dei nomi da utilizzare per l'account di servizio Kubernetes. Puoi anche utilizzare lo spazio dei nomi
default
o qualsiasi spazio dei nomi esistente.kubectl create namespace NAMESPACE
Crea un account di servizio Kubernetes da utilizzare per la tua applicazione. Puoi anche utilizzare qualsiasi account di servizio Kubernetes esistente in qualsiasi spazio dei nomi. Se non assegni un account ServiceAccount al tuo carico di lavoro, Kubernetes assegna l'account ServiceAccount
default
nello spazio dei nomi.kubectl create serviceaccount KSA_NAME \ --namespace NAMESPACE
Sostituisci quanto segue:
KSA_NAME
: il nome del nuovo servizio account Kubernetes.NAMESPACE
: il nome dello spazio dei nomi Kubernetes per il servizio account.
Crea un criterio di autorizzazione IAM che fa riferimento all'account di servizio Kubernetes. Come buona prassi, concedi le autorizzazioni a risorse Google Cloud specifiche a cui la tua applicazione deve accedere. Devi disporre delle autorizzazioni IAM pertinenti per creare criteri di autorizzazione nel tuo progetto.
Ad esempio, il seguente comando concede il ruolo Visualizzatore cluster Kubernetes Engine (
roles/container.clusterViewer
) all'account di servizio 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 numerico del progetto Google Cloud.
Puoi concedere ruoli a qualsiasi risorsa Google Cloud che supporta i criteri di autorizzazione IAM. La sintassi dell'identificatore principale dipende dalla risorsa Kubernetes. Per un elenco degli identificatori supportati, consulta Identificatori principali per Workload Identity Federation per GKE.
(Facoltativo) Configura le opzioni di 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 per GKE
In questa sezione, crei un bucket Cloud Storage e concedi l'accesso in visualizzazione al bucket al servizio account Kubernetes che hai creato nella sezione precedente. Poi esegui il deployment di un carico di lavoro e verifica che il contenitore possa elencare i cluster nel progetto.
Crea un bucket Cloud Storage vuoto:
gcloud storage buckets create gs://BUCKET
Sostituisci
BUCKET
con un nome per il nuovo bucket.Concedi il ruolo Visualizzatore oggetti Storage (
roles/storage.objectViewer
) all'account ServiceAccount 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 numerico del progetto Google Cloud.NAMESPACE
: lo spazio dei nomi Kubernetes che contiene il ServiceAccount.KSA_NAME
: il nome del ServiceAccount.
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
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 per GKE.
spec: nodeSelector: iam.gke.io/gke-metadata-server-enabled: "true"
Applica la configurazione al cluster:
kubectl apply -f test-app.yaml
Attendi che il pod sia pronto. Per controllare lo stato del pod, esegui il comando seguente:
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
Apri una sessione di shell nel pod:
kubectl exec -it pods/test-pod --namespace=NAMESPACE -- /bin/bash
Visualizza 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 gli account di servizio Kubernetes a IAM
Utilizza gli identificatori dei principali IAM per configurare Workload Identity Federation per GKE. Tuttavia, questa identità federata presenta limitazioni specifiche per ogni API Google Cloud supportata. Se queste limitazioni ti riguardano, segui i passaggi riportati di seguito per configurare l'accesso a queste API dai carichi di lavoro GKE.
Crea uno spazio dei nomi Kubernetes:
kubectl create namespace NAMESPACE
Crea un account di servizio Kubernetes:
kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
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 servizio IAM.
Per informazioni sull'autorizzazione degli account di servizio IAM ad accedere alle API di Google Cloud, consulta Informazioni sugli account di servizio.
Concedi all'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 esempioroles/spanner.viewer
.Crea un criterio di autorizzazione IAM che consenta all'account servizio Kubernetes di rubare l'identità dell'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]
.Aggiungi un'annotazione all'account di servizio Kubernetes 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 obbligatori sia il criterio di autorizzazione IAM che l'annotazione.
Utilizzare Workload Identity Federation for GKE dal codice
L'autenticazione ai servizi Google Cloud dal codice è la stessa procedura dell'autenticazione tramite il server di metadati di Compute Engine. Quando utilizzi la federazione delle identità per i carichi di lavoro per GKE, le richieste al server metadati dell'istanza vengono inoltrate al server metadati GKE. Il codice esistente che si autentica utilizzando il server dei metadati dell'istanza (ad esempio il codice che utilizza le librerie client di Google Cloud) dovrebbe funzionare senza modifiche.
Utilizzare la quota di un altro progetto con Workload Identity Federation per GKE
Nei cluster che eseguono GKE versione 1.24 o successive, puoi facoltativamente configurare l'account di servizio Kubernetes in modo che utilizzi la quota di un altro progetto Google Cloud quando effettui chiamate ai metodi GenerateAccessToken
e GenerateIdToken
nell'API Credentials for Service Account IAM. In questo modo puoi evitare di utilizzare l'intera quota nel
tuo progetto principale e utilizzare la quota di altri progetti per
questi servizi nel tuo cluster.
Per configurare un progetto quota con Workload Identity Federation per GKE, svolgi i seguenti passaggi:
Concedi l'autorizzazione
serviceusage.services.use
al progetto 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 del progetto della quota.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:
Crea un pod e avvia una sessione di shell. Consulta la documentazione di Kubernetes per ottenere una shell per un contenitore in esecuzione.
Effettua una richiesta al server di metadati:
curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token
Vai alla pagina API Credenziali account di servizio IAM nella console Google Cloud per il tuo progetto quota:
Controlla se il traffico è cambiato.
Esegui la pulizia
Per interrompere l'utilizzo di Workload Identity Federation per GKE, revoca l'accesso all'account di servizio IAM e disabilita Workload Identity Federation per GKE nel 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 Workload Identity Federation per GKE.
Ad esempio, per revocare l'accesso a un repository Artifact Registry, esegui il seguente 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
Disattivare Workload Identity Federation per GKE
Puoi disabilitare Workload Identity Federation for GKE solo sui cluster standard.
gcloud
-
In the Google Cloud console, 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.
Disabilita Workload Identity Federation for GKE su ogni 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 del cluster.
Disabilita Workload Identity Federation for GKE nel cluster:
gcloud container clusters update CLUSTER_NAME \ --disable-workload-identity
Console
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.
Fai clic sulla scheda Nodi.
Per disabilitare la federazione delle identità per i carichi di lavoro per GKE su ciascun pool di nodi, procedi nel seguente modo per ciascun pool di nodi nella sezione Node pool:
- Fai clic sul nome del pool di nodi che vuoi modificare.
- Nella pagina Dettagli del pool di nodi, fai clic su Modifica.
- Nella pagina Modifica pool di nodi, nella sezione Sicurezza, deseleziona la casella di controllo Abilita server metadati GKE.
- Fai clic su Salva.
Per disabilitare Workload Identity Federation for GKE per il cluster, segui questi passaggi:
- Fai clic sulla scheda Dettagli.
- Nella sezione Sicurezza, accanto a Workload Identity, fai clic su Modifica.
- Nella finestra di dialogo Modifica Workload Identity, deseleziona la casella di controllo Abilita Workload Identity.
- Fai clic su Salva modifiche.
Disattivare Workload Identity Federation for 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 affermare le identità degli account di servizio Kubernetes che possono essere autenticate e autorizzate per le risorse Google Cloud. Se sei un amministratore che ha intrapreso azioni per isolare i carichi di lavoro dalle risorse Google Cloud, ad esempio disattivando la creazione di account di servizio o disattivando la creazione di chiavi degli account di servizio, potresti anche disattivare la federazione delle identità per i workload 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
- Scopri di più su Workload Identity Federation per GKE.
- Leggi la panoramica della sicurezza di GKE.
- Scopri di più sulla protezione dei metadati del cluster.
- Scopri di più sugli account di servizio IAM.