Federazione delle identità per i workload

Questo documento fornisce una panoramica della federazione di Workload Identity. Utilizzando la federazione delle identità per i workload, puoi fornire ai workload on-premise o multi-cloud l'accesso alle risorse Google Cloud utilizzando identità federate anziché una chiave del account di servizio.

Puoi utilizzare la federazione delle identità per i carichi di lavoro con i carichi di lavoro eseguiti su Amazon Web Services (AWS) e Azure, su Active Directory on-premise, con servizi di deployment come GitHub e GitLab e con qualsiasi provider di identità (IdP) che supporti OpenID Connect (OIDC) o Security Assertion Markup Language (SAML) V2.0.

Perché la federazione delle identità per i workload?

Tradizionalmente, le applicazioni in esecuzione all'esterno di Google Cloud possono utilizzare le chiavi del service account per accedere alle risorse di Google Cloud . Tuttavia, le chiavi dei account di servizio sono credenziali potenti e possono rappresentare un rischio per la sicurezza se non vengono gestite correttamente. La federazione delle identità per i workload elimina il carico di manutenzione e sicurezza associato alle chiavi deiaccount di serviziot.

Con la federazione delle identità per i carichi di lavoro, puoi utilizzare Identity and Access Management (IAM) per concedere alle identità esterne ruoli IAM, accesso diretto alle risorse Google Cloud . Puoi anche concedere l'accesso tramite la simulazione dell'identità del account di servizio.

Pool di identità del workload

Un pool Workload Identity è un'entità che ti consente di gestire le identità esterne.

In generale, ti consigliamo di creare un nuovo pool per ogni ambiente nonGoogle Cloud che deve accedere alle risorse Google Cloud , ad esempio ambienti di sviluppo, staging o produzione.

Provider pool di identità del workload

Un provider di pool di identità del workload è un'entità che descrive una relazione tra Google Cloud e il tuo IdP, tra cui:

  • AWS
  • Microsoft Entra ID
  • GitHub
  • GitLab
  • Cluster Kubernetes
  • Okta
  • Active Directory Federation Services (AD FS) on-premise
  • Terraform

La federazione delle identità per i carichi di lavoro segue la specifica di scambio di token OAuth 2.0. Fornisci una credenziale dal tuo IdP al Security Token Service, che verifica l'identità sulla credenziale e poi restituisce un token federato in cambio.

Provider OIDC con JWK locali

Per federare i carichi di lavoro che non hanno un endpoint OIDC pubblico, puoi caricare i set di chiavi web JSON (JWKS) OIDC direttamente nel pool. Questo è comune se hai Terraform o GitHub Enterprise ospitati nel tuo ambiente o se hai requisiti normativi per non esporre URL pubblici. Per saperne di più, consulta Gestire le JWK OIDC (facoltativo).

Mappature degli attributi

I token emessi dal tuo IdP esterno contengono uno o più attributi. Alcuni IdP fanno riferimento a questi attributi come rivendicazioni.

I token del servizio token di sicurezza Google contengono anche uno o più attributi, come elencato nella tabella seguente:

Attributo Descrizione
google.subject Obbligatorio. Un identificatore univoco per l'utente. Questo attributo viene utilizzato nei binding dei ruoli IAM principal:// e viene visualizzato nei log di Cloud Logging. Il valore deve essere univoco e non può superare i 127 caratteri.
google.groups Facoltativo. Un insieme di gruppi a cui appartiene l'identità. Questo attributo viene utilizzato nei binding dei ruoli IAM principalSet:// per concedere l'accesso a tutti i membri di un gruppo.
attribute.NAME Facoltativo. Puoi definire fino a 50 attributi personalizzati e utilizzarli nelle associazioni di ruoli IAM principalSet:// per concedere l'accesso a tutte le identità con un determinato attributo.

Una mappatura degli attributi definisce come derivare il valore dell'attributo token del servizio token di sicurezza di Google da un token esterno. Per ogni attributo del token del servizio token di sicurezza Google, puoi definire una mappatura degli attributi, formattata nel seguente modo:

TARGET_ATTRIBUTE=SOURCE_EXPRESSION

Sostituisci quanto segue:

  • TARGET_ATTRIBUTE è un attributo del token del servizio token di sicurezza di Google
  • SOURCE_EXPRESSION è un'espressione Common Expression Language (CEL) che trasforma uno o più attributi dai token emessi dal tuo IdP esterno

