Configura la federazione delle identità per i carichi di lavoro con AWS o Azure

Questa guida descrive come utilizzare la federazione delle identità per i carichi di lavoro per consentire ai carichi di lavoro di AWS e Azure di autenticarsi in Google Cloud senza una chiave dell'account di servizio.

Utilizzando 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 per l'ambiente per token a breve durata di Google Cloud Security Token Service.

Le credenziali specifiche per l'ambiente includono:

Configurando la 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 carichi di lavoro possono usare queste credenziali di breve durata per accedere alle API Google Cloud.

Prima di iniziare

  • Configurare l'autenticazione.

    Seleziona la scheda relativa a come prevedi di utilizzare gli esempi in questa pagina:

    Console

    Quando utilizzi la console Google Cloud per accedere ai servizi e alle API di Google Cloud, non devi configurare l'autenticazione.

    gcloud

    In questa pagina puoi utilizzare gli esempi di gcloud CLI da uno dei seguenti ambienti di sviluppo:

    • Cloud Shell: per utilizzare un terminale online con gcloud CLI già configurato, attiva Cloud Shell.

      In fondo a questa pagina viene avviata una sessione di Cloud Shell e viene visualizzato un prompt della riga di comando. L'inizializzazione della sessione può richiedere alcuni secondi.

    • shell locale: per utilizzare gcloud CLI in un ambiente di sviluppo locale, installa e initialize gcloud CLI.

    Python

    Per utilizzare gli esempi Python in questa pagina da un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.

    1. Installa Google Cloud CLI.
    2. Per initialize gcloud CLI, esegui questo comando:

      gcloud init
    3. Crea credenziali di autenticazione locali per il tuo Account Google:

      gcloud auth application-default login

    Per saperne di più, consulta Configurare l'autenticazione per un ambiente di sviluppo locale nella documentazione sull'autenticazione di Google Cloud.

Prepara il provider di identità esterno

Devi eseguire questi passaggi solo una volta per ogni tenant di Azure AD o account AWS.

AWS

Non devi apportare alcuna modifica alla configurazione nel tuo account AWS.

Dopo aver configure un pool di identità per i carichi di lavoro in modo che il tuo account AWS sia attendibile, 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 Azure AD nel tenant di Azure AD e configurarla in modo che possa essere utilizzata per la federazione delle identità per i carichi di lavoro.

Dopo aver configure un pool di identità per i carichi di lavoro in modo che l'applicazione sia attendibile, gli utenti e le entità servizio Azure possono richiedere i token di accesso per questa applicazione e scambiare questi token di accesso con credenziali Google Cloud di breve durata.

Per creare l'applicazione:

  1. Crea un'applicazione Azure AD e un'entità di servizio.

  2. Imposta un URI ID applicazione per l'applicazione. Puoi utilizzare l'URI predefinito dell'ID applicazione (api://APPID) o specificare un URI personalizzato.

    L'URI dell'ID applicazione ti servirà in un secondo momento, durante la configurazione del provider del pool di identità per i carichi di lavoro.

Per consentire a un'applicazione di ottenere i token di accesso per l'applicazione Azure AD, puoi utilizzare le identità gestite:

  1. Crea un'identità gestita. Prendi nota dell'ID oggetto dell'identità gestita. Ti servirà in un secondo momento, quando configuri la rappresentazione.

  2. Assegna l'identità gestita a una macchina virtuale o a un'altra risorsa che esegue la tua applicazione.

Configura la federazione delle identità per i carichi di lavoro

Devi eseguire questi passaggi solo una volta per account AWS o tenant di Azure AD. Puoi quindi utilizzare lo stesso pool di identità per i carichi di lavoro e lo stesso provider per più carichi di lavoro e progetti Google Cloud.

Per avviare la configurazione della federazione delle identità per i carichi di lavoro:

  1. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  2. È preferibile utilizzare un progetto dedicato per gestire provider e pool di identità per i carichi di lavoro.
  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API IAM, Resource Manager, Service Account Credentials, and Security Token Service.

    Abilita le API

Definisci una mappatura e una condizione degli attributi

Le credenziali specifiche per l'ambiente del tuo carico di lavoro AWS o Azure contengono più attributi e devi decidere quale attributo utilizzare come identificatore soggetto (google.subject) in Google Cloud.

