Informazioni sulla federazione delle identità per i carichi di lavoro per GKE


La federazione delle identità per i carichi di lavoro per GKE è il metodo consigliato per consentire ai carichi di lavoro in esecuzione su Google Kubernetes Engine (GKE) di accedere ai servizi Google Cloud in modo sicuro e gestibile.

La federazione delle identità per i carichi di lavoro per GKE è disponibile tramite la federazione delle identità per i carichi di lavoro IAM, che fornisce identità per i carichi di lavoro eseguiti in ambienti all'interno e all'esterno di Google Cloud. Puoi utilizzare la federazione delle identità per i carichi di lavoro IAM per eseguire l'autenticazione sicura nelle API Google Cloud supportate dai carichi di lavoro in esecuzione, ad esempio, su AWS, Azure e Kubernetes autogestito. In GKE, Google Cloud gestisce per te il pool di identità e il provider per i carichi di lavoro e non richiede un provider di identità esterno.

Terminologia

Questo documento fa distinzione tra account di servizio Kubernetes e account di servizio Identity and Access Management (IAM).

Account di servizio Kubernetes
Risorse Kubernetes che forniscono un'identità per i processi in esecuzione nei pod GKE.
Account di servizio IAM
Risorse Google Cloud che consentono alle applicazioni di effettuare chiamate autorizzate alle API Google Cloud.

Che cos'è la federazione delle identità per i carichi di lavoro per GKE?

Le applicazioni in esecuzione su GKE potrebbero richiedere l'accesso alle API Google Cloud, come l'API Compute Engine, l'API BigQuery Storage o le API Machine Learning.

La federazione delle identità per i carichi di lavoro per GKE consente di utilizzare i criteri IAM per concedere ai carichi di lavoro Kubernetes nel cluster GKE l'accesso a specifiche API Google Cloud senza la necessità di configurazione manuale o di metodi meno sicuri come i file delle chiavi degli account di servizio. L'utilizzo della federazione delle identità per i carichi di lavoro per GKE ti consente di assegnare identità e autorizzazioni distinte e granulari per ogni applicazione nel tuo cluster.

La federazione delle identità per i carichi di lavoro per GKE sostituisce la necessità di utilizzare l'occultamento dei metadati. I metadati sensibili protetti dall'occultamento dei metadati sono protetti anche dalla federazione delle identità per i carichi di lavoro per GKE.

Come funziona la federazione delle identità per i carichi di lavoro per GKE

Quando abiliti la federazione delle identità per i carichi di lavoro per GKE su un cluster, GKE esegue queste operazioni:

  • Crea un pool di identità per il carico di lavoro fisso per il progetto Google Cloud del cluster con il formato seguente:

    PROJECT_ID.svc.id.goog
    

    Il pool di identità per i carichi di lavoro fornisce un formato di denominazione che consente a IAM di comprendere e considerare attendibili le credenziali Kubernetes.

  • Registra il cluster GKE come provider di identità nel pool di identità per i carichi di lavoro.

  • Esegue il deployment su ogni nodo del server di metadati GKE, che intercetta le richieste di credenziali dai carichi di lavoro.

Creazione di criteri di autorizzazione IAM sulle risorse Google Cloud

Per fornire l'accesso con la federazione delle identità per i carichi di lavoro per GKE, devi creare un criterio di autorizzazione IAM che concede l'accesso su una risorsa Google Cloud specifica a un'entità che corrisponde all'identità della tua applicazione. Ad esempio, potresti concedere autorizzazioni di lettura su un bucket Cloud Storage a tutti i pod che utilizzano l'account di servizio database-reader Kubernetes.

Per un elenco delle risorse che supportano i criteri di autorizzazione, vedi Tipi di risorse che accettano i criteri di autorizzazione.

Puoi anche limitare l'ambito dell'accesso impostando le conditions nei criteri di autorizzazione. Ad esempio, se vuoi concedere l'accesso in lettura su un bucket solo ai pod che utilizzano l'account di servizio database-reader nel cluster mysql, puoi impostare questa condizione nel criterio di autorizzazione. Per scoprire di più sull'utilizzo delle condizioni nei criteri di autorizzazione, vedi Gestire le associazioni di ruoli condizionali.

Riferimento alle risorse Kubernetes nei criteri IAM

Nel criterio IAM, fai riferimento a una risorsa Kubernetes utilizzando un identificatore entità IAM per selezionare la risorsa. Questo identificatore ha la seguente sintassi:

PREFIX://iam.googleapis.com/projects/1234567890/locations/global/workloadIdentityPools/example-project.svc.id.goog/SELECTOR

In questo esempio, considera i seguenti campi:

  • PREFIX: deve essere principal o principalSet, a seconda della risorsa selezionata. principal è per una risorsa specifica, ad esempio un singolo ServiceAccount. principalSet è per più risorse che appartengono alla risorsa specificata, come tutti i pod in un cluster specifico.
  • SELECTOR: una stringa che seleziona un tipo di entità. Ad esempio, kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID seleziona un ServiceAccount in base al relativo UID.

La tabella seguente mostra i tipi di entità supportati in GKE:

Tipo di identificatore entità Sintassi
Tutti i pod che utilizzano un ServiceAccount specifico di Kubernetes Seleziona l'account di servizio in base al nome:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/SERVICEACCOUNT

Sostituisci quanto segue:

  • PROJECT_NUMBER: il numero numerico del progetto. Per ottenere il numero del progetto, consulta Identificazione dei progetti.
  • PROJECT_ID: l'ID del tuo progetto Google Cloud.
  • NAMESPACE: lo spazio dei nomi Kubernetes.
  • SERVICEACCOUNT: il nome dell'account di servizio di Kubernetes.

Seleziona l'account di servizio in base all'UID:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/kubernetes.serviceaccount.uid/SERVICEACCOUNT_UID

Sostituisci quanto segue:

  • PROJECT_NUMBER: il numero numerico del progetto. Per ottenere il numero del progetto, consulta Identificazione dei progetti.
  • PROJECT_ID: l'ID del tuo progetto Google Cloud.
  • SERVICEACCOUNT_UID: l'UID dell'oggetto ServiceAccount nel server API.
Tutti i pod in uno spazio dei nomi, a prescindere dall'account di servizio o dal cluster
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/namespace/NAMESPACE

Sostituisci quanto segue:

  • PROJECT_NUMBER: il numero numerico del progetto. Per ottenere il numero del progetto, consulta Identificazione dei progetti.
  • PROJECT_ID: l'ID del tuo progetto Google Cloud.
  • NAMESPACE: lo spazio dei nomi Kubernetes.
Tutti i pod in un cluster specifico
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/kubernetes.cluster/https://container.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME

Sostituisci quanto segue:

  • PROJECT_NUMBER: il numero numerico del progetto. Per ottenere il numero del progetto, consulta Identificazione dei progetti.
  • PROJECT_ID: l'ID del tuo progetto Google Cloud.
  • CLUSTER_NAME: il nome del tuo cluster GKE.
  • LOCATION: la località del cluster.

Flusso di credenziali

Quando un carico di lavoro invia una richiesta di accesso a un'API Google Cloud, ad esempio quando si utilizza una libreria client di Google Cloud, si verificano i seguenti passaggi di autenticazione:

Il modo in cui un carico di lavoro ottiene un token dell'account di servizio IAM con Workload Identity.
Figura 1: in che modo un carico di lavoro riceve un token di identità federato con la federazione delle identità per i carichi di lavoro per GKE.
  1. Credenziali predefinite dell'applicazione (ADC) richiede un token di accesso Google Cloud dal server metadati di Compute Engine in esecuzione sulla VM.
  2. Il server di metadati GKE intercetta la richiesta di token e chiede al server API Kubernetes un token ServiceAccount di Kubernetes che identifica il carico di lavoro richiedente. La credenziale è un token web JSON (JWT) firmato dal server API.
  3. Il server di metadati GKE utilizza il servizio token di sicurezza per scambiare il JWT con un token di accesso Google Cloud federato di breve durata che fa riferimento all'identità del carico di lavoro Kubernetes.
  4. Il server metadati GKE fornisce il token di accesso federato al carico di lavoro.

Il carico di lavoro può quindi accedere a tutte le API Google Cloud a cui può accedere l'identificatore entità IAM del carico di lavoro.

Identicità dell'identità

Se i metadati nell'identificatore dell'entità sono uguali per i carichi di lavoro in più cluster che condividono un pool di identità per i carichi di lavoro perché appartengono allo stesso progetto Google Cloud, IAM identifica questi carichi di lavoro come uguali. Ad esempio, se hai lo stesso spazio dei nomi in due cluster e concedi l'accesso a questo spazio dei nomi in IAM, i carichi di lavoro nello spazio dei nomi in entrambi i cluster ottengono questo accesso. Puoi limitare l'accesso a cluster specifici utilizzando i criteri IAM condizionali.

Ad esempio, considera il seguente diagramma. I cluster A, B e C appartengono allo stesso pool di identità per i carichi di lavoro. Google Cloud identifica le applicazioni che utilizzano l'account di servizio back-ksa nello spazio dei nomi backend del cluster A e del cluster B come la stessa identità. IAM non fa distinzione tra i cluster che effettuano le chiamate.

Diagramma che illustra l'identicità delle identità all'interno di un pool di identità per i carichi di lavoro
Figura 2: identicità delle identità durante l'accesso alle API Google Cloud con la federazione delle identità per i carichi di lavoro per GKE.

Questa uguaglianza delle identità significa anche che devi poter considerare attendibile ogni cluster in uno specifico pool di identità per i carichi di lavoro. Ad esempio, se il Cluster C nell'esempio precedente era di proprietà di un team non attendibile, potrebbe creare uno spazio dei nomi backend e accedere alle API Google Cloud utilizzando l'account di servizio back-ksa, proprio come il cluster A e il cluster B.

Per evitare l'accesso non attendibile, posiziona i cluster in progetti separati per assicurarti che ricevano pool di identità per i carichi di lavoro diversi oppure assicurati che i nomi degli spazi dei nomi siano distinti tra loro per evitare un identificatore entità comune.

