Federazione delle identità per i carichi di lavoro

Questo documento fornisce una panoramica della federazione delle identità per i carichi di lavoro esterni. Utilizzando la federazione delle identità, puoi concedere l'accesso a carichi di lavoro on-premise o multi-cloud alle risorse Google Cloud, senza utilizzare una chiave dell'account di servizio.

Puoi utilizzare la federazione delle identità con Amazon Web Services (AWS) o con qualsiasi provider di identità (IdP) che supporti OpenID Connect (OIDC), ad esempio Microsoft Azure o SAML 2.0.

Perché la federazione delle identità?

Tradizionalmente, le applicazioni in esecuzione al di fuori di Google Cloud possono utilizzare le chiavi degli account di servizio per accedere alle risorse Google Cloud. Tuttavia, le chiavi degli account di servizio sono credenziali avanzate e possono presentare un rischio per la sicurezza se non vengono gestite correttamente.

Con la federazione delle identità, puoi utilizzare Identity and Access Management (IAM) per concedere ruoli IAM a identità esterne, inclusa la possibilità di impersonare account di servizio. Questo approccio elimina il carico di manutenzione e sicurezza associato alle chiavi degli account di servizio.

Pool di Workload Identity

Un pool di identità del carico di lavoro è un'entità che consente di gestire le identità esterne.

In generale, consigliamo di creare un nuovo pool per ogni ambiente non Google Cloud che deve accedere a risorse Google Cloud come ambienti di sviluppo, gestione temporanea o produzione.

Provider di pool di Workload Identity

Un provider di pool di identità per carichi di lavoro è un'entità che descrive una relazione tra Google Cloud e il tuo IdP, che include quanto segue:

  • AWS
  • Azure Active Directory
  • Servizi di federazione Active Directory on-premise (AD FS)
  • Okta
  • Cluster Kubernetes

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

Fornitore OIDC con JWK locali

Per federare i carichi di lavoro che non hanno un endpoint OIDC pubblico, puoi caricare set di chiavi web JSON OIDC (JWKS) direttamente nel pool. Si tratta di un problema comune se hai Terraform o GitHub Enterprise ospitato nel tuo ambiente o se hai requisiti normativi che non consentono l'esposizione di URL pubblici. Per saperne di più, consulta Gestire i JWK OIDC (facoltativo)

Mappature degli attributi

I token emessi dal provider di identità esterno contengono uno o più attributi. Alcuni provider di identità fanno riferimento a questi attributi come rivendicazioni.

I token Google STS contengono anche uno o più attributi, come indicato nella seguente tabella:

Attributo Descrizione
google.subject Obbligatorio. Un identificatore univoco dell'utente. Questo attributo viene utilizzato nelle associazioni di 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 nelle associazioni di 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 ricavare il valore dell'attributo del token Google STS da un token esterno. Per ogni attributo del token Google STS puoi definire una mappatura degli attributi, con la seguente formattazione:

TARGET_ATTRIBUTE=SOURCE_EXPRESSION

Sostituisci quanto segue:

  • TARGET_ATTRIBUTE è un attributo del token Google STS
  • SOURCE_EXPRESSION è un'espressione in Common Expression Language (CEL) che trasforma uno o più attributi dei token emessi dal tuo provider di identità esterno

Il seguente elenco fornisce esempi di mappatura degli attributi:

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

    google.subject=assertion.sub
    
  • Concatena più attributi delle asserzioni:

    google.subject="myprovider::" + assertion.aud + "::" + assertion.sub
    
  • Mappa un attributo dell'asserzione workload_id con valore GUID 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 completare 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 suddivide una stringa sul valore separatore fornito. Ad esempio, per estrarre l'attributo username da un attributo di un indirizzo email suddividendone il valore in @ e utilizzando la prima stringa, utilizza la seguente mappatura degli attributi:

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

  • La funzione join unisce un elenco di stringhe sul valore separatore fornito. Ad esempio, per completare 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, devi fornire le mappature. Per creare la mappatura, consulta la documentazione del provider per un elenco di attributi nelle sue credenziali.

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

Condizioni degli attributi

Una condizione dell'attributo è un'espressione CEL in grado di verificare 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, la credenziale viene rifiutata.

Puoi utilizzare una condizione degli attributi per limitare le identità che possono autenticarsi utilizzando il pool di Workload Identity.

Le condizioni degli attributi sono utili in scenari quali:

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

  • Se utilizzi un provider di identità con più piattaforme cloud, puoi impedire che le credenziali destinate all'utilizzo con un'altra piattaforma vengano utilizzate con Google Cloud e viceversa. Ciò consente di evitare il problema confuso del vice.

La condizione dell'attributo per un provider di pool di identità di Workload Identity può utilizzare la parola chiave assertion, che fa riferimento a una mappa che rappresenta le credenziali di autenticazione emesse dal provider di identità. Puoi usare la notazione dei punti 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 provider.

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

attribute.aws_role == "ROLE_MAPPING"

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

Impersonificazione dell'account di servizio

Il flusso di scambio dei token restituisce un token di accesso federato. Puoi utilizzare questo token per rappresentare un account di servizio e ottenere un token di accesso OAuth 2.0 di breve durata. Il token di accesso di breve durata consente di chiamare qualsiasi API Google Cloud a cui ha accesso l'account di servizio.

Per impersonare un account di servizio, concedi alla tua identità esterna il ruolo Utente Workload Identity (roles/iam.workloadIdentityUser) in un account di servizio con i ruoli richiesti dal tuo carico di lavoro. Puoi concedere un ruolo a tutte le identità in un pool Workload Identity o a identità esterne specifiche in base ai loro attributi.

La tabella seguente descrive scenari comuni per la concessione dei ruoli:

Identità Formato 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 dell'attributo specifico principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE

Passaggi successivi