Configura l'accesso basato su certificati per la federazione delle identità per i workload

Questo documento descrive come configurare l'accesso basato su certificati per la federazione delle identità per i workload utilizzando i certificati X.509.

L'accesso basato su certificato utilizza mutual TLS (mTLS) per autenticare sia il client che il server durante un TLS handshake. In questo processo, un'associazione mTLS incorpora policy basate sul contesto di trasporto e utilizza lo stato del certificato del client all'interno della sessione TLS per prendere decisioni di autorizzazione.

Per la federazione delle identità per i workload X.509, un'associazione mTLS garantisce che l'intero flusso di autenticazione sia collegato in modo sicuro a un workload attendibile. In questo modo, il rischio di furto di credenziali viene ridotto, perché il sistema associa l'autenticazione a un endpoint specifico e attendibile.

Panoramica della configurazione dell'accesso basato su certificati per la federazione delle identità per i workload

Di seguito è riportata una panoramica generale del processo di configurazione dell'accesso basato su certificati per la federazione delle identità per i workload:

  1. Stabilisci la federazione delle identità per i workload configurando l'attendibilità con il trust anchor dei certificati X.509.

  2. Crea un livello di accesso per l'accesso basato su certificato.

  3. Aggiungi il livello di accesso a una policy di accesso sensibile al contesto che applica l'associazione mTLS.

Prima di iniziare

Verifica di disporre dei seguenti prerequisiti:

Crea un livello di accesso per i certificati

  1. Crea un livello di accesso mTLS. Il livello di accesso mTLS convalida i certificati quando determina l'accesso alle risorse.

    Console

    In Gestore contesto accesso, crea un livello di accesso personalizzato e inserisci la seguente espressione nel campo Espressione CEL: request.auth.matchesMtlsTokens(origin) == true.

    gcloud

    Per creare un livello di accesso personalizzato, esegui questo comando:

    gcloud access-context-manager levels create ACCESS_LEVEL_NAME \
        --title=TITLE \
        --custom-level-spec=FILE \
        --description=DESCRIPTION \
        --policy=POLICY_NAME

    Sostituisci quanto segue:

    • ACCESS_LEVEL_NAME: il nome del livello di accesso.
    • TITLE: il titolo del livello di accesso.
    • FILE: un file YAML con i seguenti contenuti: expression: "request.auth.matchesMtlsTokens(origin) == true".
    • DESCRIPTION: una descrizione del livello di accesso.
    • POLICY_NAME: il nome della policy di accesso.
  2. Esporta il livello di accesso che hai creato in una variabile di ambiente da utilizzare nei passaggi successivi:

      export ACCESS_LEVEL_ID=ACCESS_LEVEL_ID
      

    Sostituisci ACCESS_LEVEL_ID con il nome del livello di accesso, ad esempio accessPolicies/12345/accessLevels/acl_1.

Crea un'associazione di accesso sensibile al contesto per un pool di identità del workload

  1. Imposta le seguenti variabili di ambiente:

    export ORG_ID=ORG_ID
    export CALLER_PROJECT_ID=CALLER_PROJECT_ID
    export FEDERATED_PRINCIPAL=FEDERATED_PRINCIPAL
    

    Sostituisci quanto segue:

    • ORG_ID: l'ID della tua organizzazione.
    • CALLER_PROJECT_ID: l'ID del progetto da utilizzare per chiamare le API.
    • FEDERATED_PRINCIPAL: il nome dell'entità di identità nel pool di identità del workload che rispetta la policy di accesso sensibile al contesto. Puoi utilizzare una delle seguenti opzioni:

      • Un'unica identità: principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
      • Tutte le identità in un pool: principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*

    gcloud

    gcloud alpha access-context-manager cloud-bindings create \
    --organization=ORG_ID \
    --federated-principal=FEDERATED_PRINCIPAL \
    --level=ACCESS_LEVEL_ID \
    --dry-run-level=DRY_RUN_ACCESS_LEVEL_ID
    

    Sostituisci quanto segue:

    • ACCESS_LEVEL_ID: il nome del livello di accesso.
    • DRY_RUN_ACCESS_LEVEL_ID: il nome del livello di accesso dry run. Ti consigliamo di attivare prima un binding della policy dry run per comprendere il potenziale impatto sul traffico esistente.

    curl

    1. Crea un file JSON con l'associazione di accesso sensibile al contesto:

      Puoi fornire un solo livello di accesso in una richiesta, anche se il campo è ripetuto. Puoi utilizzare i seguenti tipi di entità federate:

      • Identità singola: principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
      • Tutte le identità in un pool: principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
      cat <<EOF > request.json
      {
        "principal": {
          "federatedPrincipal": "${FEDERATED_PRINCIPAL:?}"
        },
        "accessLevels": ["${ACCESS_LEVEL_ID:?}"]
      }
      EOF
      
    2. Utilizza curl per inviare la seguente richiesta HTTP:

      curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X POST \
         -H "Authorization: Bearer $(gcloud auth print-access-token)" \
         -H "Content-Type: application/json; charset=utf-8" \
         -d @request.json \
       "https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings"
      