Google Cloud utilizza l'identificatore soggetto in Cloud Audit Logs e negli identificatori principali per identificare in modo univoco un utente o un ruolo AWS o Azure.

Se vuoi, puoi mappare ulteriori 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 l'applicazione viene eseguita su un'istanza Amazon Elastic Compute Cloud (EC2) con un ruolo associato, puoi utilizzare il seguente mapping 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 svolge le seguenti operazioni:

  • Utilizza l'ARN come identificatore del soggetto (ad esempio: "arn:aws:sts::000000000000:assumed-role/ec2-my-role/i-00000000000000000)
  • Presenta un attributo personalizzato account e assegnagli l'ID account AWS
  • Presenta un attributo personalizzato aws_role e assegnagli il nome del ruolo AWS (ad esempio: ec2-my-role)
  • Presenta un attributo personalizzato aws_ec2_instance e assegnagli l'ID istanza EC2 (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 in 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 le rivendicazioni incorporate nei token di accesso di Azure, comprese le attestazioni personalizzate, come attributi di origine. Nella maggior parte dei casi, ti consigliamo di utilizzare la rivendicazione sub come identificatore del soggetto:

google.subject=assertion.sub

Per un token di accesso emesso per un'identità gestita, l'attestazione sub contiene l'ID oggetto dell'identità gestita. Se utilizzi una rivendicazione diversa, assicurati che sia univoca e non possa essere riassegnata.

