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:
Stabilisci la federazione delle identità per i workload configurando l'attendibilità con il trust anchor dei certificati X.509.
Crea un livello di accesso per l'accesso basato su certificato.
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:
L'ultima versione di Google Cloud CLI.
Per eseguire l'aggiornamento all'ultima versione di gcloud CLI, esegui questo comando:
gcloud components updateSe devi installare gcloud CLI, consulta Installa gcloud CLI.
Una configurazione della federazione delle identità per i workload che utilizza il trust anchor dei certificati X.509.
Per utilizzare questa funzionalità, compila il modulo di richiesta di inserimento nella lista consentita per richiedere l'accesso.
Crea un livello di accesso per i certificati
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.
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_IDcon il nome del livello di accesso, ad esempioaccessPolicies/12345/accessLevels/acl_1.
Crea un'associazione di accesso sensibile al contesto per un pool di identità del workload
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/*
- Un'unica identità:
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_IDSostituisci 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
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- Identità singola:
Utilizza
curlper 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 Google Cloud
Per autorizzare i workload della federazione delle identità per i workload utilizzando le librerie clientGoogle Cloud , completa i seguenti passaggi:
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 Google Cloud .
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-filequando generi il file ADC. Se ometti l'argomento, gcloud CLI crea e legge il file ADC dalla directory di configurazione predefinita di gcloud CLI.La funzionalità supporta le librerie client in Go, Python e Java. Devi impostare la variabile di ambiente per attivare mTLS per Python e Java.
Per stabilire e testare rapidamente l'accesso mTLS alle API Google Cloud , puoi utilizzare i seguenti esempi di codice:
Vai
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_IDcon l'ID progettoGoogle Cloud .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=1Python
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_IDcon l'ID progettoGoogle Cloud .Per eseguire un test su una VM di Compute Engine, completa i seguenti passaggi:
- Configura un ambiente Python virtuale.
Installa le librerie richieste:
pip install google-auth google-auth-httplib2 requestsEsegui 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:
Ottieni un token di accesso associato al certificato da Google Cloud Security Token Service tramite un handshake mTLS standard.
Chiama i servizi Google Cloud 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"
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:?}"