Informazioni sul server di metadati GKE

Ogni nodo in GKE con federazione delle identità per i carichi di lavoro per GKE abilitata archivia i propri metadati sul server di metadati GKE. Il server di metadati GKE è un sottoinsieme degli endpoint del server di metadati di Compute Engine necessari per i carichi di lavoro Kubernetes.

Il server di metadati GKE viene eseguito come un DaemonSet, con un pod su ogni nodo Linux o un servizio Windows nativo su ogni nodo Windows nel cluster. Il server di metadati intercetta le richieste HTTP verso http://metadata.google.internal (169.254.169.254:80). Ad esempio, la richiesta GET /computeMetadata/v1/instance/service-accounts/default/token recupera un token per l'account di servizio IAM che il pod è configurato per impersonare. Il traffico verso il server di metadati GKE non lascia mai l'istanza VM che ospita il pod.

Le seguenti tabelle descrivono il sottoinsieme di endpoint del server di metadati di Compute Engine disponibili con il server di metadati GKE. Per un elenco completo degli endpoint disponibili nel server metadati di Compute Engine, vedi Valori predefiniti dei metadati della VM.

Metadati dell'istanza

I metadati dell'istanza sono archiviati nella seguente directory.

http://metadata.google.internal/computeMetadata/v1/instance/

Voce Descrizione
hostname

Il nome host del tuo nodo.

id

L'ID univoco del tuo nodo.

service-accounts/

Una directory di account di servizio associati al nodo. Per ogni account di servizio sono disponibili le seguenti informazioni:

  • aliases
  • email: l'indirizzo email dell'account di servizio.
  • identity: un token JWT (JSON Web Token) univoco per il nodo. Devi includere il parametro audience nella richiesta. Ad esempio: ?audience=http://www.example.com.
  • scopes: gli ambiti di accesso assegnati all'account di servizio.
  • token: il token di accesso OAuth 2.0 per autenticare i tuoi carichi di lavoro.
zone

La zona Compute Engine del tuo nodo GKE.

Attributi istanza

Gli attributi dell'istanza sono archiviati nella seguente directory.

http://metadata.google.internal/computeMetadata/v1/instance/attributes/

Voce Descrizione
cluster-location

La zona o la regione Compute Engine del tuo cluster.

cluster-name

Il nome del tuo cluster GKE.

cluster-uid

L'UID del cluster GKE.

Metadati di progetto

I metadati di progetto del cluster sono archiviati nella seguente directory.

http://metadata.google.internal/computeMetadata/v1/project/

Voce Descrizione
project-id

L'ID del tuo progetto Google Cloud.

numeric-project-id

Il numero del tuo progetto Google Cloud.

Restrizioni della federazione delle identità per i carichi di lavoro per GKE

  • Non puoi modificare il nome del pool di identità per i carichi di lavoro creato da GKE per il tuo progetto Google Cloud.

  • Quando GKE abilita il server di metadati GKE su un pool di nodi, i pod non possono più accedere al server di metadati di Compute Engine. Il server di metadati GKE intercetta invece le richieste effettuate da questi pod agli endpoint dei metadati, ad eccezione dei pod in esecuzione sulla rete host.

  • Il server di metadati GKE impiega alcuni secondi per iniziare ad accettare le richieste su un pod appena creato. Di conseguenza, i tentativi di autenticazione mediante la federazione delle identità per i carichi di lavoro per GKE potrebbero non riuscire entro i primi secondi della vita di un pod. Per risolvere il problema, riprova a telefonare. Per ulteriori dettagli, consulta Risoluzione dei problemi.

  • Gli agenti di logging e monitoraggio integrati di GKE continuano a utilizzare l'account di servizio del nodo.

  • La federazione delle identità per i carichi di lavoro per GKE richiede la configurazione manuale di Knative serving per continuare a rilasciare metriche delle richieste.

  • La federazione delle identità per i carichi di lavoro per GKE imposta un limite di 200 connessioni al server metadati GKE per ciascun nodo, in modo da evitare problemi di memoria. Potresti riscontrare timeout se i nodi superano questo limite.

  • La federazione delle identità per i carichi di lavoro per GKE per nodi Windows Server è disponibile nelle versioni GKE 1.18.16-gke.1200, 1.19.8-gke.1300, 1.20.4-gke.1500 e successive.

  • Il server di metadati GKE utilizza le risorse di memoria in proporzione al numero totale di account di servizio Kubernetes nel cluster. Se il cluster ha più di 3000 account di servizio Kubernetes, il kubelet potrebbe terminare i pod del server di metadati. Per le mitigazioni, consulta Risoluzione dei problemi.

Alternative alla federazione delle identità per i carichi di lavoro per GKE

Puoi utilizzare una delle seguenti alternative alla federazione delle identità per i carichi di lavoro per GKE per accedere alle API Google Cloud da GKE. Ti consigliamo di utilizzare la federazione delle identità per i carichi di lavoro per GKE perché queste alternative richiedono determinate compromissioni per la sicurezza.

Passaggi successivi