Se hai dubbi sull'elenco di rivendicazioni a cui puoi fare riferimento:

  1. Connettiti a una VM Azure a cui è assegnata un'identità gestita.

  2. Richiedi un token di accesso dal servizio metadati istanza di Azure (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.

  3. In un browser web, vai a https://jwt.ms/ e incolla il token di accesso nella casella di testo.

  4. Fai clic su Rivendicazioni per visualizzare l'elenco delle rivendicazioni incorporate nel token di accesso.

Per le identità dei servizi, in genere non è necessario creare un mapping per google.groups o per qualsiasi attributo personalizzato.

Facoltativamente, definisci una condizione dell'attributo. Le condizioni degli attributi sono espressioni CEL in grado di controllare gli attributi di asserzioni e gli attributi di destinazione. Se la condizione dell'attributo ha valore true per una determinata credenziale, la credenziale viene accettata. In caso contrario, la credenziale viene rifiutata.

AWS

Puoi utilizzare una condizione degli attributi per limitare gli utenti e i ruoli IAM che possono utilizzare la federazione delle identità per i carichi di lavoro per ottenere token Google Cloud a breve durata.

Ad esempio, la condizione seguente 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 degli attributi per limitare gli utenti e le entità di servizio che possono utilizzare la federazione delle identità per i carichi di lavoro per ottenere token Google Cloud a breve durata. In alternativa, puoi configurare la tua applicazione Azure AD in modo che utilizzi le assegnazioni dei ruoli di app.

Crea il pool di identità per i carichi di lavoro e il provider

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per configurare la federazione delle identità per i carichi di lavoro, chiedi all'amministratore di concederti i seguenti ruoli IAM sul progetto:

Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso.

Potresti anche essere in grado di 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 devi concedere ruoli di base in un ambiente di produzione, ma puoi concederli in un ambiente di sviluppo o test.

Ora hai raccolto tutte le informazioni necessarie per creare un provider e un pool di identità per i carichi di lavoro:

Console

  1. Nella console Google Cloud, vai alla pagina Nuovo provider e pool di carichi di lavoro.

    Vai a Nuovo provider e pool di carichi di lavoro

  2. 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: testo che descrive lo scopo del pool.
  3. Fai clic su Continua.

  4. 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 provider in un secondo momento.

    Azure

    Configura le seguenti impostazioni del provider:

    • Seleziona un provider: OpenID Connect (OIDC).
    • Nome provider: il nome del provider. Il nome viene utilizzato anche come ID provider. Non potrai modificare l'ID provider in un secondo momento.
    • URL emittente: https://sts.windows.net/TENANT_ID. Sostituisci TENANT_ID con l'ID tenant (GUID) del tenant di Azure AD.
    • Segmenti di pubblico consentiti: l'URI dell'ID applicazione che hai utilizzato quando hai registrato l'applicazione in Azure AD.
  5. Fai clic su Continua.

  6. Nella sezione Configura gli attributi del provider, aggiungi le mappature degli attributi identificate in precedenza.

  7. Nella sezione Condizioni degli attributi, inserisci la condizione dell'attributo identificata in precedenza. Lascia vuoto il campo se non hai una condizione dell'attributo.

  8. Fai clic su Salva per creare il provider e il pool di identità per i carichi di lavoro.

gcloud

  1. Crea un nuovo pool di identità per i carichi di lavoro:

    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.
  2. Aggiungi un provider di pool di identità per i carichi di lavoro:

    AWS

    Per creare il provider del pool di identità per i carichi di lavoro per AWS, esegui questo 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:

    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 di pool di identità per i carichi di lavoro per Azure, esegui questo 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 provider.
    • POOL_ID: l'ID del pool.
    • ISSUER_URI: l'ID tenant (GUID) del tenant di Azure AD, a volte formattato come https://sts.windows.net/TENANT_ID. L'URI dell'emittente può variare e, per trovare l'URI dell'emittente, puoi eseguire il debug del tuo JWT utilizzando JWT.io.
    • APPLICATION_ID_URI: URI ID applicazione che hai utilizzato quando hai registrato l'applicazione in Azure AD.
    • MAPPINGS: l'elenco separato da virgole di mappature degli attributi identificate in precedenza.
    • CONDITIONS: (facoltativo) la condizione dell'attributo identificata 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.

Crea un account di servizio per il carico di lavoro esterno

  1. Abilita le API IAM, Security Token Service, and Service Account Credentials.

    Abilita le API

  2. Crea un account di servizio che rappresenti il carico di lavoro. È preferibile 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à dei carichi di lavoro.

  3. Concedi all'account di servizio l'accesso alle risorse a cui vuoi che accedano le identità esterne.

Consenti al carico di lavoro esterno di impersonare l'account di servizio

Per consentire a identità esterne di impersonare un account di servizio, concedi loro il ruolo Utente Workload Identity (roles/iam.workloadIdentityUser) per l'account di servizio. Puoi concedere il ruolo a un'identità esterna specifica o a più identità esterne:

  • Per un'identità esterna specifica, scrivi una condizione dell'attributo che controlli l'attributo google.subject.
  • Per un gruppo di identità esterne, scrivi una condizione dell'attributo che controlli l'attributo google.groups o un attributo personalizzato attribute.NAME.

Console

Per consentire alle identità esterne di impersonare un account di servizio utilizzando la console Google Cloud:

  1. Nella console Google Cloud, vai alla pagina Pool di identità carichi di lavoro.

    Vai ai pool Workload Identity

  2. Individua e seleziona il pool Workload Identity da aggiornare.

  3. Per concedere l'accesso al pool di identità per i carichi di lavoro selezionato, fai clic su Concedi l'accesso.

  4. Nell'elenco Account di servizio, seleziona l'account di servizio per le identità esterne da impersonare.

  5. Per scegliere quali identità nel pool possono impersonare l'account di servizio, esegui una delle seguenti azioni:

    • Per consentire solo a identità specifiche del pool di identità per i carichi di lavoro di assumere l'identità dell'account di servizio, seleziona Solo le identità che corrispondono al filtro.

      Nell'elenco Nome attributo, seleziona l'attributo in base al quale 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 Nome attributo su subject e Valore attributo sul valore dell'attestazione sub nei token emessi dal tuo provider di identità esterno.

  6. Per salvare la configurazione, fai clic su Salva e poi su Ignora.

gcloud

Per consentire alle identità esterne di impersonare un account di servizio utilizzando gcloud CLI, segui questi passaggi:

  1. Per ottenere il numero del tuo progetto attuale, esegui questo comando:

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. Per concedere il ruolo Utente Workload Identity (roles/iam.workloadIdentityUser) alle identità esterne che soddisfano determinati criteri:

    Per soggetto

    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 di servizio
    • PROJECT_NUMBER: il numero di progetto del progetto che contiene il pool di identità per i carichi di lavoro
    • POOL_ID: l'ID pool del pool di identità per i carichi di lavoro
    • SUBJECT: il valore previsto per l'attributo che hai mappato a google.subject
    • GROUP: il valore previsto per l'attributo che hai mappato a google.groups
    • ATTRIBUTE_NAME: il nome di un attributo personalizzato nella mappatura degli attributi

Crea una configurazione delle credenziali

Le librerie client di Cloud, gcloud CLI e Terraform possono ottenere automaticamente credenziali esterne e utilizzare queste credenziali per impersonare un account di servizio. Per consentire a librerie e strumenti di completare questa procedura, devi fornire un file di configurazione delle credenziali. Questo file definisce quanto segue:

  • Da dove ottenere le credenziali esterne
  • Provider di identità e pool di identità per i carichi di lavoro da utilizzare
  • Quale account di servizio utilizzare

Per creare un file di configurazione delle credenziali:

Console

Scarica un file di configurazione delle credenziali nella console Google Cloud:

  1. Nella console Google Cloud, vai alla pagina Pool di identità carichi di lavoro.

    Vai ai pool Workload Identity

  2. Individua il pool di identità per i carichi di lavoro che contiene l'IdP che vuoi utilizzare e fai clic su quest'ultimo.

  3. Seleziona Account di servizio connessi.

  4. Trova l'account di servizio che vuoi utilizzare e fai clic su Scarica.

  5. Nella finestra di dialogo Configura la tua applicazione, seleziona il provider che contiene le identità esterne che impersonano l'account di servizio.

  6. Fornisci le seguenti impostazioni aggiuntive:

    AWS

    Non sono necessarie ulteriori impostazioni.

    Azure

    Application ID URL (URL ID applicazione): URI dell'ID applicazione dell'applicazione Azure

  7. 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:

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à per i carichi di lavoro
  • POOL_ID: l'ID del pool di identità per i carichi di lavoro
  • PROVIDER_ID: l'ID del provider del pool di identità per i carichi di lavoro
  • SERVICE_ACCOUNT_EMAIL: l'indirizzo email dell'account di servizio
  • SERVICE_ACCOUNT_TOKEN_LIFETIME: durata del token di accesso all'account di servizio, in secondi; se non viene specificato, il valore predefinito è un'ora. Per specificare una durata superiore a un'ora, devi configurare il vincolo del criterio dell'organizzazione constraints/iam.allowServiceAccountCredentialLifetimeExtension.
  • FILEPATH: il file in cui salvare la configurazione

Se utilizzi AWS IMDSv2, è necessario aggiungere un ulteriore flag --enable-imdsv2 al comando gcloud 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 è possibile 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
  • Uno di AWS_REGION o AWS_DEFAULT_REGION
  • Facoltativo: AWS_SESSION_TOKEN

Le librerie e l'interfaccia a riga di comando gcloud 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 di 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: numero del progetto che contiene il pool di identità per i carichi di lavoro
  • POOL_ID: l'ID del pool di identità per i carichi di lavoro
  • PROVIDER_ID: l'ID del provider del pool di identità per i carichi di lavoro
  • SERVICE_ACCOUNT_EMAIL: l'indirizzo email dell'account di servizio
  • APPLICATION_ID_URI: l'URI dell'ID applicazione dell'applicazione Azure
  • SERVICE_ACCOUNT_TOKEN_LIFETIME: durata del token di accesso all'account di servizio, in secondi; se non viene specificato, il valore predefinito è un'ora. Per specificare una durata superiore a un'ora, devi configurare il vincolo del criterio dell'organizzazione constraints/iam.allowServiceAccountCredentialLifetimeExtension.
  • FILEPATH: il file in cui salvare la configurazione

Utilizzare la configurazione delle credenziali per accedere a Google Cloud

Per consentire a strumenti e librerie client di utilizzare la configurazione delle credenziali, segui questi passaggi nel tuo ambiente AWS o Azure:

  1. Inizializza una variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS e puntala al file di configurazione delle credenziali:

    Bash

      export GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
      
    dove FILEPATH è il percorso file relativo al file di configurazione delle credenziali.

    PowerShell

      $env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
      
    dove FILEPATH è il percorso file relativo al file di configurazione delle credenziali.
  2. Utilizza una libreria client o uno strumento che supporti la federazione delle identità per i carichi di lavoro e che possa trovare le credenziali automaticamente:

    C++

    Le librerie client di Google Cloud per C++ supportano la federazione delle identità per i carichi di lavoro a partire dalla versione v2.6.0. Per utilizzare la federazione delle identità per i carichi di lavoro, devi creare le librerie client con versione 1.36.0 o successiva di gRPC.

    Go

    Le librerie client per Go supportano la federazione delle identità se utilizzano la versione v0.0.0-20210218202405-ba52d332ba99 o successiva del modulo golang.org/x/oauth2.

    Per verificare quale versione di questo modulo utilizza la tua libreria client, esegui questi comandi:

    cd $GOPATH/src/cloud.google.com/go
    go list -m golang.org/x/oauth2
    

    Java

    Le librerie client per Java supportano la federazione delle identità se utilizzano la versione 0.24.0 o successive dell'artefatto com.google.auth:google-auth-library-oauth2-http.

    Per verificare quale versione di questo artefatto utilizza la tua 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à per i carichi di lavoro se utilizzano la versione 7.0.2 o successiva del pacchetto google-auth-library.

    Per verificare quale versione di questo pacchetto viene utilizzata dalla tua libreria client, esegui questo comando nella directory dell'applicazione:

    npm list google-auth-library
    

    Quando crei un oggetto GoogleAuth, puoi specificare un ID progetto o consentire a GoogleAuth di trovare automaticamente l'ID progetto. Per trovare automaticamente l'ID progetto, l'account di servizio nel file di configurazione deve avere il ruolo Browser (roles/browser) o un ruolo con autorizzazioni equivalenti nel progetto. Per maggiori dettagli, consulta il documento README per il pacchetto google-auth-library.

    Python

    Le librerie client per Python supportano la federazione delle identità se utilizzano la versione 1.27.0 o successiva del pacchetto google-auth.

    Per verificare quale versione di questo pacchetto viene utilizzata dalla tua libreria client, esegui questo 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, l'account di servizio nel file di configurazione deve avere il ruolo Browser (roles/browser) o un ruolo con autorizzazioni equivalenti nel progetto. Per i dettagli, consulta la guida dell'utente per il pacchetto google-auth.

    gcloud

    Per eseguire l'autenticazione con 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 per la federazione delle identità per i carichi di lavoro in gcloud CLI è disponibile nella versione 363.0.0 e successive di gcloud CLI.

    Terraform

    Il provider Google Cloud supporta la federazione delle identità per i carichi di lavoro se utilizzi la versione 3.61.0 o successive:

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = "~> 3.61.0"
        }
      }
    }
    

    gsutil

    Per eseguire l'autenticazione con la federazione delle identità per i carichi di lavoro, utilizza uno dei seguenti metodi:

    Quando utilizzi gsutil in combinazione con gcloud, accedi normalmente:

    gcloud auth login --cred-file=FILEPATH.json
    

    Quando utilizzi gsutil come applicazione a riga di comando autonoma, modifica il file .boto in modo da includere la seguente sezione:

    [Credentials]
    gs_external_account_file = FILEPATH
    

    In entrambi i casi, sostituisci FILEPATH con il percorso del file di configurazione delle credenziali.

    Il supporto per la federazione delle identità per i carichi di lavoro in gsutil è disponibile nella versione 379.0.0 e nelle versioni successive di gcloud CLI.

    bq

    Per eseguire l'autenticazione con la federazione delle identità per i carichi di lavoro, 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 per la federazione delle identità per i carichi di lavoro in bq è disponibile nella versione 390.0.0 e successive di gcloud CLI.

    Se non puoi utilizzare una libreria client che supporta la federazione delle identità per i carichi di lavoro, puoi eseguire l'autenticazione in modo programmatico utilizzando l'API REST.

