Questo documento fornisce una panoramica della federazione delle identità per i carichi di lavoro esterni. Con la federazione delle identità, puoi concedere l'accesso ai 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), come 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 efficaci e possono rappresentare 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à per il 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 identità per carichi di lavoro
Un provider di pool di identità per carichi di lavoro è un'entità che descrive una relazione tra Google Cloud e il tuo IdP, inclusa quanto segue:
- AWS
- Azure Active Directory
- Active Directory Federation Services (ADFS) on-premise
- Okta
- Cluster Kubernetes
La federazione delle identità per i carichi di lavoro segue la specifica relativa allo scambio di token OAuth 2.0. Devi fornire una credenziale del tuo IdP al servizio token di sicurezza, che verifica l'identità della credenziale e, in cambio, restituisce un token federato.
Provider OIDC con JWK locali
Per federe i carichi di lavoro che non hanno un endpoint OIDC pubblico, puoi caricare OIDC JSON Web Key Set (JWKS) direttamente nel pool. Si tratta di un problema comune se Terraform o GitHub Enterprise è ospitato nel tuo ambiente o se soddisfi i requisiti normativi per non esporre gli URL pubblici. Per saperne di più, consulta Gestire le 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, elencati 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 principalSet:// IAM 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 nel seguente modo:
TARGET_ATTRIBUTE=SOURCE_EXPRESSION
Sostituisci quanto segue:
TARGET_ATTRIBUTE
è un attributo del token Google STSSOURCE_EXPRESSION
è un'espressione 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
agoogle.subject
:google.subject=assertion.sub
Concatena più attributi di asserzioni:
google.subject="myprovider::" + assertion.aud + "::" + assertion.sub
Mappa un attributo dell'asserzione con valore GUID
workload_id
a un nome e assegna il risultato a un attributo personalizzato denominatoattribute.my_display_name
:attribute.my_display_name={ "8bb39bdb-1cc5-4447-b7db-a19e920eb111": "Workload1", "55d36609-9bcf-48e0-a366-a3cf19027d2a": "Workload2" }[assertion.workload_id]
Usa le funzioni e gli operatori logici CEL per impostare un attributo personalizzato denominato
attribute.environment
suprod
otest
, 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 personalizzatoaws_role
con il nome del ruolo presunto 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
separa una stringa nel valore separatore fornito. Ad esempio, per estrarre l'attributousername
da un attributo di un indirizzo email dividendo il suo 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 nel valore separatore fornito. Ad esempio, per completare l'attributo personalizzatodepartment
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 mapping personalizzati.
Per i provider OIDC, devi fornire le mappature. Per creare il mapping, consulta la documentazione del provider per un elenco di attributi nelle sue credenziali.
Per maggiori dettagli, consulta la documentazione dell'API per il
campo attributeMapping
.
Condizioni degli attributi
Una condizione dell'attributo è un'espressione CEL che può controllare gli attributi delle asserzioni 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 eseguire l'autenticazione mediante il pool di identità per i carichi di lavoro.
Le condizioni degli attributi sono utili in scenari come i seguenti:
Se il 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à per i carichi di lavoro.
Se usi un provider di identità con più piattaforme cloud, puoi impedire l'utilizzo con Google Cloud di credenziali destinate all'utilizzo con un'altra piattaforma e viceversa. Ciò consente di evitare il problema del vicepresidente.
La condizione dell'attributo per un provider di pool di identità per i carichi di lavoro può utilizzare la parola chiave assertion
, che fa riferimento a una mappa che rappresenta la credenziali di autenticazione emessa 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 provenienti da identità che hanno un ruolo AWS specifico:
attribute.aws_role == "ROLE_MAPPING"
Per maggiori dettagli, consulta la documentazione dell'API per il
campo attributeCondition
.
Impersonificazione degli account di servizio
Il flusso di scambio di token restituisce un token di accesso federato. Puoi utilizzare questo token per impersonare 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 di identità per i carichi di lavoro 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/
|
Tutte le identità in un gruppo |
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/
|
Tutte le identità con un valore dell'attributo specifico |
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/
|
Passaggi successivi
Utilizza la federazione delle identità per accedere alle risorse di AWS, accedere alle risorse da Microsoft Azure, accedere alle risorse da un provider OIDC o accedere alle risorse da un provider SAML 2.0.
Scopri come gestire i pool di Workload Identity utilizzando Google Cloud CLI o l'API REST.