Recupero delle credenziali di breve durata con la federazione delle identità

Questa guida descrive come utilizzare un pool Workload Identity e un provider per ottenere credenziali di breve durata seguendo questa procedura:

  1. Ottieni una credenziale dal provider di identità attendibile.
  2. Scambia le credenziali di un token dal Security Token Service.
  3. Utilizzare il token del Security Token Service per impersonare un account di servizio e ottenere un token di accesso a Google di breve durata.

Utilizzando i token di accesso Google di breve durata, puoi quindi accedere alle risorse Google Cloud a cui è stato concesso l'accesso all'account di servizio.

Prima di iniziare

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

    Abilita le API

  2. Crea una federazione con un provider di identità esterno creando un provider di identità e un provider di identità del carico di lavoro.

  3. Crea un account di servizio che vuoi utilizzare per le identità esterne.

  4. Concedi all'account di servizio l'accesso alle risorse a cui vuoi consentire le identità esterne.

Concessione dell'autorizzazione per le identità esterne a impersonare un account di servizio

Per consentire alle identità esterne di impersonare un account di servizio, devi concedere loro il ruolo Utente Workload Identity (roles/iam.workloadIdentityUser) nell'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 per l'attributo che controlli l'attributo google.subject.
  • Per un gruppo di identità esterne, scrivi una condizione per l'attributo che controlli l'attributo google.groups o un attributo personalizzato attribute.NAME.
  • Per tutte le identità esterne nel pool Workload Identity, non devi utilizzare una condizione di attributo.

Console

  1. Nella console Google Cloud, vai alla pagina Pool di Workload Identity.

    Vai a pool di Workload Identity

  2. Trova il pool Workload Identity che vuoi aggiornare e fai clic sul pool.

  3. Fai clic su Concedi l'accesso.

  4. Nell'elenco a discesa Account di servizio, seleziona l'account di servizio che utilizzerà le identità esterne.

  5. Scegli quali identità nel pool possono impersonare l'account di servizio:

    • Per consentire solo alle identità specifiche del pool di identità del carico di lavoro di impersonare l'account di servizio, seleziona Solo le identità corrispondenti al filtro.

      Nell'elenco a discesa Nome attributo, seleziona l'attributo in base al quale vuoi filtrare.

      Nel campo Valore attributo, inserisci il valore previsto dell'attributo.

      Ad esempio, se utilizzi una mappatura attributo google.subject=assertion.sub, imposta il nome Attributo su subject e Valore attributo sul valore della rivendicazione sub nei token emessi dal provider di identità esterno.

    • Per consentire a tutte le identità esterne del pool Workload Identity di impersonare l'account di servizio, seleziona Tutte le identità nel pool.

  6. Fai clic su Salva.

  7. Fai clic su Ignora.

gcloud

  1. Crea un identificatore per le identità esterne:

    • Un'identità esterna specifica:

      principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT
      
    • Un gruppo di identità esterne:

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP
      
    • Tutte le identità esterne che hanno un determinato attributo:

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
      
    • Tutte le identità esterne in un pool Workload Identity:

      principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
      

    Sostituisci i seguenti valori:

    • PROJECT_NUMBER: Numero del progetto del progetto contenente il pool Workload Identity
    • POOL_ID: ID pool del pool Workload Identity
    • SUBJECT: valore previsto per l'attributo che hai mappato a google.subject
    • GROUP: valore previsto per l'attributo che hai mappato a google.groups
    • ATTRIBUTE_NAME: nome di un attributo personalizzato nella mappatura degli attributi

    Per ottenere il numero di progetto attuale, puoi utilizzare questo comando:

    gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\)
    
  2. Concedi il ruolo Utente Workload Identity (roles/iam.workloadIdentityUser) all'entità nell'account di servizio:

    gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
        --role=roles/iam.workloadIdentityUser \
        --member="MEMBER_ID"
    

    Sostituisci i seguenti valori:

    • SERVICE_ACCOUNT_EMAIL: indirizzo email dell'account di servizio
    • MEMBER_ID: identificatore del membro identificato nel passaggio precedente

Autenticazione tramite librerie client, gcloud CLI o Terraform

Le librerie client Cloud, l'interfaccia a riga di comando gcloud e Terraform, possono ottenere automaticamente credenziali esterne e utilizzarle per impersonare un account di servizio. Per consentire alle librerie e agli strumenti di completare questo processo, devi fornire un file di configurazione delle credenziali. Questo file definisce quanto segue:

  • Da dove scaricare le credenziali esterne
  • Pool e provider di identità da utilizzare
  • Quale account di servizio impersonare

Il modo in cui i file di configurazione delle credenziali vengono utilizzati dalle librerie client dipende dal provider di identità esterno:

AWS

Le librerie client ottengono automaticamente le credenziali temporanee dai metadati delle istanze EC2.

Azure

Le librerie client ricevono automaticamente i token di accesso dal servizio di metadati delle istanze Azure (ISSL).

Azioni GitHub

Poiché i parametri richiesti per ottenere un token ID GitHub variano a seconda dell'esecuzione del flusso di lavoro, non puoi utilizzare un file di configurazione delle credenziali statico in un flusso di lavoro di azioni GitHub.