Il seguente elenco fornisce esempi di mappatura degli attributi:

  • Assegna l'attributo di asserzione sub a google.subject:

    google.subject=assertion.sub
    
  • Concatenare più attributi di asserzione:

    google.subject="myprovider::" + assertion.aud + "::" + assertion.sub
    
  • Mappa un attributo di asserzione con valore GUID workload_id a un nome e assegna il risultato a un attributo personalizzato denominato attribute.my_display_name:

    attribute.my_display_name={
      "8bb39bdb-1cc5-4447-b7db-a19e920eb111": "Workload1",
      "55d36609-9bcf-48e0-a366-a3cf19027d2a": "Workload2"
    }[assertion.workload_id]
    
  • Utilizza operatori e funzioni logici CEL per impostare un attributo personalizzato denominato attribute.environment su prod o test, a seconda dell'Amazon Resource Name (ARN) dell'identità:

    attribute.environment=assertion.arn.contains(":instance-profile/Production") ? "prod" : "test"
    
  • Utilizza la funzione extract per compilare un attributo personalizzato aws_role con il nome del ruolo assunto o, se non è stato assunto alcun ruolo, con l'ARN dell'identità.

    attribute.aws_role=assertion.arn.contains('assumed-role') ? assertion.arn.extract('{account_arn}assumed-role/') + 'assumed-role/' + assertion.arn.extract('assumed-role/{role_name}/') : assertion.arn
    
  • La funzione split divide una stringa in base al valore del separatore fornito. Ad esempio, per estrarre l'attributo username da un attributo indirizzo email dividendo il relativo valore in corrispondenza di @ e utilizzando la prima stringa, utilizza il seguente mapping degli attributi:

    attribute.username=assertion.email.split("@")[0]
    

  • La funzione join unisce un elenco di stringhe in base al valore del separatore fornito. Ad esempio, per compilare l'attributo personalizzato department concatenando un elenco di stringhe con . come separatore, utilizza la seguente mappatura degli attributi:

    attribute.department=assertion.department.join(".")
    

Per AWS, Google fornisce mappature predefinite che coprono gli scenari più comuni. Puoi anche fornire mappature personalizzate.

Per i provider OIDC, fornisci i mapping. Per creare la mappatura, consulta la documentazione del provider per un elenco degli attributi delle credenziali.

Per maggiori dettagli, consulta la documentazione dell'API per il campo attributeMapping.

Condizioni attributi

Una condizione dell'attributo è un'espressione CEL che può controllare gli attributi dell'asserzione e gli attributi di destinazione. Se la condizione dell'attributo restituisce true per una determinata credenziale, la credenziale viene accettata. In caso contrario, le credenziali vengono rifiutate.

Puoi utilizzare una condizione dell'attributo per limitare le identità che possono autenticarsi utilizzando il tuo pool di identità per i carichi di lavoro.

Le condizioni degli attributi sono utili in scenari come i seguenti:

  • Se il tuo carico di lavoro utilizza un IdP disponibile al pubblico, puoi limitare l'accesso in modo che solo le identità che scegli abbiano accesso al tuo pool di identità dei carichi di lavoro.

  • Se utilizzi un IdP con più piattaforme cloud, puoi impedire che le credenziali destinate all'uso con un'altra piattaforma vengano utilizzate con Google Cloude viceversa. In questo modo si evita il problema del delegato confuso.

La condizione dell'attributo per un fornitore di pool di identità del workload può utilizzare la parola chiave assertion, che si riferisce a una mappa che rappresenta la credenziale di autenticazione emessa dall'IdP. Puoi utilizzare la notazione con il punto per accedere ai valori della mappa. Ad esempio, le credenziali AWS includono un valore arn, a cui puoi accedere come assertion.arn. Inoltre, la condizione dell'attributo può utilizzare qualsiasi attributo definito nella mappatura degli attributi del fornitore.

L'esempio seguente consente solo le richieste provenienti da identità con un ruolo AWS specifico:

attribute.aws_role == "ROLE_MAPPING"

Per maggiori dettagli, consulta la documentazione dell'API per il campo attributeCondition.

Gestione degli accessi

Il flusso di scambio di token restituisce un token di accesso federato. Puoi utilizzare questo token di accesso federato per concedere alla tua workload l'accesso per conto delle identità principal alle risorse Google Cloud e ottenere un token di accesso OAuth 2.0 di breve durata.

Puoi utilizzare questo token di accesso per fornire l'accesso IAM.

Ti consigliamo di utilizzare la federazione di Workload Identity per fornire l'accesso direttamente a una risorsa. Google Cloud Sebbene la maggior parte delle Google Cloud API supporti la federazione delle identità per i carichi di lavoro, alcune API presentano limitazioni. In alternativa, puoi utilizzare l'impersonificazione dell'account di servizio.

Il token di accesso di breve durata consente di chiamare qualsiasi API Google Cloud a cui la risorsa o l'account di servizio ha accesso.

Accesso diretto alle risorse

Puoi utilizzare l'accesso diretto alle risorse per concedere alla tua identità esterna l'accesso direttamente a una risorsa Google Cloud utilizzando ruoli specifici per la risorsa.

Alternativa: simulazione dell'identità del service account

In alternativa a fornire l'accesso diretto alle risorse, puoi utilizzare l'impersonificazione del service account.

Devi concedere al tuo account di servizio il ruolo Utente Workload Identity (roles/iam.workloadIdentityUser).

Ambiti principali e sicurezza

Concedi l'accesso alle entità o a sottoinsiemi di queste utilizzando i tipi di entità.

Tipi di entità

La tabella seguente descrive come definire i principal come singoli utenti e gruppi di identità:

Identità Formato dell'identificatore
Singola identità principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
Tutte le identità in un gruppo principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP_ID
Tutte le identità con un valore attributo specifico principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE

Passaggi successivi