Scenari avanzati

Autentica un carico di lavoro utilizzando l'API REST

Se non riesci a utilizzare le librerie client, puoi seguire questi passaggi per consentire a un carico di lavoro esterno di ottenere un token di accesso di breve durata utilizzando l'API REST:

  1. Recupera le credenziali dall'IdP esterno:

    AWS

    Crea un documento JSON contenente le informazioni che normalmente includeresti in una richiesta all'endpoint GetCallerIdentity() AWS, tra cui una firma di richiesta valida.

    La federazione delle identità per i carichi di lavoro fa riferimento a questo documento JSON come un token GetCallerIdentity. Il token consente alla federazione delle identità dei carichi di lavoro di verificare l'identità senza rivelare la chiave di accesso secret AWS.

    Un token GetCallerIdentity è simile al seguente:

    {
      "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 per GetCallerIdentity(), con il corpo di una richiesta GetCallerIdentity() standard aggiunto come parametri di query. Ad esempio, https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15. Ti consigliamo di utilizzare gli endpoint STS a livello di regione e di progettare un'infrastruttura affidabile per i tuoi carichi di lavoro. Per ulteriori informazioni, consulta Endpoint AWS STS a livello di regione.
    • method: il metodo di richiesta HTTP POST.
    • headers: le intestazioni della richiesta HTTP, che devono includere:
      • Authorization: la firma della richiesta.
      • host: il nome host del campo url, ad esempio sts.amazonaws.com.
      • x-amz-date: l'ora in cui invii la richiesta, nel formato ISO 8601 Basic. Questo valore in genere è impostato sull'ora attuale e viene utilizzato per impedire gli attacchi di ripetizione.
      • x-goog-cloud-target-resource: il nome completo della risorsa del provider di identità senza prefisso https:. 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 con codifica URL. Estrarre il token con codifica URL per utilizzarlo in seguito. Crea inoltre un token leggibile solo per tuo riferimento:

    import json
    import urllib
    
    import boto3
    from botocore.auth import SigV4Auth
    from botocore.awsrequest import AWSRequest
    
    def create_token_aws(project_number: str, pool_id: str, provider_id: str) -> None:
        # Prepare a GetCallerIdentity request.
        request = AWSRequest(
            method="POST",
            url="https://sts.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15",
            headers={
                "Host": "sts.amazonaws.com",
                "x-goog-cloud-target-resource": f"//iam.googleapis.com/projects/{project_number}/locations/global/workloadIdentityPools/{pool_id}/providers/{provider_id}",
            },
        )
    
        # Set the session credentials and Sign the request.
        # get_credentials loads the required credentials as environment variables.
        # Refer:
        # https://boto3.amazonaws.com/v1/documentation/api/latest/guide/credentials.html
        SigV4Auth(boto3.Session().get_credentials(), "sts", "us-east-1").add_auth(request)
    
        # Create token from signed request.
        token = {"url": request.url, "method": request.method, "headers": []}
        for key, value in request.headers.items():
            token["headers"].append({"key": key, "value": value})
    
        # The token lets workload identity federation verify the identity without revealing the AWS secret access key.
        print("Token:\n%s" % json.dumps(token, indent=2, sort_keys=True))
        print("URL encoded token:\n%s" % urllib.parse.quote(json.dumps(token)))
    
    def main() -> None:
        # TODO(Developer): Replace the below credentials.
        # project_number: Google Project number (not the project id)
        project_number = "my-project-number"
        pool_id = "my-pool-id"
        provider_id = "my-provider-id"
    
        create_token_aws(project_number, pool_id, provider_id)
    
    if __name__ == "__main__":
        main()

    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 URL codificato GetCallerIdentity generato dallo script precedente.

    Azure

    Connettiti a una VM Azure a cui è stata assegnata un'identità gestita e ottieni un token di accesso dal servizio di metadati delle istanze di Azure (IMDS):

    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 ID applicazione dell'applicazione che hai configurato per la federazione delle identità per i carichi di lavoro.

  2. Utilizza l'API Security Token Service per scambiare le credenziali con un token di accesso a 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à per i carichi di lavoro
    • POOL_ID: ID del pool di identità per i carichi di lavoro
    • PROVIDER_ID: ID del provider del pool di identità per i carichi di lavoro
  3. Utilizza il token del servizio token di sicurezza per richiamare il metodo generateAccessToken dell'API IAM Service Account Credentials e ottenere un token di accesso:

Bash

ACCESS_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 $ACCESS_TOKEN

PowerShell

$AccessToken = (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 $AccessToken

Sostituisci SERVICE_ACCOUNT_EMAIL con l'indirizzo email dell'account di servizio.

Passaggi successivi