Questo documento 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 saperne di più, consulta Informazioni sulla federazione di Workload Identity per GKE.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività, installa e initialize gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente eseguendo
gcloud components update
.
- Assicurati che le API Google Cloud a cui vuoi accedere siano supportate dalla federazione di Workload Identity per GKE. Per un elenco delle API supportate, consulta l'articolo Prodotti e limitazioni supportati. Se l'API non è supportata o se il tuo caso d'uso è bloccato dalle limitazioni della federazione di Workload Identity per il servizio in questione, consulta la sezione Alternativa: collegare Kubernetes ServiceAccounts a IAM in questo documento.
Assicurati di aver abilitato l'API IAM Service Account Credentials.
Assicurati di disporre dei seguenti ruoli IAM:
roles/container.admin
roles/iam.serviceAccountAdmin
Assicurati di comprendere le limitazioni della federazione di Workload Identity per GKE.
Abilita la federazione di Workload Identity per GKE su cluster e pool di nodi
In Autopilot, la federazione delle identità per i carichi di lavoro per GKE è abilitata per impostazione predefinita. Passa alla sezione Configura le applicazioni per l'utilizzo della federazione di Workload Identity per GKE.
In Standard, abiliti la federazione di Workload Identity per GKE su cluster e pool di nodi utilizzando Google Cloud CLI o la console Google Cloud. La federazione di Workload Identity per GKE deve essere abilitata a livello di cluster prima di poter abilitare la federazione di Workload Identity per GKE sui pool di nodi.
Crea un nuovo cluster
Puoi abilitare la federazione di Workload Identity per GKE su un nuovo cluster Standard utilizzando gcloud CLI o la console Google Cloud.
gcloud
-
Nella console Google Cloud, 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.
Per abilitare la federazione di Workload Identity per GKE su 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
: la località di Compute Engine per il cluster.PROJECT_ID
: il tuo ID progetto Google Cloud.
Console
Per abilitare la federazione di Workload Identity per GKE su un nuovo cluster:
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, nella sezione Cluster, fai clic su Sicurezza.
Seleziona la casella di controllo Abilita Workload Identity.
Continua a configurare il cluster, quindi fai clic su Crea.
Aggiorna un cluster esistente
Puoi abilitare la federazione di Workload Identity per GKE su un cluster Standard esistente utilizzando gcloud CLI o la console Google Cloud. I pool di nodi esistenti non sono interessati, ma i nuovi pool di nodi nel cluster utilizzano la federazione di Workload Identity per GKE.
gcloud
-
Nella console Google Cloud, 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.
Per abilitare la federazione di Workload Identity per GKE su 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
: il tuo ID progetto Google Cloud.
Console
Per abilitare la federazione di Workload Identity per GKE su un cluster esistente:
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.
Migrazione dei carichi di lavoro esistenti alla federazione di Workload Identity per GKE
Dopo aver abilitato la federazione di Workload Identity per GKE su un cluster esistente, potresti voler eseguire la migrazione dei carichi di lavoro in esecuzione in modo da utilizzare la federazione di Workload Identity per GKE. Seleziona la strategia di migrazione ideale per il tuo ambiente. Puoi creare nuovi pool di nodi con la federazione di Workload Identity per GKE abilitata oppure aggiornare i pool di nodi esistenti per abilitare la federazione di Workload Identity per GKE.
Ti consigliamo di creare nuovi pool di nodi se devi modificare anche le applicazioni in modo che siano compatibili con la federazione delle identità per i carichi di lavoro per GKE.
Crea un nuovo pool di nodi
Tutti i nuovi pool di nodi che crei per impostazione predefinita utilizzano la federazione di Workload Identity per GKE, se nel cluster è abilitata la federazione di Workload Identity per GKE. Per creare un nuovo pool di nodi con la federazione delle identità 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 in cui è abilitata la federazione delle identità di Workload per GKE.
Il flag --workload-metadata=GKE_METADATA
configura il pool di nodi per l'utilizzo del server metadati GKE. Ti consigliamo di includere 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 nel cluster.
Aggiorna un pool di nodi esistente
Puoi abilitare manualmente la federazione di Workload Identity per GKE sui pool di nodi esistenti dopo aver abilitato la federazione di Workload Identity per GKE sul cluster.
gcloud
-
Nella console Google Cloud, 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.
Per modificare un pool di nodi esistente in modo da 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 di Workload Identity per GKE, puoi disabilitarla in modo selettivo in un pool di nodi specifico specificando
--workload-metadata=GCE_METADATA
in modo esplicito. Per ulteriori informazioni, consulta Protezione dei metadati del cluster.
Console
Per modificare un pool di nodi esistente per l'utilizzo della federazione di Workload Identity per GKE, segui questi passaggi:
Vai alla pagina Google Kubernetes Engine nella console Google Cloud.
Nell'elenco dei cluster, fai clic sul nome del cluster che vuoi 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.
Configura le applicazioni per l'utilizzo della federazione di Workload Identity per GKE
Per consentire alle tue applicazioni GKE di eseguire l'autenticazione nelle API Google Cloud utilizzando la federazione di Workload Identity per GKE, devi creare criteri IAM per le API specifiche. L'entità in questi criteri è un identificatore entità IAM che corrisponde ai carichi di lavoro, agli spazi dei nomi o agli account di servizio.
Configura autorizzazione e entità
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 GKE.LOCATION
: la località 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
Creare un ServiceAccount Kubernetes da utilizzare per l'applicazione. Puoi anche utilizzare qualsiasi ServiceAccount Kubernetes esistente in qualsiasi spazio dei nomi. Se non assegni un ServiceAccount al tuo 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 ServiceAccount Kubernetes.NAMESPACE
: il nome dello spazio dei nomi Kubernetes per il ServiceAccount.
Creare un criterio di autorizzazione IAM che fa riferimento a Kubernetes ServiceAccount. Come buona prassi, concedi autorizzazioni a risorse Google Cloud specifiche a cui l'applicazione deve accedere. Devi avere le autorizzazioni IAM pertinenti per creare criteri di autorizzazione nel progetto.
Ad esempio, il comando seguente 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 tuo numero numerico di progetto Google Cloud.
Puoi concedere ruoli su qualsiasi risorsa Google Cloud che supporta i criteri di autorizzazione IAM. La sintassi dell'identificatore 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 federazione di Workload Identity per la configurazione di GKE
In questa sezione creerai un bucket Cloud Storage e concedi l'accesso in visualizzazione sul bucket all'account di servizio Kubernetes creato nella sezione precedente. Successivamente, eseguirai il deployment di un carico di lavoro e verificherai che il container 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 tuo numero numerico di progetto Google Cloud.NAMESPACE
: lo spazio dei nomi Kubernetes che contiene 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 in pool di nodi che utilizzano la federazione di Workload Identity per GKE.Ignora 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"
Applica la configurazione al cluster:
kubectl apply -f test-app.yaml
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
Apri una sessione shell nel pod:
kubectl exec -it pods/test-pod --namespace=NAMESPACE -- /bin/bash
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: collegare Kubernetes ServiceAccounts a IAM
Ti consigliamo di utilizzare gli identificatori delle entità IAM per configurare la 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 l'accesso a queste API dai tuoi carichi di lavoro GKE:
Crea uno spazio dei nomi Kubernetes:
kubectl create namespace NAMESPACE
Crea un ServiceAccount Kubernetes:
kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
Creare un account di servizio IAM. Inoltre, puoi utilizzare qualsiasi account di servizio IAM esistente 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 account di servizio IAM.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 alle API Google Cloud, consulta Informazioni sugli account di servizio.
Concedi al tuo account di servizio IAM i ruoli di cui ha bisogno su specifiche API Google Cloud:
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 concede a Kubernetes ServiceAccount l'accesso per impersonare 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]"
Annota il ServiceAccount 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
Utilizza la federazione di Workload Identity per GKE dal tuo codice
L'autenticazione nei servizi Google Cloud dal tuo codice è la stessa procedura dell'autenticazione mediante il server di metadati di Compute Engine. Quando utilizzi la federazione di Workload Identity per GKE, le tue richieste al server dei metadati dell'istanza vengono instradate al server di metadati GKE. Il codice esistente che esegue l'autenticazione mediante il server dei metadati dell'istanza (ad esempio il codice che utilizza 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
Nei cluster che eseguono GKE versione 1.24 o successiva, puoi facoltativamente configurare il tuo account di servizio Kubernetes in modo da utilizzare la quota di un altro progetto Google Cloud quando effettui 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 invece di utilizzare quella 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:
Concedi l'autorizzazione
serviceusage.services.use
sul progetto della quota all'account di servizio Kubernetes.gcloud projects add-iam-policy-binding QUOTA_PROJECT_ID \ --role=roles/serviceusage.serviceUsageConsumer \ --member='principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/serviceaccount/NAMESPACE/KSA_NAME' \
Sostituisci
QUOTA_PROJECT_ID
con l'ID del progetto della quota.Annota l'account di servizio Kubernetes con il progetto della quota:
kubectl annotate serviceaccount KSA_NAME \ --namespace NAMESPACE \ iam.gke.io/credential-quota-project=QUOTA_PROJECT_ID
Per verificare che la configurazione funzioni correttamente:
Creare un pod e avviare una sessione shell. Consulta la documentazione di Kubernetes per ottenere una Shell in un container in esecuzione.
Invia una richiesta al server dei metadati:
curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token
Vai alla pagina dell'API IAM Service Accounts Credentials nella console Google Cloud per il tuo progetto di quota:
Verifica la presenza di variazioni nel traffico.
Esegui la pulizia
Per interrompere l'utilizzo della federazione di Workload Identity per GKE, revoca l'accesso all'account di servizio IAM e disabilita la federazione di Workload Identity per GKE sul cluster.
Revoca l'accesso
Per revocare l'accesso all'entità, rimuovi il criterio di autorizzazione IAM creato nella sezione Configurare le applicazioni per l'utilizzo della federazione di Workload Identity 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='principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/serviceaccount/NAMESPACE/KSA_NAME' \
--role='roles/artifactregistry.reader' \
--all
Disabilita federazione di Workload Identity per GKE
Puoi disabilitare la federazione di Workload Identity per GKE su cluster Standard.
gcloud
-
Nella console Google Cloud, 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.
Disabilita la federazione di Workload Identity per 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 nel cluster.
Disabilita la federazione di Workload Identity per 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 che vuoi modificare.
Fai clic sulla scheda Nodi.
Per disabilitare la federazione di Workload Identity per GKE su ogni pool di nodi, segui questi passaggi per ciascun pool di 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, deseleziona la casella di controllo Abilita server metadati GKE.
- Fai clic su Salva.
Per disabilitare la federazione di Workload Identity per GKE per il cluster:
- 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.
Disabilita la federazione di Workload Identity per GKE nella tua organizzazione
Dal punto di vista della sicurezza, la federazione di Workload Identity per GKE consente a GKE di rivendicare 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 la disattivazione della creazione degli account di servizio o la disattivazione della creazione di chiavi dell'account di servizio, ti consigliamo di disabilitare anche la federazione di Workload Identity per GKE per la tua organizzazione.
Risoluzione dei problemi
Per informazioni sulla risoluzione dei problemi, consulta Risoluzione dei problemi relativi alla federazione di Workload Identity per GKE.
Passaggi successivi
- Scopri di più sulla federazione delle identità per i carichi di lavoro per GKE.
- Leggi la panoramica sulla sicurezza di GKE.
- Scopri di più sulla protezione dei metadati del cluster.
- Scopri di più sugli account di servizio IAM.