In diesem Dokument wird beschrieben, wie Sie den zertifikatbasierten Zugriff für die Workload Identity-Föderation mit X.509-Zertifikaten konfigurieren.
Beim zertifikatsbasierten Zugriff wird Mutual TLS (mTLS) verwendet, um sowohl den Client als auch den Server während eines TLS-Handshakes zu authentifizieren. Bei diesem Prozess werden in eine mTLS-Bindung Richtlinien auf Grundlage des Transportkontexts aufgenommen und der Status des Clientzertifikats in der TLS-Sitzung verwendet, um Autorisierungsentscheidungen zu treffen.
Bei der X.509-Identitätsföderation von Arbeitslasten sorgt eine mTLS-Bindung dafür, dass der gesamte Authentifizierungsablauf sicher an eine vertrauenswürdige Arbeitslast gebunden ist. Dadurch wird das Risiko eines Diebstahls von Anmeldedaten verringert, da die Authentifizierung an einen bestimmten, vertrauenswürdigen Endpunkt gebunden ist.
Übersicht über den zertifikatbasierten Zugriff für die Konfiguration der Workload Identity-Föderation
Im Folgenden finden Sie einen allgemeinen Überblick über den Prozess zum Konfigurieren des zertifikatbasierten Zugriffs für die Identitätsföderation von Arbeitslasten:
Richten Sie eine Workload Identity-Föderation ein, indem Sie das Vertrauen mit dem Vertrauensanker der X.509-Zertifikate konfigurieren.
Erstellen Sie eine Zugriffsebene für den zertifikatbasierten Zugriff.
Fügen Sie die Zugriffsebene einer Richtlinie für den kontextsensitiven Zugriff hinzu, die die mTLS-Bindung erzwingt.
Hinweise
Prüfen Sie, ob die folgenden Voraussetzungen erfüllt sind:
Die neueste Version der Google Cloud CLI
Führen Sie den folgenden Befehl aus, um auf die neueste Version der Google Cloud CLI zu aktualisieren:
gcloud components update
Informationen zur Installation der Google Cloud CLI finden Sie unter Google Cloud CLI installieren.
Eine Konfiguration für die Workload Identity-Föderation, die den Vertrauensanker Ihrer X.509-Zertifikate verwendet
Wenn Sie dieses Feature verwenden möchten, füllen Sie das folgende Formular aus, um auf die Zulassungsliste gesetzt zu werden: Formular für die Zulassungsliste. Sie werden benachrichtigt, sobald Sie auf die Zulassungsliste gesetzt wurden.
Zugriffsebene für Zertifikate erstellen
Erstellen Sie eine mTLS-Zugriffsebene. Bei der mTLS-Zugriffsebene werden Zertifikate validiert, wenn der Zugriff auf Ressourcen bestimmt wird.
Console
Erstellen Sie in Access Context Manager eine benutzerdefinierte Zugriffsebene und geben Sie den folgenden Ausdruck in das Feld für CEL-Ausdrücke ein:
request.auth.matchesMtlsTokens(origin) == true
.gcloud
Führen Sie den folgenden Befehl aus, um eine benutzerdefinierte Zugriffsebene zu erstellen:
gcloud access-context-manager levels create ACCESS_LEVEL_NAME
--title=TITLE
--custom-level-spec=FILE
--description=DESCRIPTION
--policy=POLICY_NAMEErsetzen Sie Folgendes:
ACCESS_LEVEL_NAME
: der Name der Zugriffsebene.TITLE
: Der Titel der Zugriffsebene.FILE
: Eine YAML-Datei mit dem folgenden Inhalt:request.auth.matchesMtlsTokens(origin) == true
.DESCRIPTION
: Eine Beschreibung der Zugriffsebene.POLICY_NAME
: Der Name der Zugriffsrichtlinie.
Exportieren Sie die erstellte Zugriffsebene in eine Umgebungsvariable. Diese Variable wird in den folgenden Schritten verwendet.
export ACCESS_LEVEL_ID=ACCESS_LEVEL_ID
Ersetzen Sie
ACCESS_LEVEL_ID
durch den Namen der Zugriffsebene, z. B.accessPolicies/12345/accessLevels/acl_1
.
Bindung für kontextsensitiven Zugriff für einen Workload Identity-Pool erstellen
Legen Sie die folgenden Umgebungsvariablen fest:
export ORG_ID=ORG_ID export CALLER_PROJECT_ID=CALLER_PROJECT_ID export FEDERATED_PRINCIPAL=FEDERATED_PRINCIPAL
Ersetzen Sie Folgendes:
ORG_ID
: ID Ihrer Organisation.CALLER_PROJECT_ID
: Die ID des Projekts, das zum Aufrufen der APIs verwendet werden soll.FEDERATED_PRINCIPAL
: Der Name des Identitätshauptkontos im Workload Identity-Pool, das der richtlinienbasierten Zugriffsrichtlinie entspricht. Sie haben die folgenden Möglichkeiten:eine einzelne Identität mit dem Format –
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
ODER
Alle Identitäten in einem Pool mit dem Format –
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
Ersetzen Sie Folgendes:
ACCESS_LEVEL_ID
: der Name der Zugriffsebene.DRY_RUN_ACCESS_LEVEL_ID
: der Name der Zugriffsebene für den Probebetrieb. Wir empfehlen, zuerst eine Richtlinienbindung für den Probelauf zu aktivieren, um die potenziellen Auswirkungen auf den vorhandenen Traffic zu ermitteln.
curl
Erstellen Sie eine JSON-Datei mit der kontextsensitiven Zugriffsberechtigungsbindung.
Sie können in einer Anfrage nur eine Zugriffsebene angeben, auch wenn das Feld wiederholt wird. Sie können die folgenden Arten von föderierten Identitäten verwenden:
- Einzelne Identität:
principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
- Alle Identitäten in einem Pool:
principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
echo { \ \"principal\": { \ \"federatedPrincipal\": \"${FEDERATED_PRINCIPAL:?}\" \ },\ \"accessLevels\": [\"${ACCESS_LEVEL_ID:?}\"] \ } \ >> request.json
- Einzelne Identität:
Verwenden Sie
curl
, um die folgende HTTP-Anfrage zu senden.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"
Autorisierung mit den Google Cloud Clientbibliotheken
Führen Sie die folgenden Schritte aus, um Arbeitslasten der Mitarbeiteridentitätsföderation mit denGoogle Cloud -Clientbibliotheken zu autorisieren.
Erstellen Sie eine ADC-Datei (Standardanmeldedaten für Anwendungen), die für die Authentifizierung mit der Mitarbeiteridentitätsföderation konfiguriert ist.
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
Ersetzen Sie Folgendes:
IDENTITY_POOL_ID
: die ID Ihres Workload Identity-Pools.WORKLOAD_CERTIFICATE_PATH
: der Pfad zur Zertifikatsdatei Ihres Arbeitslast.WORKLOAD_KEY_PATH
: der Pfad zur privaten Schlüsseldatei Ihrer Arbeitslast.ADC_FILE_OUTPUT_PATH
: Der Ausgabepfad für die ADC-Datei.
Mit diesem Befehl wird auch eine Zertifikatskonfigurationsdatei in Ihrem Standardkonfigurationsverzeichnis der gcloud CLI generiert. Die Zertifikatskonfigurationsdatei unterstützt die anfängliche Authentifizierung und richtet mTLS-Handshakes für nachfolgende Anfragen an Google Cloud -Ressourcen ein.
Legen Sie eine Umgebungsvariable fest, die auf die ADC-Datei verweist. Dadurch können Ihre Anmeldedaten von Google-Clientbibliotheken gefunden werden.
export GOOGLE_APPLICATION_CREDENTIALS=${application_default_credentials.json}
Dieser Schritt ist optional, wenn Sie das Argument
--output-file
beim Generieren der ADC-Datei weglassen. Wenn Sie das Argument weglassen, wird die ADC-Datei in Ihrem Standardkonfigurationsverzeichnis der gcloud CLI erstellt und daraus gelesen.Führen Sie die folgenden Schritte aus, um den Zugriff auf die Google Cloud APIs einzurichten und zu testen. Sie können entweder Go oder Python verwenden.
Go
Verwenden Sie das folgende Beispiel, um eine Go-Datei wie
golang_test.go
zu erstellen.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)) }
Ersetzen Sie PROJECT_ID durch die ID Ihres gcloud CLI-Projekts.
Verwenden Sie den folgenden Befehl, um einen Test auf einer Compute Engine-VM auszuführen.
go mod init example.com go mod tidy go test -v golang_test.go --count=1
Python
Verwenden Sie das folgende Beispiel, um eine Testdatei wie
python_test.py
zu erstellen.import google.auth import google.auth.transport.requests import requests def test_go_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_go_example()
Ersetzen Sie PROJECT_ID durch Ihre gcloud CLI-Projekt-ID.
Führen Sie die folgenden Schritte aus, um einen Test auf einer Compute Engine-VM auszuführen.
- Richten Sie eine virtuelle Python-Umgebung ein.
Installieren Sie die erforderlichen Bibliotheken.
pip install google-auth google-auth-httplib2 requests
Test ausführen:
python3 python_test.py
Mit einfachen HTTP-Anfragen autorisieren
Führen Sie die folgenden Schritte aus, um Arbeitslasten der Workforce Identity-Föderation mit einfachen HTTP-Anfragen zu autorisieren.
Ein zertifikatsgebundenes Zugriffstoken vom Google Cloud Security Token Service über einen standardmäßigen mTLS-Handshake abrufen.
Rufen Sie die Google Cloud -Dienste mit dem Zugriffstoken auf, das Sie vom Security Token Service erhalten haben. In diesem Beispiel wird Cloud Storage abgefragt.
$ curl --key ${workload_key.pem} --cert ${workload_cert.pem} -X GET 'https://storage.mtls.googleapis.com/{replace_with_your_resources}' -H "Authorization: Bearer $ACCESS_TOKEN"
Die mTLS-Bindung erzwingt die Verwendung von mTLS. Führen Sie den folgenden Befehl aus, um zu prüfen, ob eine Nicht-mTLS-Verbindung mit einem Autorisierungsfehler fehlschlägt.
$ curl -X GET 'https://storage.googleapis.com/{replace_with_your_resources}' -H "Authorization: Bearer $ACCESS_TOKEN"
Richtlinienbindung auflisten
Führen Sie den folgenden Befehl aus, um die Richtlinienbindung für die Workload Identity Federation aufzulisten.
gcloud
Mit dem folgenden Befehl werden bestimmte Bindungen in einer bestimmten Organisation aufgelistet und nach Bindungen gefiltert, die für Verbundhauptkonten gelten.
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"
Richtlinienbindung aktualisieren
Wenn Sie eine Richtlinienbindung aktualisieren möchten, fügen Sie die neue Zugriffsebene in eine JSON-Datei ein und führen Sie den folgenden Befehl aus.
gcloud
gcloud alpha access-context-manager cloud-bindings update \ --binding=BINDING_ID
\ --level=NEW_ACCESS_LEVEL_ID
curl
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"
Richtlinienbindung löschen
Führen Sie den folgenden Befehl aus, um eine Richtlinienbindung zu löschen.
gcloud
gcloud alpha access-context-manager cloud-bindings delete \
--binding=BINDING_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:?}"
Fehlerbehebung
Im Folgenden finden Sie einige häufige Probleme und Vorschläge, wie Sie sie beheben können:
Fehler:
403 Forbidden, user does not have permission.
Maßnahme:Prüfen Sie in der IAM-Richtlinie, ob der Workload-Identitätspool Zugriff auf Ihre Google Cloud -Ressource hat.
Fehler:
Unauthorized_client: Could not obtain a value for google.subject from the given credential.
Aktion:Das Backend konnte anhand der Attributzuordnung keinen Wert für
google.subject
aus Ihrem Clientzertifikat extrahieren. Prüfen Sie Ihr Clientzertifikat, um festzustellen, ob das Feld, das Sie für die Zuordnung verwenden, einen Wert hat.Wenn nach der Aktivierung des kontextsensitiven Zugriffs unerwartete Zugriffsverweigerungen auftreten, können Sie den Traffic schnell entsperren, indem Sie die Bindung für den kontextsensitiven Zugriff mit dem folgenden Befehl entfernen:
gcloud alpha access-context-manager cloud-bindings delete
Nachdem der Zugriff wiederhergestellt wurde, sehen Sie sich das Audit-Log an, um festzustellen, warum die Anfragen abgelehnt wurden.