Utilizza l'azione google-github-actions/auth per generare automaticamente un file di configurazione delle credenziali durante l'esecuzione del flusso di lavoro. Le librerie client e gli strumenti come terraform possono quindi utilizzare questo file di configurazione delle credenziali per ottenere automaticamente le credenziali di Google.

OIDC

Le librerie client ottengono le credenziali da un file locale, un URL HTTP o un eseguibile locale:

  • Credenziali provenienti da file: i token vengono caricati da un file. Un altro processo deve aggiornare questo file con un nuovo token OIDC prima che il vecchio token scada. Ad esempio, se il token ha una durata di 1 ora, devi aggiornare il file prima che abbia un'ora.
  • Credenziali provenienti dall'URL: i token vengono caricati da un server locale con un endpoint che risponde alle richieste HTTP GET. La risposta deve essere un token ID OIDC, in formato testo normale o JSON.
  • Credenziali eseguibili: i token vengono caricati da un eseguibile locale. L'eseguibile deve gestire un token ID OIDC valido e non scaduto in formato JSON da stdout:

    {
      "version": 1,
      "success": true,
      "token_type": "urn:ietf:params:oauth:token-type:id_token",
      "id_token": "HEADER.PAYLOAD.SIGNATURE",
      "expiration_time": 1620499962
    }
    
    Questi campi sono obbligatori per una risposta corretta, ad eccezione di expiration_time. Il campo expiration_time è obbligatorio solo quando è stato specificato un file di output nella configurazione delle credenziali.

    Se si verifica un errore, deve essere visualizzato dall'eseguibile nel seguente formato JSON per essere limitato:

    {
      "version": 1,
      "success": false,
      "code": "401",
      "message": "Caller not authorized."
    }
    
    Questi campi sono tutti obbligatori per la risposta agli errori. I campi Codice e Messaggio verranno utilizzati dalle librerie client quando assegni l'errore appropriato.

    Riepilogo dei campi del formato di risposta:

    • version: versione dell'output JSON. Attualmente è supportata solo la versione 1.
    • success: lo stato della risposta. Se true, la risposta deve contenere il token di terze parti, il tipo di token e la scadenza. L'eseguibile deve anche uscire con il codice di uscita 0. Se è false, la risposta deve contenere i campi del messaggio e del codice di errore, nonché uscire con un valore diverso da zero.
    • token_type: tipo di token dell'oggetto di terze parti. I valori supportati sono urn:ietf:params:oauth:token-type:id_token e urn:ietf:params:oauth:token-type:jwt.
    • id_token: il token OIDC di terze parti.
    • expiration_time: la scadenza del token OIDC in secondi (tempo unix epoch).
    • code: la stringa del codice di errore.
    • message: il messaggio di errore.

    Durante l'esecuzione, le librerie client completeranno le seguenti variabili di ambiente:

    • GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE: il campo del pubblico della configurazione delle credenziali. Sempre presente.
    • GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE: il tipo di token dell'oggetto previsto. Sempre presente.
    • GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL: l'indirizzo email dell'account di servizio. Presente solo quando viene usato il furto d'identità dell'account di servizio.
    • GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE: posizione del file di output dalla configurazione delle credenziali. Presente solo quando specificato nella configurazione delle credenziali.

    Queste variabili di ambiente possono essere utilizzate dall'eseguibile per evitare l'impostazione come hardcoded di questi valori.

    Per abilitare questo metodo di origine delle credenziali con le librerie client, la variabile di ambiente GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES deve essere impostata su 1.

OIDC (AD FS)

Le librerie client possono ottenere le credenziali da un file locale o da un URL HTTP, ma non supportano direttamente l'autenticazione Windows integrata (IWA). Per ottenere un token di accesso per l'utente che ha eseguito l'accesso e archiviarlo in un file locale, utilizza il seguente comando di PowerShell:

(Invoke-RestMethod `
    -Uri "https://ADFS_DOMAIN/adfs/oauth2/token/" `
    -Method POST `
    -Body @{
        client_id = 'CLIENT_ID'
        grant_type = 'client_credentials'
        scope = 'openid'
        resource = 'RELYING_PARTY_ID'
        use_windows_client_authentication = 'true'
        } `
    -UseDefaultCredentials).access_token | Out-File -Encoding ASCII TOKEN_FILEPATH

Sostituisci i seguenti valori:

  • ADFS_DOMAIN: nome di dominio pubblico del server AD FS dell'azienda agricola.
  • CLIENT_ID: ID client della registrazione dell'applicazione in AD FS.
  • RELYING_PARTY_ID: applicazione dell'identificatore di parti utilizzato durante la creazione di un'applicazione API web per il pool Workload Identity in AD FS.
  • TOKEN_FILEPATH: percorso verso un file temporaneo in cui salvare il token AD FS. Assicurati che il file sia archiviato in una posizione in cui solo gli utenti autorizzati possono leggere i contenuti del file.