Autorizza utilizzando le librerie client Cloud de Confiance by S3NS

Per autorizzare i workload della federazione delle identità per i workload utilizzando le librerie clientCloud de Confiance , completa i seguenti passaggi:

  1. Crea un file delle Credenziali predefinite dell'applicazione (ADC) configurato per l'autenticazione della federazione delle identità per i workload:

    gcloud iam workload-identity-pools create-cred-config IDENTITY_POOL_ID \
    --credential-cert-path WORKLOAD_CERTIFICATE_PATH \
    --credential-cert-private-key-path WORKLOAD_KEY_PATH \
    --output-file ADC_FILE_OUTPUT_PATH
    

    Sostituisci quanto segue:

    • IDENTITY_POOL_ID: l'ID del pool di identità del workload.
    • WORKLOAD_CERTIFICATE_PATH: il percorso del file del certificato del workload.
    • WORKLOAD_KEY_PATH: il percorso del file della chiave privata del workload.
    • ADC_FILE_OUTPUT_PATH: il percorso di output del file ADC.

    Questo comando genera anche un file di configurazione del certificato nella directory di configurazione predefinita di gcloud CLI. Il file di configurazione del certificato supporta l'autenticazione iniziale e stabilisce gli handshake mTLS per le richieste successive alle risorse Cloud de Confiance .

  2. Imposta una variabile di ambiente in modo che punti al file ADC per rendere le tue credenziali rilevabili dalle librerie client di Google:

    export GOOGLE_APPLICATION_CREDENTIALS=ADC_FILE_OUTPUT_PATH
    

    Questo passaggio è facoltativo se ometti l'argomento --output-file quando generi il file ADC. Se ometti l'argomento, gcloud CLI crea e legge il file ADC dalla directory di configurazione predefinita di gcloud CLI.

  3. La funzionalità supporta le librerie client in Go, Python e Java. Devi impostare la variabile di ambiente per attivare mTLS per Python e Java.

  4. Per stabilire e testare rapidamente l'accesso mTLS alle API Cloud de Confiance , puoi utilizzare i seguenti esempi di codice:

    Vai

    1. Utilizza l'esempio seguente per creare un file Go, ad esempio golang_test.go:

      package golang_test
      
      import (
           "io"
           "log"
           "testing"
      
           "cloud.google.com/go/auth/credentials"
           "cloud.google.com/go/auth/httptransport"
      )
      
      func TestGoExample(t *testing.T) {
      
           scopes := []string{
                   "https://www.googleapis.com/auth/pubsub", // Scope for Pub/Sub access
                   // Add other scopes as needed
           }
      
           dopts := credentials.DetectOptions{
                   Scopes: scopes,
           }
      
           // Create httptransport.Options with the scopes
           opts := &httptransport.Options{
                   DetectOpts: &dopts,
           }
           hc, err := httptransport.NewClient(opts)
           if err != nil {
                   t.Fatalf("NewHTTPClient: %v", err)
           }
      
           resp, err := hc.Get("https://pubsub.mtls.googleapis.com/v1/projects/PROJECT_ID/topics")
           if err != nil {
                   t.Fatalf("Get: %v", err)
           }
           t.Logf("Status: %s", resp.Status)
      
           t.Cleanup(func() {
                  resp.Body.Close()
           })
      
           b, err := io.ReadAll(resp.Body)
           if err != nil {
                  t.Fatal(err)
           }
           log.Println(string(b))
      }
      

      Sostituisci PROJECT_ID con l'ID progettoCloud de Confiance .

    2. Per eseguire un test su una VM di Compute Engine, utilizza il seguente comando:

    go mod init example.com
    go mod tidy
    go test -v golang_test.go --count=1
    

    Python

    1. Utilizza l'esempio seguente per creare un file di test, ad esempio python_test.py:

      import google.auth
      import google.auth.transport.requests
      import requests
      
      def test_python_example():
      # Define the required scopes for your application
      scopes = [
         "https://www.googleapis.com/auth/pubsub",  # Scope for Pub/Sub access
         # Add other scopes as needed
      ]
      
      # Obtain Application Default Credentials (ADC) with the specified scopes
      credentials, _ = google.auth.default(scopes=scopes)
      
      # Create an authorized HTTP session using the ADC credentials
      authed_session = google.auth.transport.requests.AuthorizedSession(credentials)
      
      try:
       # Make a GET request to the Pub/Sub API endpoint
       response = authed_session.get(
           "https://pubsub.mtls.googleapis.com/v1/projects/PROJECT_ID/topics"
       )
      
       # Check if the request was successful
       response.raise_for_status()  # Raise an exception for error statuses
      
       # Log the response status and content
       print(f"Status: {response.status_code}")
       print(response.text)
      
      except requests.exceptions.RequestException as e:
       print(f"Error making the request: {e}")
      
      if __name__ == "__main__":
      test_python_example()
      

      Sostituisci PROJECT_ID con l'ID progettoCloud de Confiance .

    2. Per eseguire un test su una VM di Compute Engine, completa i seguenti passaggi:

      1. Configura un ambiente Python virtuale.
      2. Installa le librerie richieste:

        pip install google-auth google-auth-httplib2 requests
        
      3. Esegui il test:

        python3 python_test.py
        

