Questa guida descrive come utilizzare la federazione Workload Identity per consentire ai carichi di lavoro AWS e Azure di autenticarsi in Google Cloud senza una chiave dell'account di servizio.
Con la federazione delle identità per i carichi di lavoro, i carichi di lavoro eseguiti su AWS EC2 e Azure possono scambiare le proprie credenziali specifiche dell'ambiente con token di Security Token Service di Google Cloud di breve durata.
Le credenziali specifiche dell'ambiente includono:
- Le istanze AWS EC2 possono utilizzare i profili istanza per richiedere credenziali temporanee.
- Le VM Azure possono utilizzare le identità gestite per ottenere token di accesso Azure.
Con la configurazione della federazione delle identità per i carichi di lavoro, puoi consentire a questi carichi di lavoro di scambiare queste credenziali specifiche dell'ambiente con credenziali Google Cloud di breve durata. I workload possono utilizzare queste credenziali di breve durata per accedere alle API Google Cloud.
Prima di iniziare
Configurare l'autenticazione.
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Python
Per utilizzare gli Python esempi in questa pagina in un ambiente di sviluppo locale, installa e inizializza l'interfaccia alla gcloud CLI, quindi configura le Credenziali predefinite dell'applicazione con le tue credenziali utente.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale nella documentazione sull'autenticazione di Google Cloud.
Prepara il tuo provider di identità esterno
Devi eseguire questa procedura una sola volta per ogni tenant Microsoft Entra ID o account AWS.
AWS
Non è necessario apportare modifiche alla configurazione nel tuo account AWS.
Dopo aver configurato un pool di identità per i workload in modo che attenda il tuo account AWS, puoi consentire agli utenti AWS e ai ruoli AWS di utilizzare credenziali di sicurezza AWS permanenti o temporanee per ottenere credenziali Google Cloud di breve durata.
Azure
Devi creare una nuova applicazione Microsoft Entra ID nel tuo tenant di Microsoft Entra ID e configurarla in modo che possa essere utilizzata per la federazione delle identità di carico di lavoro.
Dopo aver configurato un pool di identità del carico di lavoro per considerare attendibile l'applicazione, gli utenti di Azure e gli identity provider di servizio possono richiedere token di accesso per questa applicazione e scambiarli con credenziali Google Cloud di breve durata.
Per creare l'applicazione:
Crea un'entità di servizio e un'applicazione Microsoft Entra ID.
Imposta un URI ID applicazione per l'applicazione. Puoi utilizzare l'URI dell'ID applicazione predefinito (
APPID
) o specificare un URI personalizzato.L'URI dell'ID applicazione ti servirà in un secondo momento quando configurerai il provider del pool di identità per i carichi di lavoro.
Per consentire a un'applicazione di ottenere token di accesso per l'applicazione Microsoft Entra ID, puoi utilizzare le identità gestite:
Crea un'identità gestita. Prendi nota dell'ID oggetto dell'identità gestita. Ti servirà in un secondo momento per configurare la simulazione di identità.
Assegna l'identità gestita a una macchina virtuale o a un'altra risorsa che esegue la tua applicazione.
Configurare la federazione delle identità per i carichi di lavoro
Devi eseguire questi passaggi una sola volta per account AWS o tenant Microsoft Entra ID. Puoi quindi utilizzare lo stesso provider e lo stesso pool di identità di carico di lavoro per più carichi di lavoro e in più progetti Google Cloud.
Per iniziare a configurare la federazione delle identità per i carichi di lavoro, segui questi passaggi:
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
È preferibile
utilizzare un progetto dedicato per gestire i pool di identità del workload e i provider.
-
Make sure that billing is enabled for your Google Cloud project.
Enable the IAM, Resource Manager, Service Account Credentials, and Security Token Service APIs.
Definire una mappatura degli attributi e una condizione
Le credenziali specifiche dell'ambiente del tuo carico di lavoro AWS o Azure contengono più attributi e devi decidere quale utilizzare come identificatore soggetto (
google.subject
) in Google Cloud.Google Cloud utilizza l'identificatore dell'oggetto in Cloud Audit Logs e negli identificatori principali per identificare in modo univoco un ruolo o un utente AWS o Azure.
Se vuoi, puoi mappare altri attributi. Puoi quindi fare riferimento a questi attributi aggiuntivi quando concedi l'accesso alle risorse.
AWS
La mappatura degli attributi può utilizzare i campi di risposta per
GetCallerIdentity
come attributi di origine. Questi campi includono:account
: il numero dell'account AWS.arn
: l'ARN AWS dell'entità esterna.userid
: l'identificatore univoco dell'entità chiamante.
Se la tua applicazione viene eseguita su un'istanza Amazon Elastic Compute Cloud (EC2) con un ruolo collegato, puoi utilizzare la seguente mappatura degli attributi:
google.subject=assertion.arn attribute.account=assertion.account attribute.aws_role=assertion.arn.extract('assumed-role/{role}/') attribute.aws_ec2_instance=assertion.arn.extract('assumed-role/{role_and_session}').extract('/{session}')
La mappatura esegue le seguenti operazioni:
- Utilizza l'ARN come identificatore dell'oggetto, ad esempio:
"arn:aws:sts::000000000000:assumed-role/ec2-my-role/i-00000000000000000
- Introduce un attributo personalizzato
account
e gli assegna l'ID account AWS - Introduce un attributo personalizzato
aws_role
e gli assegna il nome del ruolo AWS, ad esempio:ec2-my-role
- Introduce un attributo personalizzato
aws_ec2_instance
e gli assegna l'ID istanza EC2, ad esempio:i-00000000000000000
Utilizzando questa mappatura, puoi concedere l'accesso a:
Un'istanza EC2 specifica:
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_ec2_instance/EC2_INSTANCE_ID
Tutti gli utenti e le istanze di un ruolo:
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.aws_role/ROLE_NAME
Azure
Le mappature degli attributi possono utilizzare i claim incorporati nei token di accesso di Azure, inclusi i claim personalizzati, come attributi di origine. Nella maggior parte dei casi, è meglio utilizzare la rivendicazione
sub
come identificatore dell'oggetto:google.subject=assertion.sub
Per un token di accesso emesso a un'identità gestita, la rivendicazione
sub
contiene l'ID oggetto dell'identità gestita. Se utilizzi un reclamo diverso, assicurati che sia univoco e che non possa essere riassegnato.Se hai dubbi sull'elenco delle rivendicazioni a cui puoi fare riferimento, svolgi i seguenti passaggi:
Connettiti a una VM Azure con un'identità gestita assegnata.
Ottieni un token di accesso dall'Azure Instance Metadata Service (IMDS):
Bash
curl \ "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \ -H "Metadata: true" | jq -r .access_token
Questo comando utilizza lo strumento
jq
.jq
è disponibile per impostazione predefinita in Cloud Shell.PowerShell
$SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt" $SubjectToken = (Invoke-RestMethod ` -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" ` -Headers @{Metadata="true"}).access_token Write-Host $SubjectToken
Sostituisci
APP_ID_URI
con l'URI dell'ID applicazione dell'applicazione che hai configurato per la federazione delle identità per i carichi di lavoro.In un browser web, vai alla pagina
https://jwt.ms/
e incolla il token di accesso nel campo.Fai clic su Claim per visualizzare l'elenco dei claim incorporati nel token di accesso.
In genere, per le identità di servizio non è necessario creare una mappatura per
google.groups
o per gli attributi personalizzati.(Facoltativo) Definisci una condizione dell'attributo. Le condizioni degli attributi sono espressioni CEL che possono controllare gli attributi di asserzione e gli attributi target. Se la condizione dell'attributo ha valore
true
per una determinata credenziale, la credenziale viene accettata. In caso contrario, le credenziali vengono rifiutate.AWS
Puoi utilizzare una condizione dell'attributo per limitare gli utenti e i ruoli IAM che possono utilizzare la federazione Workload Identity per ottenere token Google Cloud di breve durata.
Ad esempio, la seguente condizione limita l'accesso ai ruoli AWS e non consente altri identificatori IAM:
assertion.arn.startsWith('arn:aws:sts::AWS_ACCOUNT_ID:assumed-role/')
Azure
Puoi utilizzare una condizione dell'attributo per limitare gli utenti e i principali di servizio che possono utilizzare la federazione delle identità del carico di lavoro per ottenere token Google Cloud di breve durata. In alternativa, puoi configurare l'applicazione Microsoft Entra ID per utilizzare le assegnazioni dei ruoli dell'app.
Crea il provider e il pool di identità del workload
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per configurare la federazione di Workload Identity, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
-
Amministratore di pool di identità di lavoro (
roles/iam.workloadIdentityPoolAdmin
) -
Amministratore account di servizio (
roles/iam.serviceAccountAdmin
)
Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
In alternativa, il ruolo di base Proprietario IAM (roles/owner
) include anche le autorizzazioni per configurare la federazione delle identità. Non dovresti concedere ruoli di base in un ambiente di produzione, ma puoi farlo in un ambiente di sviluppo o di test.Ora hai raccolto tutte le informazioni necessarie per creare un fornitore e un pool di identità del workload:
Console
Nella console Google Cloud, vai alla pagina Nuovo provider e pool di carichi di lavoro.
Nella sezione Crea un pool di identità, inserisci quanto segue:
- Nome: il nome del pool. Il nome viene utilizzato anche come ID pool. Non potrai modificare l'ID pool in un secondo momento.
- Descrizione: il testo che descrive lo scopo del pool.
Fai clic su Continua.
Configura le impostazioni del provider:
AWS
Configura le seguenti impostazioni del provider:
- Seleziona un provider: AWS.
- Nome provider: il nome del provider. Il nome viene utilizzato anche come ID provider. Non potrai modificare l'ID fornitore in un secondo momento.
Azure
Configura le seguenti impostazioni del provider:
- Seleziona un provider: OpenID Connect (OIDC).
- Nome del provider: il nome del provider. Il nome viene utilizzato anche come ID provider. Non potrai modificare l'ID fornitore in un secondo momento.
- URL emittente:
https://sts.windows.net/TENANT_ID
. SostituisciTENANT_ID
con l'ID tenant (GUID) del tuo tenant Microsoft Entra ID. - Segmenti di pubblico consentiti: URI ID applicazione che hai utilizzato quando hai registrato l'applicazione in Microsoft Entra ID.
Fai clic su Continua.
Nella sezione Configura gli attributi del provider, aggiungi le mappature degli attributi che hai identificato in precedenza.
Nella sezione Condizioni degli attributi, inserisci la condizione dell'attributo che hai identificato in precedenza. Lascia vuoto il campo se non hai una condizione dell'attributo.
Fai clic su Salva per creare il pool di identità e il provider del workload.
gcloud
Crea un nuovo pool di identità del workload:
gcloud iam workload-identity-pools create POOL_ID \ --location="global" \ --description="DESCRIPTION" \ --display-name="DISPLAY_NAME"
Sostituisci quanto segue:
POOL_ID
: l'ID univoco del pool.DISPLAY_NAME
: il nome del pool.DESCRIPTION
: la descrizione del pool. Questa descrizione viene visualizzata quando si concede l'accesso alle identità dei pool.
Aggiungi un provider del pool di identità del workload:
AWS
Per creare il provider del pool di identità del workload per AWS, esegui il seguente comando:
gcloud iam workload-identity-pools providers create-aws PROVIDER_ID \ --location="global" \ --workload-identity-pool="POOL_ID" \ --account-id="ACCOUNT_ID" \ --attribute-mapping="MAPPINGS" \ --attribute-condition="CONDITIONS"
Sostituisci quanto segue:
PROVIDER_ID
: l'ID univoco del fornitore.POOL_ID
: l'ID del pool.ACCOUNT_ID
: il numero di 12 cifre che identifica il tuo account AWS.MAPPINGS
: elenco separato da virgola delle mappature degli attributi che hai identificato in precedenza.CONDITIONS
: condizione dell'attributo identificata in precedenza. Rimuovi il parametro se non hai una condizione dell'attributo.
Esempio:
gcloud iam workload-identity-pools providers create-aws example-provider \ --location="global" \ --workload-identity-pool="pool-1" \ --account-id="123456789000" \ --attribute-mapping="google.subject=assertion.arn"
Azure
Per creare il provider del pool di identità del carico di lavoro per Azure, esegui il seguente comando:
gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID \ --location="global" \ --workload-identity-pool="POOL_ID" \ --issuer-uri="ISSUER_URI" \ --allowed-audiences="APPLICATION_ID_URI" \ --attribute-mapping="MAPPINGS" \ --attribute-condition="CONDITIONS"
Sostituisci quanto segue:
PROVIDER_ID
: l'ID univoco del fornitore.POOL_ID
: l'ID del pool.ISSUER_URI
: l'ID tenant (GUID) del tuo tenant Microsoft Entra ID, a volte formattato comehttps://sts.windows.net/TENANT_ID
. L'URI dell'emittente può variare e, per trovarlo, puoi eseguire il debug del JWT utilizzando JWT.io.APPLICATION_ID_URI
: URI ID applicazione che hai utilizzato quando hai registrato l'applicazione in Microsoft Entra ID.MAPPINGS
: l'elenco separato da virgole delle mappature degli attributi che hai identificato in precedenza.CONDITIONS
: (facoltativo) la condizione dell'attributo che hai identificato in precedenza.
Esempio:
gcloud iam workload-identity-pools providers create-oidc example-provider \ --location="global" \ --workload-identity-pool="pool-1" \ --issuer-uri="https://sts.windows.net/00000000-1111-2222-3333-444444444444" \ --allowed-audiences="api://my-app" \ --attribute-mapping="google.subject=assertion.sub,google.groups=assertion.groups"
Autentica un carico di lavoro
Devi eseguire questi passaggi una volta per carico di lavoro.
Consenti al tuo carico di lavoro esterno di accedere alle risorse Google Cloud
Per fornire al tuo carico di lavoro l'accesso alle risorse Google Cloud, consigliamo di concedere l'accesso diretto alle risorse al principale. In questo caso, l'entità è l'utente federato. Alcuni prodotti Google Cloud presentano limitazioni dell'API Google Cloud. Se il tuo carico di lavoro chiama un endpoint API con una limitazione, puoi utilizzare la simulazione dell'identità dell'account di servizio. In questo caso, l'entità è l'account di servizio Google Cloud, che funge da identità. Concedi l'accesso all'account di servizio nella risorsa.
Accesso diretto alle risorse
Puoi concedere l'accesso a un'identità federata direttamente sulle risorse utilizzando la console Google Cloud o gcloud CLI.
Console
Per utilizzare la console Google Cloud per concedere i ruoli IAM direttamente su una risorsa, devi andare alla pagina della risorsa e concedere il ruolo. L'esempio seguente mostra come andare alla pagina Cloud Storage e concedere il ruolo Visualizzatore oggetti Storage (
roles/storage.objectViewer
) a un'identità federata direttamente in un bucket Cloud Storage.- Nella console Google Cloud, vai alla pagina Bucket in Cloud Storage.
Nell'elenco dei bucket, fai clic sul nome del bucket per cui vuoi concedere il ruolo.
Seleziona la scheda Autorizzazioni nella parte superiore della pagina.
Fai clic sul pulsante add_box Concedi accesso.
Viene visualizzata la finestra di dialogo Aggiungi entità.
Nel campo Nuove entità, inserisci una o più identità che devono accedere al tuo bucket.
Per argomento
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
Sostituisci quanto segue:
PROJECT_NUMBER
: il numero del progettoPOOL_ID
: l'ID del pool di workloadSUBJECT
: il soggetto singolo mappato dal tuo provider di identità, ad esempioadministrator@example.com
Per gruppo
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
Sostituisci quanto segue:
PROJECT_NUMBER
: il numero del progettoWORKLOAD_POOL_ID
: l'ID del pool di workloadGROUP
: il gruppo mappato dall'IdP, ad esempio:administrator-group@example.com
Per attributo
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
Sostituisci quanto segue:
PROJECT_NUMBER
: il numero del progettoWORKLOAD_POOL_ID
: l'ID del pool di workloadATTRIBUTE_NAME
: uno degli attributi mappati dal tuo provider di identitàATTRIBUTE_VALUE
: il valore dell'attributo
Seleziona un ruolo o più ruoli dal menu a discesa Seleziona un ruolo. I ruoli selezionati vengono visualizzati nel riquadro con una breve descrizione delle autorizzazioni concesse.
Fai clic su Salva.
gcloud
Per utilizzare gcloud CLI per concedere i ruoli IAM a una risorsa in un progetto, segui questi passaggi:
Ottieni il numero del progetto in cui è definita la risorsa.
gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
Concedi l'accesso alla risorsa.
Per utilizzare gcloud CLI per concedere il ruolo Visualizzatore oggetti Storage (
roles/storage.objectViewer
) a identità esterne che soddisfano determinati criteri, esegui il seguente comando.Per argomento
gcloud storage buckets add-iam-policy-binding BUCKET_ID \ --role=roles/storage.objectViewer \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"
Per gruppo
gcloud storage buckets add-iam-policy-binding BUCKET_ID \ --role=roles/storage.objectViewer \ --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"
Per attributo
gcloud storage buckets add-iam-policy-binding BUCKET_ID \ --role=roles/storage.objectViewer \ --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"
Sostituisci quanto segue:
BUCKET_ID
: il bucket a cui concedere l'accessoPROJECT_NUMBER
: il numero di progetto del progetto che contiene il pool di identità del workloadPOOL_ID
: l'ID del pool di identità del workloadSUBJECT
: il valore previsto per l'attributo che hai mappato agoogle.subject
GROUP
: il valore previsto per l'attributo che hai mappato agoogle.groups
ATTRIBUTE_NAME
: il nome di un attributo personalizzato nella mappatura degli attributiATTRIBUTE_VALUE
: il valore dell'attributo personalizzato nella mappatura degli attributi
Puoi concedere ruoli a qualsiasi risorsa Google Cloud che supporta i criteri di autorizzazione IAM.
Rappresentazione dell'identità dell'account di servizio
Per creare un account di servizio per il carico di lavoro esterno:
Enable the IAM, Security Token Service, and Service Account Credentials APIs.
Crea un account di servizio che rappresenti il carico di lavoro. Ti consigliamo di utilizzare un account di servizio dedicato per ogni carico di lavoro. L'account di servizio non deve necessariamente trovarsi nello stesso progetto del pool di identità del carico di lavoro, ma devi fare riferimento al progetto che contiene l'account di servizio.
Concedi all'account di servizio l'accesso alle risorse a cui vuoi che accedano le identità esterne.
Concedi il ruolo Utente Workload Identity (
roles/iam.workloadIdentityUser
) all'account di servizio.
Per concedere l'accesso a un'identità federata utilizzando la simulazione dell'identità degli account di servizio tramite la console Google Cloud o gcloud CLI:
Console
Per utilizzare la console Google Cloud per concedere ruoli IAM a un'identità federata con account di servizio, segui questi passaggi:
Account di servizio nello stesso progetto
Per concedere l'accesso utilizzando la simulazione dell'identità dell'account di servizio per un account di servizio nello stesso progetto:
Vai alla pagina Pool Workload Identity.
Seleziona Concedi accesso.
Nella finestra di dialogo Concedi l'accesso all'account di servizio, seleziona Concedi l'accesso utilizzando la simulazione dell'identità degli account di servizio.
Nell'elenco Account di servizio, seleziona l'account di servizio per le identità esterne da rubare e svolgi i seguenti passaggi:
Per scegliere quali identità nel pool possono rubare l'identità dell'account di servizio, esegui una delle seguenti azioni:
Per consentire solo a identità specifiche del pool di identità del workload di simulare l'identità dell'account di servizio, seleziona Solo le identità corrispondenti al filtro.
Nell'elenco Nome attributo, seleziona l'attributo su cui vuoi applicare il filtro.
Nel campo Valore attributo, inserisci il valore previsto dell'attributo. Ad esempio, se utilizzi una mappatura degli attributi
google.subject=assertion.sub
, imposta il nome Attributo susubject
e Valore attributo sul valore del claimsub
nei token emessi dal tuo provider di identità esterno.
Per salvare la configurazione, fai clic su Salva e poi su Ignora.
Account di servizio in un altro progetto
Per concedere l'accesso utilizzando la rappresentazione dell'account di servizio per un account di servizio in un progetto diverso:
Vai alla pagina Service Accounts.
Seleziona l'account di servizio di cui vuoi assumere il ruolo.
Fai clic su Gestisci accesso.
Fai clic su Aggiungi entità.
Nel campo Nuova entità, inserisci uno dei seguenti identificatori principali per le identità nel pool che simuleranno l'account di servizio.
Per argomento
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
Sostituisci quanto segue:
PROJECT_NUMBER
: il numero del progettoPOOL_ID
: l'ID del pool di workloadSUBJECT
: il soggetto singolo mappato dal tuo provider di identità, ad esempioadministrator@example.com
Per gruppo
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
Sostituisci quanto segue:
PROJECT_NUMBER
: il numero del progettoWORKLOAD_POOL_ID
: l'ID del pool di workloadGROUP
: il gruppo mappato dall'IdP, ad esempio:administrator-group@example.com
Per attributo
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
Sostituisci quanto segue:
PROJECT_NUMBER
: il numero del progettoWORKLOAD_POOL_ID
: l'ID del pool di workloadATTRIBUTE_NAME
: uno degli attributi mappati dal tuo provider di identitàATTRIBUTE_VALUE
: il valore dell'attributo
Per piscina
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
Sostituisci quanto segue:
PROJECT_NUMBER
: il numero del progettoWORKLOAD_POOL_ID
: l'ID del pool di workload
In Seleziona un ruolo, seleziona il ruolo Workload Identity User (
roles/iam.workloadIdentityUser
).Per salvare la configurazione, fai clic su Salva.
gcloud
Per utilizzare gcloud CLI per concedere il ruolo Utente Workload Identity (
roles/iam.workloadIdentityUser
) alle identità esterne che soddisfano determinati criteri, esegui il seguente comando.Per argomento
gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \ --role=roles/iam.workloadIdentityUser \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT"
Per gruppo
gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \ --role=roles/iam.workloadIdentityUser \ --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP"
Per attributo
gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \ --role=roles/iam.workloadIdentityUser \ --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE"
Sostituisci quanto segue:
SERVICE_ACCOUNT_EMAIL
: l'indirizzo email dell'account per il servizioPROJECT_NUMBER
: il numero di progetto del progetto che contiene il pool di identità del workloadPOOL_ID
: l'ID del pool di identità del workloadSUBJECT
: il valore previsto per l'attributo che hai mappato agoogle.subject
GROUP
: il valore previsto per l'attributo che hai mappato agoogle.groups
ATTRIBUTE_NAME
: il nome di un attributo personalizzato nella mappatura degli attributiATTRIBUTE_VALUE
: il valore dell'attributo personalizzato nella mappatura degli attributi
Scaricare o creare una configurazione delle credenziali
Le librerie client di Cloud, la gcloud CLI e Terraform possono ottenere automaticamente le credenziali esterne e utilizzarle per rubare l'identità di un account di servizio. Per consentire alle librerie e agli strumenti di completare questa procedura, devi fornire un file di configurazione delle credenziali. Questo file definisce quanto segue:
- Da dove ottenere le credenziali esterne
- Quale provider e pool di identità per i carichi di lavoro utilizzare
- Quale account di servizio rappresentare
Per creare un file di configurazione delle credenziali:
Console
Per scaricare un file di configurazione delle credenziali nella console Google Cloud:
Nella console Google Cloud, vai alla pagina Pool di identità di carico di lavoro.
Individua il pool di identità di lavoro per l'IdP che vuoi utilizzare e fai clic su di esso.
Se hai scelto di utilizzare l'accesso diretto alle risorse, procedi nel seguente modo:
Fai clic su Concedi accesso.
Seleziona Concedi l'accesso usando identità federate (consigliato).
Fai clic su Scarica.
Segui le istruzioni nella finestra di dialogo Configura l'applicazione più avanti in questa procedura.
Se hai scelto di utilizzare l'impersonificazione dell'account di servizio, svolgi i seguenti passaggi:
Seleziona Account di servizio collegati.
Individua il account di servizio che vuoi utilizzare e fai clic su
Scarica.Segui le istruzioni nella finestra di dialogo Configura l'applicazione più avanti in questa procedura.
Nella finestra di dialogo Configura l'applicazione, seleziona il provider che contiene le identità esterne.
Specifica le seguenti impostazioni aggiuntive:
AWS
Non sono necessarie impostazioni aggiuntive.
Azure
URL ID applicazione: URI dell'ID applicazione dell'applicazione Azure
Seleziona
Scarica configurazione per scaricare il file di configurazione delle credenziali, quindi fai clic su Ignora.
gcloud
Per creare un file di configurazione delle credenziali utilizzando
gcloud iam workload-identity-pools create-cred-config
, segui questi passaggi:AWS
Per creare un file di configurazione delle credenziali che consenta alla libreria di ottenere un token di accesso dai metadati dell'istanza EC2:
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \ --service-account=SERVICE_ACCOUNT_EMAIL \ --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \ --aws \ --output-file=FILEPATH.json
Sostituisci quanto segue:
PROJECT_NUMBER
: il numero del progetto che contiene il pool di identità del workloadPOOL_ID
: l'ID del pool di identità del workload.PROVIDER_ID
: l'ID del fornitore del pool di identità del workload.SERVICE_ACCOUNT_EMAIL
: se utilizzi la simulazione dell'identità del service account, sostituisci con l'indirizzo email del account di servizio. Ometti questo flag se non utilizzi la simulazione dell'identità dell'account di servizio.SERVICE_ACCOUNT_TOKEN_LIFETIME
: se utilizzi la simulazione dell'identità dell'account di servizio, sostituisci con la durata del token di accesso dell'account di servizio in secondi. Per impostazione predefinita, se non viene fornito, è pari a un'ora. Ometti questo flag se non utilizzi la simulazione dell'identità dell'account di servizio. Per specificare una durata superiore a un'ora, devi configurare il vincolo dei criteri dell'organizzazioneconstraints/iam.allowServiceAccountCredentialLifetimeExtension
.FILEPATH
: il file in cui salvare la configurazione.
Se utilizzi AWS IMDSv2, è necessario aggiungere un altro flag
--enable-imdsv2
al comandogcloud iam workload-identity-pools create-cred-config
:gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \ --service-account=SERVICE_ACCOUNT_EMAIL \ --aws \ --enable-imdsv2 \ --output-file=FILEPATH.json
Se non puoi utilizzare il server di metadati AWS, puoi fornire le credenziali di sicurezza AWS tramite le seguenti variabili di ambiente AWS:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_REGION
oAWS_DEFAULT_REGION
- (Facoltativo)
AWS_SESSION_TOKEN
La gcloud CLI e le librerie utilizzano queste variabili di ambiente AWS quando il server di metadati AWS non è disponibile.
Azure
Crea un file di configurazione delle credenziali che consenta alla libreria di ottenere un token di accesso dal servizio di metadati delle istanze Azure (IMDS):
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID \ --service-account=SERVICE_ACCOUNT_EMAIL \ --service-account-token-lifetime-seconds=SERVICE_ACCOUNT_TOKEN_LIFETIME \ --azure \ --app-id-uri APPLICATION_ID_URI \ --output-file=FILEPATH.json
Sostituisci quanto segue:
PROJECT_NUMBER
: il numero del progetto che contiene il pool di identità del workload.POOL_ID
: l'ID del pool di identità del workload.PROVIDER_ID
: l'ID del fornitore del pool di identità del workload.SERVICE_ACCOUNT_EMAIL
: se utilizzi la simulazione dell'identità del service account, sostituisci con l'indirizzo email del account di servizio. Ometti questo flag se non utilizzi la simulazione dell'identità dell'account di servizio.APPLICATION_ID_URI
: l'URI ID applicazione dell'applicazione Azure.SERVICE_ACCOUNT_TOKEN_LIFETIME
: se utilizzi la rappresentazione dell'account di servizio, la durata del token di accesso dell'account di servizio in secondi. Per impostazione predefinita, se non viene fornito, è pari a un'ora. Ometti questo flag se non utilizzi l'impersonificazione dell'account di servizio. Per specificare una durata superiore a un'ora, devi configurare il vincolo del criterio dell'organizzazioneconstraints/iam.allowServiceAccountCredentialLifetimeExtension
.FILEPATH
: il file in cui salvare la configurazione.
Utilizzare la configurazione delle credenziali per accedere a Google Cloud
Per consentire agli strumenti e alle librerie client di utilizzare la configurazione delle credenziali, svolgi quanto segue nel tuo ambiente AWS o Azure:
Inizializza una variabile di ambiente
GOOGLE_APPLICATION_CREDENTIALS
e indirizzala al file di configurazione delle credenziali:Bash
doveexport GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
FILEPATH
è il percorso relativo al file di configurazione delle credenziali.PowerShell
dove$env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
FILEPATH
è il percorso relativo al file di configurazione delle credenziali.Utilizza una libreria client o uno strumento che supporta la federazione delle identità per i carichi di lavoro e può trovare automaticamente le credenziali:
C++
Le librerie client di Google Cloud per C++ supportano la federazione delle identità per i carichi di lavoro dalla versione v2.6.0. Per utilizzare la federazione delle identità per i carichi di lavoro, devi compilare le librerie client con la versione 1.36.0 o successive di gRPC.
Vai
Le librerie client per Go supportano la federazione delle identità del carico di lavoro se utilizzano la versione v0.0.0-20210218202405-ba52d332ba99 o successive del modulo
golang.org/x/oauth2
.Per controllare quale versione di questo modulo utilizza la tua libreria client, esegui i seguenti comandi:
cd $GOPATH/src/cloud.google.com/go go list -m golang.org/x/oauth2
Java
Le librerie client per Java supportano la federazione di Workload Identity se utilizzano la versione 0.24.0 o successive dell'elemento
com.google.auth:google-auth-library-oauth2-http
.Per controllare la versione di questo elemento utilizzato dalla libreria client, esegui il seguente comando Maven nella directory dell'applicazione:
mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
Node.js
Le librerie client per Node.js supportano la federazione delle identità del carico di lavoro se utilizzano la versione 7.0.2 o successive del pacchetto
google-auth-library
.Per controllare quale versione di questo pacchetto utilizza la tua libreria client, esegui il seguente comando nella directory dell'applicazione:
npm list google-auth-library
Quando crei un oggetto
GoogleAuth
, puoi specificare un ID progetto oppure puoi consentire aGoogleAuth
di trovarlo automaticamente. Per trovare automaticamente l'ID progetto, l'account di servizio nel file di configurazione deve disporre del ruolo Browser (roles/browser
) o di un ruolo con autorizzazioni equivalenti nel progetto. Per maggiori dettagli, consulta ilREADME
per il pacchettogoogle-auth-library
.Python
Le librerie client per Python supportano la federazione di Workload Identity se utilizzano la versione 1.27.0 o successive del pacchetto
google-auth
.Per controllare quale versione di questo pacchetto utilizza la tua libreria client, esegui il seguente comando nell'ambiente in cui è installato il pacchetto:
pip show google-auth
Per specificare un ID progetto per il client di autenticazione, puoi impostare la variabile di ambiente
GOOGLE_CLOUD_PROJECT
o consentire al client di trovare automaticamente l'ID progetto. Per trovare automaticamente l'ID progetto, il service account nel file di configurazione deve disporre del ruolo Browser (roles/browser
) o di un ruolo con autorizzazioni equivalenti nel progetto. Per maggiori dettagli, consulta la guida dell'utente per il pacchettogoogle-auth
.gcloud
Per eseguire l'autenticazione utilizzando la federazione delle identità per i carichi di lavoro, utilizza il comando
gcloud auth login
:gcloud auth login --cred-file=FILEPATH.json
Sostituisci
FILEPATH
con il percorso del file di configurazione delle credenziali.Il supporto della federazione delle identità per i workload in gcloud CLI è disponibile nella versione 363.0.0 e successive di gcloud CLI.
Terraform
Il provider Google Cloud supporta la federazione delle identità di carico di lavoro se utilizzi la versione 3.61.0 o successive:
terraform { required_providers { google = { source = "hashicorp/google" version = "~> 3.61.0" } } }
bq
Per eseguire l'autenticazione utilizzando la federazione di Workload Identity, utilizza il comando
gcloud auth login
, come segue:gcloud auth login --cred-file=FILEPATH.json
Sostituisci
FILEPATH
con il percorso del file di configurazione delle credenziali.Il supporto della federazione delle identità per i carichi di lavoro in bq è disponibile nella versione 390.0.0 e successive della CLI gcloud.
Se non puoi utilizzare una libreria client che supporta la federazione delle identità di carico di lavoro, puoi eseguire l'autenticazione in modo programmatico utilizzando l'API REST.
Scenari avanzati
Autenticare un carico di lavoro utilizzando l'API REST
Se non puoi utilizzare le librerie client, puoi seguire questi passaggi per consentire a un workload esterno di ottenere un token di accesso di breve durata utilizzando l'API REST:
Ottieni le credenziali dal tuo provider di identità esterno:
AWS
Crea un documento JSON contenente le informazioni che normalmente includeresti in una richiesta all'endpoint
GetCallerIdentity()
di AWS, inclusa una firma della richiesta valida.Workload Identity Federation fa riferimento a questo documento JSON come a un token
GetCallerIdentity
. Il token consente alla federazione delle identità per i carichi di lavoro di verificare l'identità senza rivelare la chiave di accesso segreta AWS.Un token
GetCallerIdentity
ha il seguente aspetto:{ "url": "https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15", "method": "POST", "headers": [ { "key": "Authorization", "value" : "AWS4-HMAC-SHA256 Credential=AKIASOZTBDV4D7ABCDEDF/20200228/us-east-1/sts/aws4_request, SignedHeaders=host;x-amz-date,Signature=abcedefdfedfd" }, { "key": "host", "value": "sts.amazonaws.com" }, { "key": "x-amz-date", "value": "20200228T225005Z" }, { "key": "x-goog-cloud-target-resource", "value": "//iam.googleapis.com/projects/12345678/locations/global/workloadIdentityPools/my-pool/providers/my-aws-provider" }, { "key": "x-amz-security-token", "value": "GizFWJTqYX...xJ55YoJ8E9HNU=" } ] }
Il token contiene i seguenti campi:
url
: l'URL dell'endpoint AWS STS perGetCallerIdentity()
, con il corpo di una richiestaGetCallerIdentity()
standard aggiunto come parametri di ricerca. Ad esempio,https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15
. Ti consigliamo di utilizzare gli endpoint STS regionali e di progettare un'infrastruttura affidabile per i tuoi carichi di lavoro. Per ulteriori informazioni, consulta Endpoint AWS STS regionali.method
: il metodo di richiesta HTTP:POST
.headers
: le intestazioni delle richieste HTTP, che devono includere:Authorization
: la firma della richiesta.host
: il nome host del campourl
, ad esempiosts.amazonaws.com
.x-amz-date
: l'ora in cui invii la richiesta, formattata come stringa ISO 8601 di base. In genere questo valore viene impostato sull'ora corrente e viene utilizzato per contribuire a prevenire gli attacchi di replay.x-goog-cloud-target-resource
: il nome completo della risorsa del provider di identità senza un prefissohttps:
. Ad esempio://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
x-amz-security-token
: token di sessione. Obbligatorio solo se utilizzi credenziali di sicurezza temporanee.
L'esempio seguente crea un token
GetCallerIdentity
codificato in URL. Estrai il token con codifica URL per utilizzarlo in un secondo momento. Viene anche creato un token leggibile da una persona solo per riferimento futuro:Inizializza le seguenti variabili:
Bash
SUBJECT_TOKEN_TYPE="urn:ietf:params:aws:token-type:aws4_request" SUBJECT_TOKEN=TOKEN
PowerShell
$SubjectTokenType = "urn:ietf:params:aws:token-type:aws4_request" $SubjectToken = "TOKEN"
dove
TOKEN
è il token codificato come URLGetCallerIdentity
generato dallo script.Azure
Connettiti a una VM Azure con un'identità gestita assegnata e ottieni un token di accesso dal servizio IMDS (Instance Metadata Service) di Azure:
Bash
SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:jwt" SUBJECT_TOKEN=$(curl \ "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" \ -H "Metadata: true" | jq -r .access_token) echo $SUBJECT_TOKEN
Questo comando utilizza lo strumento
jq
.jq
è disponibile per impostazione predefinita in Cloud Shell.PowerShell
$SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt" $SubjectToken = (Invoke-RestMethod ` -Uri "http://169.254.169.254/metadata/identity/oauth2/token?resource=APP_ID_URI&api-version=2018-02-01" ` -Headers @{Metadata="true"}).access_token Write-Host $SubjectToken
Dove
APP_ID_URI
è l'URI dell'ID applicazione dell'applicazione che hai configurato per la federazione delle identità per i carichi di lavoro.Utilizza l'API Security Token Service per scambiare la credenziale con un token di accesso di breve durata:
Bash
STS_TOKEN=$(curl https://sts.googleapis.com/v1/token \ --data-urlencode "audience=//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID" \ --data-urlencode "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \ --data-urlencode "requested_token_type=urn:ietf:params:oauth:token-type:access_token" \ --data-urlencode "scope=https://www.googleapis.com/auth/cloud-platform" \ --data-urlencode "subject_token_type=$SUBJECT_TOKEN_TYPE" \ --data-urlencode "subject_token=$SUBJECT_TOKEN" | jq -r .access_token) echo $STS_TOKEN
PowerShell
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12 $StsToken = (Invoke-RestMethod ` -Method POST ` -Uri "https://sts.googleapis.com/v1/token" ` -ContentType "application/json" ` -Body (@{ "audience" = "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID" "grantType" = "urn:ietf:params:oauth:grant-type:token-exchange" "requestedTokenType" = "urn:ietf:params:oauth:token-type:access_token" "scope" = "https://www.googleapis.com/auth/cloud-platform" "subjectTokenType" = $SubjectTokenType "subjectToken" = $SubjectToken } | ConvertTo-Json)).access_token Write-Host $StsToken
Sostituisci i seguenti valori:
PROJECT_NUMBER
: numero del progetto che contiene il pool di identità del workloadPOOL_ID
: ID del pool di identità del workloadPROVIDER_ID
: ID del provider del pool di identità del workload
Se utilizzi l'usurpazione d'identità dell'account di servizio, utilizza il token del servizio token di sicurezza per invocare il metodo
generateAccessToken
dell'API Credenziali dell'account di servizio IAM per ottenere un token di accesso.
Token per i servizi Cloud Run
Quando accedi a un servizio Cloud Run, devi utilizzare un token ID.
Bash
TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateIdToken \ -H "Content-Type: text/json; charset=utf-8" \ -H "Authorization: Bearer $STS_TOKEN" \ -d @- <<EOF | jq -r .token { "audience": "SERVICE_URL" } EOF ) echo $TOKEN
PowerShell
$Token = (Invoke-RestMethod ` -Method POST ` -Uri "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateIdToken" ` -Headers @{ "Authorization" = "Bearer $StsToken" } ` -ContentType "application/json" ` -Body (@{ "audience" = "SERVICE_URL" } | ConvertTo-Json)).token Write-Host $Token
Sostituisci quanto segue:
-
SERVICE_ACCOUNT_EMAIL
: l'indirizzo email dell'account di servizio. -
SERVICE_URL
: l'URL del servizio, ad esempiohttps://my-service-12345-us-central1.run.app
. Puoi anche impostarlo sul tuo endpoint del servizio personalizzato. Per saperne di più, consulta Informazioni sui segmenti di pubblico personalizzati.
Token per altre piattaforme
Quando accedi a un altro servizio, devi utilizzare un token di accesso.
Bash
TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken \ -H "Content-Type: text/json; charset=utf-8" \ -H "Authorization: Bearer $STS_TOKEN" \ -d @- <<EOF | jq -r .accessToken { "scope": [ "https://www.googleapis.com/auth/cloud-platform" ] } EOF ) echo $TOKEN
PowerShell
$Token = (Invoke-RestMethod ` -Method POST ` -Uri "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT_EMAIL:generateAccessToken" ` -Headers @{ "Authorization" = "Bearer $StsToken" } ` -ContentType "application/json" ` -Body (@{ "scope" = , "https://www.googleapis.com/auth/cloud-platform" } | ConvertTo-Json)).accessToken Write-Host $Token
Sostituisci quanto segue:
-
SERVICE_ACCOUNT_EMAIL
: l'indirizzo email dell'account di servizio.
Passaggi successivi
- Scopri di più sulla federazione di Workload Identity.
- Scopri le best practice per l'utilizzo della federazione delle identità per i workload.
- Scopri come gestire i provider e i pool di identità del workload.
Salvo quando diversamente specificato, i contenuti di questa pagina sono concessi in base alla licenza Creative Commons Attribution 4.0, mentre gli esempi di codice sono concessi in base alla licenza Apache 2.0. Per ulteriori dettagli, consulta le norme del sito di Google Developers. Java è un marchio registrato di Oracle e/o delle sue consociate.
Ultimo aggiornamento 2024-11-28 UTC.