Poiché le credenziali Google di breve durata sono valide solo per un periodo di tempo limitato (un'ora per impostazione predefinita), devi eseguire di nuovo questo comando periodicamente.

SAML

Le librerie client ottengono le credenziali da un file locale, un URL HTTP o un eseguibile locale:

  • Credenziali provenienti da file: le asserzioni vengono caricate da un file. Un altro processo deve aggiornare questo file con una nuova asserzione SAML con codifica base64 prima della scadenza di quella precedente. Ad esempio, se la asserzione ha una durata di 1 ora, devi aggiornare il file prima che abbia un'ora.
  • Credenziali basate su URL: le asserzioni vengono caricate da un server locale con un endpoint che risponde alle richieste HTTP GET. La risposta deve essere un'asserzione SAML con codifica base64 o un file JSON contenente un'asserzione con codifica base64.
  • Credenziali eseguibili: le asserzioni vengono caricate da un eseguibile locale. L'eseguibile deve gestire un'asserzione SAML valida e non scaduta in formato JSON da stdout:

    {
      "version": 1,
      "success": true,
      "token_type": "urn:ietf:params:oauth:token-type:saml2",
      "saml_response": "...",
      "expiration_time": 1620499962
    }
    
    Questi campi sono obbligatori per una risposta corretta, ad eccezione di expiration_time. Il campo expiration_time è obbligatorio solo quando è stato specificato un file di output nella configurazione delle credenziali.

    Se si verifica un errore, deve essere visualizzato dall'eseguibile nel seguente formato JSON per essere limitato:

    {
      "version": 1,
      "success": false,
      "code": "401",
      "message": "Caller not authorized."
    }
    
    Questi campi sono tutti obbligatori per la risposta agli errori. I campi Codice e Messaggio verranno utilizzati dalle librerie client quando assegni l'errore appropriato.

    Riepilogo dei campi del formato di risposta:

    • version: versione dell'output JSON. Attualmente è supportata solo la versione 1.
    • success: lo stato della risposta. Se true, la risposta deve contenere il token di terze parti, il tipo di token e la scadenza. L'eseguibile deve anche uscire con il codice di uscita 0. Se è false, la risposta deve contenere i campi del messaggio e del codice di errore, nonché uscire con un valore diverso da zero.
    • token_type: tipo di token dell'oggetto di terze parti. Deve essere urn:ietf:params:oauth:token-type:saml2.
    • saml_response: la risposta SAML di terze parti.
    • expiration_time: la scadenza di una risposta SAML di terze parti, in secondi (tempo di epoca Unix).
    • code: la stringa del codice di errore.
    • message: il messaggio di errore.

    Durante l'esecuzione dell'eseguibile, le librerie client completeranno le seguenti variabili di ambiente: * GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE: il campo del pubblico della configurazione delle credenziali. Sempre presente. * GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE: il tipo di token oggetto previsto. Sempre presente. * GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL: l'indirizzo email dell'account di servizio. Presente solo quando viene usato il furto d'identità dell'account di servizio. * GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE: la posizione del file di output dalla configurazione delle credenziali. Presente solo quando specificato nella configurazione delle credenziali.

    Queste variabili di ambiente possono essere utilizzate dall'eseguibile per evitare l'impostazione come hardcoded di questi valori.

    Per abilitare questo metodo di origine delle credenziali con le librerie client, la variabile di ambiente GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES deve essere impostata su 1.

Segui questi passaggi per consentire alle librerie client o a Terraform di utilizzare la federazione delle identità per i carichi di lavoro per l'autenticazione:

  1. Crea 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 Workload Identity.

      Vai a pool di Workload Identity

    2. Trova il pool Workload Identity contenente il provider di identità che vuoi utilizzare e fai clic sul pulsante.

    3. Seleziona Account di servizio collegati.

    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 richieste impostazioni aggiuntive.

      Azure

      Percorso risorsa: URI dell'ID dell'applicazione Azure

      OIDC

      Percorso token OIDC: percorso del file locale o URL da cui ottenere le credenziali.

      Tipo di formato: il formato del file o della risposta URL da cui viene recuperato il token ID.

      Subject token field name (Nome del campo del token dell'oggetto): campo della risposta contenente il token (se il tipo di formato è json).

      SAML

      Percorso di asserzione SAML: percorso di file locale o URL da cui ottenere le credenziali.

      Tipo di formato: il formato del file o della risposta URL da cui viene recuperata l'asserzione.

      Nome campo asserzione: campo nella risposta contenente l'asserzione (se il tipo di formato è json).

    7. Seleziona Scarica configurazione per scaricare il file di configurazione delle credenziali, quindi fai clic su Ignora.

    gcloud

    Crea un file di configurazione delle credenziali utilizzando gcloud iam workload-identity-pools create-cred-config:

    AWS

    Crea 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 i seguenti valori:

    • PROJECT_NUMBER: numero del progetto contenente il pool Workload Identity
    • POOL_ID: ID del pool Workload Identity
    • PROVIDER_ID: ID del provider del pool Workload Identity
    • SERVICE_ACCOUNT_EMAIL: indirizzo email dell'account di servizio
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: durata complessiva del token di accesso all'account di servizio, in secondi; se non viene fornito, il valore predefinito è un'ora. Se è necessaria una durata superiore a un'ora, l'account di servizio deve essere aggiunto come valore consentito in un criterio dell'organizzazione che applica il vincolo constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: file in cui salvare la configurazione

    Se utilizzi AWS ISSLv2, è necessario aggiungere un flag aggiuntivo --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
    

    Azure

    Crea un file di configurazione delle credenziali che consenta alla libreria di ottenere un token di accesso da Azure Instance Metadata Service (ISSL):

    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 i seguenti valori:

    • PROJECT_NUMBER: numero del progetto contenente il pool Workload Identity
    • POOL_ID: ID del pool Workload Identity
    • PROVIDER_ID: ID del provider del pool Workload Identity
    • SERVICE_ACCOUNT_EMAIL: indirizzo email dell'account di servizio
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: durata complessiva del token di accesso all'account di servizio, in secondi; se non viene fornito, il valore predefinito è un'ora. Se è necessaria una durata superiore a un'ora, l'account di servizio deve essere aggiunto come valore consentito in un criterio dell'organizzazione che applica il vincolo constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • APPLICATION_ID_URI: URI dell'ID dell'applicazione Azure
    • FILEPATH: file in cui salvare la configurazione

    OIDC

    Per utilizzare le credenziali provenienti da file, utilizza il flag --credential-source-file:

    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 \
        --output-file=FILEPATH.json \
        --credential-source-file=TOKEN_FILEPATH \
        --credential-source-type=SOURCE_TYPE \
        --credential-source-field-name=FIELD_NAME
    

    Sostituisci i seguenti valori:

    • PROJECT_NUMBER: numero del progetto contenente il pool Workload Identity
    • POOL_ID: ID del pool Workload Identity
    • PROVIDER_ID: ID del provider del pool Workload Identity
    • SERVICE_ACCOUNT_EMAIL: indirizzo email dell'account di servizio
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: durata complessiva del token di accesso all'account di servizio, in secondi; se non viene fornito, il valore predefinito è un'ora. Se è necessaria una durata superiore a un'ora, l'account di servizio deve essere aggiunto come valore consentito in un criterio dell'organizzazione che applica il vincolo constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: file in cui salvare la configurazione
    • TOKEN_FILEPATH: percorso in cui sono archiviati i token ID OIDC
    • SOURCE_TYPE: formato del file del token ID OIDC, impostato su text (valore predefinito) o json
    • FIELD_NAME: campo nel file di testo che contiene il token (se SOURCE_TYPE è json)

    Per utilizzare le credenziali provenienti dall'URL, usa il flag --credential-source-url:

    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 \
        --output-file=FILEPATH.json \
        --credential-source-url="TOKEN_URL" \
        --credential-source-headers="KEY_1=VALUE_1,KEY_2=VALUE_2" \
        --credential-source-type=SOURCE_TYPE \
        --credential-source-field-name=FIELD_NAME
    

    Sostituisci i seguenti valori:

    • PROJECT_NUMBER: numero del progetto contenente il pool Workload Identity
    • POOL_ID: ID del pool Workload Identity
    • PROVIDER_ID: ID del provider del pool Workload Identity
    • SERVICE_ACCOUNT_EMAIL: indirizzo email dell'account di servizio
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: durata complessiva del token di accesso all'account di servizio, in secondi; se non viene fornito, il valore predefinito è un'ora. Se è necessaria una durata superiore a un'ora, l'account di servizio deve essere aggiunto come valore consentito in un criterio dell'organizzazione che applica il vincolo constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: file in cui salvare la configurazione
    • TOKEN_URL: URL per recuperare il token ID OIDC
    • KEY_n, VALUE_n: intestazioni personalizzate da includere nella richiesta HTTP a TOKEN_URL
    • SOURCE_TYPE: formato del file del token ID OIDC, impostato su text (valore predefinito) o json
    • FIELD_NAME: campo nel file di testo che contiene il token (se SOURCE_TYPE è json)

    Per utilizzare le credenziali provenienti dall'eseguibile, utilizza il flag --executable-command:

    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 \
        --output-file=FILEPATH.json \
        --executable-command=EXECUTABLE_COMMAND \
        --executable-timeout-millis=EXECUTABLE_TIMEOUT \
        --executable-output-file=EXECUTABLE_OUTPUT_FILE
    

    Sostituisci i seguenti valori:

    • PROJECT_NUMBER: il numero del progetto contenente il pool Workload Identity
    • POOL_ID: l'ID del pool Workload Identity
    • PROVIDER_ID: l'ID del provider del pool Workload Identity
    • SERVICE_ACCOUNT_EMAIL: l'indirizzo email dell'account di servizio
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: durata complessiva del token di accesso all'account di servizio, in secondi; se non viene fornito, il valore predefinito è un'ora. Se è necessaria una durata superiore a un'ora, l'account di servizio deve essere aggiunto come valore consentito in un criterio dell'organizzazione che applica il vincolo constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: il file in cui salvare la configurazione
    • EXECUTABLE_COMMAND: il comando completo, inclusi gli argomenti, per eseguire il recupero del token ID OIDC (ad es. --executable-command="/path/to/command --foo=bar")
    • EXECUTABLE_TIMEOUT: la durata facoltativa in millisecondi dell'attesa dell'esecuzione dell'eseguibile (il valore predefinito è 30 secondi)
    • EXECUTABLE_OUTPUT_FILE: questo percorso file rimanda alle credenziali di terze parti generate dall'eseguibile. Questo è utile per memorizzare le credenziali nella cache. specificando questo percorso, prima di eseguire il file eseguibile le librerie di autenticazione ne verificano l'esistenza.

    OIDC (AD FS)

    Crea un file di configurazione delle credenziali che consenta alla libreria di leggere il token di accesso di AD FS dal file temporaneo:

    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 \
        --output-file=FILEPATH.json \
        --credential-source-file=TOKEN_FILEPATH \
        --credential-source-type=text
    

    Sostituisci i seguenti valori:

    • PROJECT_NUMBER: numero del progetto contenente il pool Workload Identity
    • POOL_ID: ID del pool Workload Identity
    • PROVIDER_ID: ID del provider del pool Workload Identity
    • SERVICE_ACCOUNT_EMAIL: indirizzo email dell'account di servizio
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: durata complessiva del token di accesso all'account di servizio, in secondi; se non viene fornito, il valore predefinito è un'ora. Se è necessaria una durata superiore a un'ora, l'account di servizio deve essere aggiunto come valore consentito in un criterio dell'organizzazione che applica il vincolo constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: file in cui salvare la configurazione
    • TOKEN_FILEPATH: percorso al file temporaneo contenente il token AD FS

    SAML

    Per utilizzare le credenziali provenienti da file, utilizza il flag --credential-source-file:

    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 \
        --output-file=FILEPATH.json \
        --credential-source-file=TOKEN_FILEPATH \
        --credential-source-type=SOURCE_TYPE \
        --credential-source-field-name=FIELD_NAME \
        --subject-token-type=urn:ietf:params:oauth:token-type:saml2
    

    Sostituisci i seguenti valori:

    • PROJECT_NUMBER: numero del progetto contenente il pool Workload Identity
    • POOL_ID: ID del pool Workload Identity
    • PROVIDER_ID: ID del provider del pool Workload Identity
    • SERVICE_ACCOUNT_EMAIL: indirizzo email dell'account di servizio
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: durata complessiva del token di accesso all'account di servizio, in secondi; se non viene fornito, il valore predefinito è un'ora. Se è necessaria una durata superiore a un'ora, l'account di servizio deve essere aggiunto come valore consentito in un criterio dell'organizzazione che applica il vincolo constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: file in cui salvare la configurazione
    • TOKEN_FILEPATH: percorso in cui vengono archiviate le asserzioni SAML
    • SOURCE_TYPE: formato del file di asserzione SAML, impostato su text (valore predefinito) o json
    • FIELD_NAME: campo nel file di testo contenente l'asserzione (se SOURCE_TYPE è json)

    Per utilizzare le credenziali provenienti dall'URL, usa il flag --credential-source-url:

    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 \
        --output-file=FILEPATH.json \
        --credential-source-url="TOKEN_URL" \
        --credential-source-headers="KEY_1=VALUE_1,KEY_2=VALUE_2" \
        --credential-source-type=source_type \
        --credential-source-field-name=field_name
        --subject-token-type=urn:ietf:params:oauth:token-type:saml2
    

    Sostituisci i seguenti valori:

    • PROJECT_NUMBER: numero del progetto contenente il pool Workload Identity
    • POOL_ID: ID del pool Workload Identity
    • PROVIDER_ID: ID del provider del pool Workload Identity
    • SERVICE_ACCOUNT_EMAIL: indirizzo email dell'account di servizio
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: durata complessiva del token di accesso all'account di servizio, in secondi; se non viene fornito, il valore predefinito è un'ora. Se è necessaria una durata superiore a un'ora, l'account di servizio deve essere aggiunto come valore consentito in un criterio dell'organizzazione che applica il vincolo constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: file in cui salvare la configurazione
    • TOKEN_URL: URL da cui recuperare l'asserzione SAML.
    • KEY_n, VALUE_n: intestazioni personalizzate da includere nella richiesta HTTP a TOKEN_URL
    • SOURCE_TYPE: formato del file di asserzione SAML, impostato su text (valore predefinito) o json
    • FIELD_NAME: campo nel file di testo contenente l'asserzione (se SOURCE_TYPE è json)

    Per utilizzare le credenziali provenienti dall'eseguibile, utilizza il flag --executable-command:

    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 \
        --output-file=FILEPATH.json \
        --executable-command=EXECUTABLE_COMMAND \
        --executable-timeout-millis=EXECUTABLE_TIMEOUT \
        --executable-output-file=EXECUTABLE_OUTPUT_FILE
    

    Sostituisci i seguenti valori:

    • PROJECT_NUMBER: numero del progetto contenente il pool Workload Identity
    • POOL_ID: ID del pool Workload Identity
    • PROVIDER_ID: ID del provider del pool Workload Identity
    • SERVICE_ACCOUNT_EMAIL: indirizzo email dell'account di servizio
    • SERVICE_ACCOUNT_TOKEN_LIFETIME: durata complessiva del token di accesso all'account di servizio, in secondi; se non viene fornito, il valore predefinito è un'ora. Se è necessaria una durata superiore a un'ora, l'account di servizio deve essere aggiunto come valore consentito in un criterio dell'organizzazione che applica il vincolo constraints/iam.allowServiceAccountCredentialLifetimeExtension.
    • FILEPATH: file in cui salvare la configurazione
    • EXECUTABLE_COMMAND: comando completo da eseguire per recuperare l'asserzione SAML
    • EXECUTABLE_TIMEOUT: la durata facoltativa in millisecondi dell'attesa dell'esecuzione dell'eseguibile (il valore predefinito è 30 secondi)
    • EXECUTABLE_OUTPUT_FILE: il file di output facoltativo in cui è archiviata la risposta eseguibile

    Azioni GitHub

    Modifica il file YAML Actions di GitHub e aggiungi quanto segue:

    • Consenti al job di recuperare un token ID GitHub aggiungendo la seguente configurazione:

      permissions:
        id-token: write
        contents: read
      
    • Aggiungi un passaggio per creare un file di configurazione delle credenziali:

      - id: 'auth'
        name: 'Authenticate to Google Cloud'
        uses: 'google-github-actions/auth@v0.3.1'
        with:
          create_credentials_file: true
          workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
          service_account: 'SERVICE_ACCOUNT_EMAIL'
      

    Sostituisci i seguenti valori:

    • PROJECT_NUMBER: numero del progetto contenente il pool Workload Identity
    • POOL_ID: ID del pool Workload Identity
    • PROVIDER_ID: ID del provider del pool Workload Identity
    • SERVICE_ACCOUNT_EMAIL: indirizzo email dell'account di servizio

    Esempio:

    jobs:
      build:
        # Allow the job to fetch a GitHub ID token
        permissions:
          id-token: write
          contents: read
    
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v2
    
          - id: 'auth'
            name: 'Authenticate to Google Cloud'
            uses: 'google-github-actions/auth@v0.3.1'
            with:
              create_credentials_file: true
              workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
              service_account: 'SERVICE_ACCOUNT_EMAIL'
    
  2. Inizializza una variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS e indirizzala al file di configurazione delle credenziali:

    Bash

      export GOOGLE_APPLICATION_CREDENTIALS=`pwd`/FILEPATH.json
      
    dove FILEPATH è il percorso relativo del file per la configurazione delle credenziali.

    PowerShell

      $env:GOOGLE_APPLICATION_CREDENTIALS = Resolve-Path 'FILEPATH.json'
      
    dove FILEPATH è il percorso relativo del file per la configurazione delle credenziali.

    YAML azioni GitHub

    L'azione google-github-actions/auth inizializza automaticamente GOOGLE_APPLICATION_CREDENTIALS.
  3. Utilizza una libreria client che supporti la federazione di Workload Identity e può trovare automaticamente le credenziali:

    C++

    La maggior parte delle librerie client di Google Cloud per C++ supporta la federazione delle identità utilizzando un oggetto ChannelCredentials, creato chiamando grpc::GoogleDefaultCredentials(). Per inizializzare questa credenziale, devi creare le librerie client con la versione 1.36.0 o successive di gRPC.

    La libreria client di Cloud Storage per C++ utilizza l'API REST, non gRPC, quindi non supporta la federazione delle identità.

    Go

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

    Per controllare 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 controllare quale versione di questo artefatto utilizza la tua libreria client, esegui questo comando Maven nella directory della tua applicazione:

    mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
    

    Node.js

    Le librerie client per Node.js supportano la federazione delle identità 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 questo comando nella directory della tua applicazione:

    npm list google-auth-library
    

    Quando crei un oggetto GoogleAuth, puoi specificare un ID progetto oppure consentire a GoogleAuth di trovarlo automaticamente. 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 sul progetto. Per i dettagli, consulta 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 successive del pacchetto google-auth.

    Per controllare quale versione di questo pacchetto utilizza la tua libreria client, esegui questo comando nel 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 oppure 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, sul progetto. Per maggiori dettagli, consulta la guida dell'utente per il pacchetto google-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
    

    dove FILEPATH è 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 utilizzando la federazione delle identità per i carichi di lavoro, utilizza uno dei seguenti metodi:

    Quando utilizzi gsutil in combinazione con gcloud, accedi come di consueto:

    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, FILEPATH è 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 successive dell'interfaccia a riga di comando gcloud.

    bq

    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
    

    dove FILEPATH è 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 dell'interfaccia a riga di comando gcloud.

Autenticazione tramite l'API REST

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

  1. Per ottenere le credenziali dal provider di identità esterno:

    AWS

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

    La federazione di Workload Identity si riferisce a questo documento JSON come token GetCallerIdentity. Il token consente alla federazione delle identità del carico di lavoro di verificare l'identità senza rivelare la chiave di accesso secret di 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 aggiunta come parametri di ricerca. Ad esempio: https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15. Sono supportati anche gli endpoint 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 invierai la richiesta, formattata come stringa ISO 8601 Basic. Questo valore viene di solito impostato sull'ora attuale e viene usato per contribuire a prevenire gli attacchi di riproduzione.
      • x-goog-cloud-target-resource: nome completo della risorsa del provider di identità senza un prefisso https:. Ad esempio:
        //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID
        
      • x-amz-security-token: token della sessione. Obbligatorio solo se utilizzi le credenziali di sicurezza temporanee.

    L'esempio seguente crea un token GetCallerIdentity con codifica URL. Estrai il token con codifica URL per utilizzarlo in seguito. Crea anche un token leggibile per l'utente:

    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():
        # 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 codificato URL GetCallerIdentity generato dallo script sopra.

    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 (AIZ) 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.

    Azioni GitHub

    Usa google-github-actions/auth per ottenere un token ID GitHub e scambiarlo con un token di accesso di breve durata:

    • Consenti al job di recuperare un token ID GitHub aggiungendo la seguente configurazione:

      permissions:
        id-token: write
        contents: read
      
    • Aggiungi un passaggio per generare un token di accesso e renderlo disponibile in una variabile ${{ steps.auth.outputs.access_token }}:

      - id: 'auth'
        name: 'Authenticate to Google Cloud'
        uses: 'google-github-actions/auth@v0.3.1'
        with:
          token_format: 'access_token'
          workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
          service_account: 'SERVICE_ACCOUNT_EMAIL'
      

    Sostituisci i seguenti valori:

    • PROJECT_NUMBER: numero del progetto contenente il pool Workload Identity
    • POOL_ID: ID del pool Workload Identity
    • PROVIDER_ID: ID del provider del pool Workload Identity
    • SERVICE_ACCOUNT_EMAIL: indirizzo email dell'account di servizio

    Esempio:

    jobs:
      build:
        # Allow the job to fetch a GitHub ID token
        permissions:
          id-token: write
          contents: read
    
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v2
    
          - id: 'auth'
            name: 'Authenticate to Google Cloud'
            uses: 'google-github-actions/auth@v0.3.1'
            with:
              token_format: 'access_token'
              workload_identity_provider: 'projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID'
              service_account: 'SERVICE_ACCOUNT_EMAIL'
    

    Ignora i seguenti passaggi.

    OIDC

    Ottieni un token dal provider di identità esterno e inizializza le seguenti variabili:

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:jwt"
    SUBJECT_TOKEN=TOKEN
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = "TOKEN"
    

    Dove TOKEN è il token emesso dal tuo provider di identità esterno.

    OIDC (AD FS)

    Utilizza i comandi PowerShell seguenti per autenticarti in AD FS mediante IWA e ottenere un token di accesso:

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:jwt"
    $SubjectToken = (Invoke-RestMethod `
        -Uri "https://ADFS_DOMAIN/adfs/oauth2/token/" `
        -Method POST `
        -Body @{
            client_id = 'CLIENT_ID'
            grant_type = 'client_credentials'
            scope = 'openid'
            resource = 'RELYING_PARTY_ID'
            use_windows_client_authentication = 'true'
            } `
        -Credential USER).access_token
    

    Sostituisci i seguenti valori:

    • ADFS_DOMAIN: nome di dominio pubblico del server o della fattoria AD FS.
    • CLIENT_ID: ID client della registrazione dell'applicazione in AD FS.
    • RELYING_PARTY_ID: applicazione dell'identificatore di parti utilizzato durante la creazione di un'applicazione API web per il pool Workload Identity in AD FS. Questo parametro è necessario solo se utilizzi un identificativo personalizzato del fare affidamento.
    • USER: utente di Active Directory da utilizzare per IWA. In alternativa, sostituisci -Credential con -UseDefaultCredentials per utilizzare le tue credenziali attuali.

    SAML

    Ottieni un'asserzione dal tuo provider di identità esterno e inizializza una variabile:

    Bash

    SUBJECT_TOKEN_TYPE="urn:ietf:params:oauth:token-type:saml2"
    SUBJECT_TOKEN=ASSERTION
    

    PowerShell

    $SubjectTokenType = "urn:ietf:params:oauth:token-type:saml2"
    $SubjectToken = "ASSERTION"
    

    Dove ASSERTION è la dichiarazione con codifica base64 emessa dal provider di identità esterno.

  2. Utilizza l'API Security Token Service per scambiare le credenziali con un token di accesso di breve durata:

    Bash

    STS_TOKEN=$(curl -0 -X POST https://sts.googleapis.com/v1/token \
        -H 'Content-Type: text/json; charset=utf-8' \
        -d @- <<EOF | jq -r .access_token
        {
            "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"   : "$SUBJECT_TOKEN_TYPE",
            "subjectToken"       : "$SUBJECT_TOKEN"
        }
    EOF
    )
    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 contenente il pool Workload Identity
    • POOL_ID: ID del pool Workload Identity
    • PROVIDER_ID: ID del provider del pool Workload Identity
  3. Utilizza il token del Security Token Service per richiamare il metodo generateAccessToken dell'API IAM Service Account Credentials per 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.

Verifica delle credenziali esterne

L'API Security Token Service utilizza i seguenti passaggi per convalidare le credenziali emesse da un provider di identità esterno.

AWS

  • Verifica i seguenti campi nel token GetCallerIdentity:

    • url deve essere un URI HTTPS con un nome host uguale a sts.amazonaws.com (o un sottodominio a livello di regione) e nessuna porta. Sono esattamente presenti i seguenti parametri di ricerca:
      • action = getcalleridentity
      • version (qualsiasi valore)
    • method è POST
    • Sono presenti esattamente i seguenti headers: x-amz-date, authorization, host, x-goog-cloud-target-resource, x-amz-security-token (facoltativo)
      • Il valore di x-goog-cloud-target-resource è il nome della risorsa per il provider del pool di identità del carico di lavoro.
      • Il valore di x-amz-date è al massimo di 15 minuti nel passato e non nel futuro.
  • Esegui la richiesta in base a sts.amazonaws.com o al sottodominio regionale pertinente e verifica che il risultato sia riuscito e che l'ID account AWS corrisponda all'ID account configurato per il provider del pool di identità del carico di lavoro.

Azure

I token Azure sono token OIDC e sono verificati allo stesso modo dei token OIDC.

Azioni GitHub

I token GitHub sono token OIDC e sono verificati come i token OIDC.

OIDC

I token OIDC vengono verificati in base alla specifica OIDC. Nello specifico, il servizio token di sicurezza esegue i seguenti passaggi:

  • Verifica del documento e della firma di rilevamento:

    • Crea l'URI dell'endpoint di rilevamento aggiungendo /.well-known/openid-configuration all'emittente configurato nel provider del pool di identità del carico di lavoro e recupera il documento di rilevamento OIDC.
    • Verifica che la rivendicazione issuer nel documento di rilevamento sia uguale all'emittente configurato nel provider del pool Workload Identity. STS dispone di logica di verifica personalizzata per i seguenti emittenti che non rispettano la specifica OIDC:
      • Cloud Oracle (https://*.identity.oraclecloud.com)
      • Microsoft (https://login.microsoftonline.com/common/v2.0, https://login.microsoftonline.com/consumers/v2.0, https://login.microsoftonline.com/organizations/v2.0)
    • Recupera il set di chiavi web JSON (JWKS) da jwks_uri elencato nel documento di rilevamento.
    • Se nell'intestazione JWT è presente una rivendicazione kid, verifica la firma JWT utilizzando la chiave di JWKS con l'ID chiave corrispondente oppure rifiuta il token se non viene trovata alcuna chiave corrispondente. Se non è presente alcuna rivendicazione kid nell'intestazione JWT, prova a verificare la firma JWT utilizzando ogni chiave elencata nel JWKS. La firma viene accettata se è possibile utilizzare una chiave qualsiasi per verificarla.
  • Verifica intestazione:

    • Una rivendicazione alg deve essere presente ed essere uguale a RS256 o ES256.
  • Verifica del payload:

    • Una rivendicazione iss deve essere presente e uguale alla rivendicazione issuer nel documento di rilevamento. STS dispone di una logica di verifica personalizzata per i seguenti emittenti che non rispettano la specifica OIDC:
      • Cloud Oracle (https://*.identity.oraclecloud.com)
      • Microsoft (https://login.microsoftonline.com/common/v2.0, https://login.microsoftonline.com/consumers/v2.0, https://login.microsoftonline.com/organizations/v2.0)
    • Una rivendicazione aud deve essere presente ed è uguale a https://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/PROVIDER_ID. Se sono configurati altri segmenti allowed_audiences, la rivendicazione aud deve essere uguale a uno di questi valori.
    • Una rivendicazione di exp deve essere presente e in futuro
    • Deve essere presente una rivendicazione di iat con una data passata.
    • Il valore di exp deve essere superiore al valore di iat al massimo 24 ore.

SAML

  • Decodifica Base64 e rimuove le credenziali SAML in un oggetto Response o Assertion.
  • Se la credenziale SAML è rimossa in un oggetto Response, verifica quanto segue:

    • Il valore StatusCode della risposta è uguale a urn:oasis:names:tc:SAML:2.0:status:Success.
    • È presente esattamente un Assertion.
    • Almeno uno dei Response o il Assertion è firmato. Per ogni firma, prova a verificare la firma utilizzando ogni certificato X.509 configurato nel provider del pool di identità del carico di lavoro. La firma viene accettata se uno dei certificati verifica la firma.
    • Se Response è firmato, il valore Issuer di Response deve essere presente e corrispondere all'ID entità del provider di identità SAML configurato nel provider del pool di identità del carico di lavoro. Verifica inoltre che Format sia omesso o uguale a urn:oasis:names:tc:SAML:2.0:nameid-format:entity.
  • Se la credenziale SAML è rimossa in un oggetto Assertion, verifica quanto segue:

    • Assertion ha firmato. Per ogni firma, prova a verificare la firma utilizzando ogni certificato X.509 configurato nel provider del pool di identità del carico di lavoro. La firma viene accettata se uno qualsiasi dei certificati verifica correttamente la firma.
  • Che la credenziale SAML sia stata annullata in un oggetto Response o Assertion, verifica che Assertion contenga i seguenti attributi:

    • È necessario che un Issuer sia presente e che corrisponda all'ID entità del provider di identità SAML configurato nel provider del pool di identità del carico di lavoro. Format di Issuer è omesso o ha un valore uguale a urn:oasis:names:tc:SAML:2.0:nameid-format:entity.
    • L'elemento IssueInstant deve essere presente e risalente a meno di 1 ora prima dell'ora corrente.
    • Deve essere presente un Subject e contenere i seguenti attributi:
      • Deve essere presente un elemento NameID.
      • Deve essere presente un solo SubjectConfirmation, con Method uguale a urn:oasis:names:tc:SAML:2.0:cm:bearer. NotOnOrAfter deve essere presente in SubjectConfirmationData ed è nel futuro.
      • NotBefore non è presente.
    • Deve essere presente un Conditions e contenere i seguenti attributi:
      • Se è presente un NotBefore, deve essere nel passato.
      • Se è presente un NotOnOrAfter, deve essere nel futuro.
      • Deve essere presente almeno un elemento AudienceRestriction. Tutti gli elementi AudienceRestriction devono contenere un valore Audience uguale al nome della risorsa del provider di pool di identità di carico di lavoro.
    • Deve essere presente almeno un elemento AuthnStatement.
    • Se sono presenti SessionNotOnOrAfter, devono essere tutti nel futuro.

Oltre ai passaggi di verifica specifici per il protocollo indicati sopra, l'API Security Service Token verifica anche che la condizione dell'attributo sia soddisfatta.

Passaggi successivi