Autorizza utilizzando richieste HTTP semplici

Per autorizzare i workload della federazione delle identità per i workload utilizzando richieste HTTP semplici, completa i seguenti passaggi:

  1. Ottieni un token di accesso associato al certificato da Cloud de Confiance Security Token Service tramite un handshake mTLS standard.

  2. Chiama i servizi Cloud de Confiance con il token di accesso ottenuto da Security Token Service. Questo esempio esegue una query su Cloud Storage:

    curl --key WORKLOAD_KEY_PATH --cert WORKLOAD_CERTIFICATE_PATH \
     -X GET "https://storage.mtls.googleapis.com/RESOURCE_PATH" \
     -H "Authorization: Bearer $ACCESS_TOKEN"
    
  3. L'associazione mTLS impone l'utilizzo di mTLS. Esegui questo comando per verificare che una connessione non mTLS non vada a buon fine con un errore di autorizzazione:

    curl -X GET "https://storage.googleapis.com/RESOURCE_PATH" \
     -H "Authorization: Bearer $ACCESS_TOKEN"
    

Elenca l'associazione delle policy

Per elencare l'associazione delle policy per la federazione delle identità per i workload, esegui questo comando:

gcloud

Il seguente comando elenca le associazioni specifiche all'interno di un'organizzazione, filtrando quelle che si applicano alle entità federate:

gcloud alpha access-context-manager cloud-bindings list \
--organization=ORG_ID \
--filter='principal:federatedPrincipal'

curl

curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings?filter=principal%3Afederated_principal"

Aggiorna un'associazione delle policy

Per aggiornare un'associazione delle policy, completa i seguenti passaggi:

gcloud

gcloud alpha access-context-manager cloud-bindings update \
--binding=BINDING_ID \
--organization=ORG_ID \
--level=NEW_ACCESS_LEVEL_ID

curl

Aggiungi il nuovo livello di accesso al file request.json ed esegui il seguente comando:

curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X PATCH \
 -H "Authorization: Bearer $(gcloud auth print-access-token)" \
 -H "Content-Type: application/json; charset=utf-8" \
 -d @request.json \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings/${BINDING_ID:?}?updateMask=access_levels"

Elimina un'associazione di policy

Per eliminare un'associazione delle policy, esegui questo comando:

gcloud

gcloud alpha access-context-manager cloud-bindings delete \
--binding=BINDING_ID \
--organization=ORG_ID

curl

curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X DELETE \
   -H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings/${BINDING_ID:?}"

Passaggi successivi