Wenn Ihre Architektur mehrere Dienste verwendet, müssen diese Dienste entweder asynchron oder synchron miteinander kommunizieren. Viele dieser Dienste sind möglicherweise privat und erfordern daher Anmeldedaten für den Zugriff.
Für die asynchrone Kommunikation können Sie die folgenden Google Cloud-Dienste verwenden:
- Cloud Tasks für eine asynchrone 1:1-Kommunikation
- Pub/Sub für eine asynchrone 1:n-, 1:1- und n:1-Kommunikation
- Cloud Scheduler für eine regelmäßig geplante asynchrone Kommunikation
- Eventarc für die ereignisbasierte Kommunikation
In allen diesen Fällen verwaltet der verwendete Dienst die Interaktion mit dem empfangenden Dienst basierend auf der von Ihnen eingerichteten Konfiguration.
Für die synchrone Kommunikation ruft Ihr Dienst jedoch einen anderen Dienst direkt über HTTP mit seiner Endpunkt-URL auf. Für diesen Anwendungsfall sollten Sie darauf achten, dass jeder Dienst nur Anfragen an bestimmte Dienste senden kann. Wenn Sie zum Beispiel einen login
-Dienst haben, sollte dieser auf den user-profiles
-Dienst, aber nicht auf den search
-Dienst zugreifen können.
In diesem Fall empfiehlt Google, dass Sie IAM und eine Dienstidentität verwenden, die auf einem nutzerverwalteten Dienstkonto pro Dienst basiert, dem die minimalen Berechtigungen gewährt wurden, die für die Ausführung seiner Arbeit erforderlich sind.
Außerdem muss die Anfrage einen Nachweis der Identität des aufrufenden Dienstes liefern. Konfigurieren Sie dazu Ihren Aufrufdienst so, dass er ein von Google signiertes OpenID Connect-ID-Token als Teil der Anfrage hinzufügt.
Dienstkonto einrichten
Wenn Sie ein Dienstkonto einrichten möchten, konfigurieren Sie den empfangenden Dienst so, dass Anfragen vom aufrufenden Dienst akzeptiert werden. Legen Sie dazu das Dienstkonto des aufrufenden Dienstes als Hauptkonto im empfangenden Dienst fest. Anschließend gewähren Sie dem Dienstkonto die Rolle „Cloud Run-Aufrufer” (roles/run.invoker
). Folgen Sie den Anleitungen auf dem entsprechenden Tab, um beide Aufgaben zu erledigen:
Console-UI
Öffnen Sie die Google Cloud Console:
Wählen Sie den empfangenden Dienst aus.
Klicken Sie oben rechts auf Infofeld ansehen, um den Tab Berechtigungen aufzurufen.
Klicken Sie auf Hauptkonto hinzufügen.
Geben Sie die Identität des aufrufenden Dienstes ein. Dies ist normalerweise eine E-Mail-Adresse, standardmäßig
PROJECT_NUMBER-compute@developer.gserviceaccount.com
.Wählen Sie im Drop-down-Menü Rolle auswählen die Rolle
Cloud Run Invoker
aus.Klicken Sie auf Speichern.
gcloud
Führen Sie den Befehl gcloud run services add-iam-policy-binding
aus:
gcloud run services add-iam-policy-binding RECEIVING_SERVICE \ --member='serviceAccount:CALLING_SERVICE_IDENTITY' \ --role='roles/run.invoker'
Dabei ist RECEIVING_SERVICE
der Name des empfangenden Dienstes und CALLING_SERVICE_IDENTITY
die E-Mail-Adresse des Dienstkontos, standardmäßig PROJECT_NUMBER-compute@developer.gserviceaccount.com
.
Terraform
Informationen zum Anwenden oder Entfernen einer Terraform-Konfiguration finden Sie unter Grundlegende Terraform-Befehle.
Mit dem folgenden Terraform-Code wird ein anfänglicher Cloud Run-Dienst erstellt, der öffentlich sein soll.
Ersetzen Sie us-docker.pkg.dev/cloudrun/container/hello
durch einen Verweis auf Ihr Container-Image.
Mit folgendem Terraform-Code wird der anfängliche Dienst öffentlich.
Mit dem folgenden Terraform-Code wird ein zweiter Cloud Run-Dienst erstellt, der privat sein soll.
Ersetzen Sie us-docker.pkg.dev/cloudrun/container/hello
durch einen Verweis auf Ihr Container-Image.
Mit dem folgenden Terraform-Code wird der zweite Dienst privat.
Mit dem folgenden Terraform-Code wird ein Dienstkonto erstellt.
Mit dem folgenden Terraform-Code können Dienste, die an das Dienstkonto angehängt sind, den ursprünglichen privaten Cloud Run-Dienst aufrufen.
ID-Token abrufen und konfigurieren
Nachdem Sie dem aufrufenden Dienstkonto die entsprechende Rolle zugewiesen haben, führen Sie die folgenden Schritte aus:
Rufen Sie ein von Google signiertes ID-Token mit einer der im folgenden Abschnitt beschriebenen Methoden ab. Legen Sie die Zielgruppenanforderung (
aud
) auf die URL des empfangenden Dienstes oder eine konfigurierte benutzerdefinierte Zielgruppe fest. Wenn Sie keine benutzerdefinierte Zielgruppe verwenden, muss der Wertaud
als URL des Dienstes bleiben, auch wenn Sie Anfragen an ein bestimmtes Traffic-Tag senden.Fügen Sie das ID-Token, das Sie im vorherigen Schritt abgerufen haben, in einen der folgenden Header in der Anfrage an den empfangenden Dienst ein:
- Ein
Authorization: Bearer ID_TOKEN
-Header. - Ein
X-Serverless-Authorization: Bearer ID_TOKEN
-Header. Sie können diesen Header verwenden, wenn Ihre Anwendung bereits den HeaderAuthorization
für die benutzerdefinierte Autorisierung verwendet. Dadurch wird die Signatur entfernt, bevor das Token an den Nutzercontainer übergeben wird.
- Ein
Weitere Möglichkeiten zum Abrufen eines ID-Tokens, das auf dieser Seite nicht beschrieben wird, finden Sie unter Methoden zum Abrufen eines ID-Tokens.
Authentifizierungsbibliotheken verwenden
Die einfachste und zuverlässigste Methode zum Abrufen und Konfigurieren des ID-Token-Prozesses ist die Verwendung der Authentifizierungsbibliotheken.
Dieser Code funktioniert in jeder Umgebung, auch außerhalb von Google Cloud, in der die Bibliotheken Anmeldedaten zur Authentifizierung für ein Dienstkonto abrufen können, einschließlich Umgebungen, die lokale Standardanmeldedaten für Anwendungen unterstützen.
Zum Festlegen der Standardanmeldedaten für Anwendungen laden Sie eine Dienstkonto-Schlüsseldatei herunter und legen Sie für die Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS
den Pfad der Dienstkonto-Schlüsseldatei fest. “ Weitere Informationen finden Sie unter Funktionsweise von Standardanmeldedaten für Anwendungen.
Dieser Code funktioniert nicht zum Abrufen von Authentifizierungsdaten für ein Nutzerkonto.
Node.js
Python
Go
Java
Metadatenserver verwenden
Wenn Sie die Authentifizierungsbibliotheken nicht verwenden können, können Sie ein ID-Token vom Compute-Metadatenserver abrufen, während Ihr Container in Cloud Run ausgeführt wird. Beachten Sie, dass diese Methode nicht außerhalb von Google Cloud funktioniert, auch von Ihrem lokalen Computer.
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=[AUDIENCE]" \
-H "Metadata-Flavor: Google"
Dabei ist ZIELGRUPPE die URL des Dienstes, den Sie aufrufen, oder eine konfigurierte benutzerdefinierte Zielgruppe.
In der folgenden Tabelle sind die wichtigsten Teile einer Metadatenabfrage zusammengefasst:
Komponenten | Beschreibung |
---|---|
Stamm-URL | Alle Metadatenwerte werden als Subpfade unterhalb der folgenden Stamm-URL definiert: http://metadata.google.internal/computeMetadata/v1 |
Anfrage-Header | Der folgende Header muss in jeder Anfrage enthalten sein: Metadata-Flavor: Google Dieser Header weist darauf hin, dass eine Anfrage zum Aufruf von Metadatenwerten gesendet wurde und diese nicht unbeabsichtigt aus einer unsicheren Quelle kommen. Auf diese Weise kann der Metadatenserver Ihnen die entsprechenden Daten zurückgeben. Ohne diesen Header lehnt der Metadatenserver Ihre Anfrage ab. |
Eine Schritt-für-Schritt-Anleitung einer Anwendung, die die Dienst-zu-Dienst-Authentifizierungsmethode verwendet, finden Sie in der Anleitung zum Sichern von Cloud Run-Diensten.
Workload Identity-Föderation von außerhalb von Google Cloud verwenden
Wenn Ihre Umgebung einen Identitätsanbieter verwendet, der von der Workload Identity-Föderation unterstützt wird, können Sie sich mit der folgenden Methode sicher von außerhalb von Google Cloud bei Ihrem Cloud Run-Dienst authentifizieren:
Richten Sie Ihr Dienstkonto wie auf dieser Seite beschrieben unter Dienstkonto einrichten ein.
Konfigurieren Sie die Workload Identity-Föderation für Ihren Identitätsanbieter, wie unter Workload Identity-Föderation konfigurieren beschrieben.
Folgen Sie der Anleitung unter Externe Identitäten die Berechtigung erteilen, die Identität eines Dienstkontos zu übernehmen.
Verwenden Sie die REST API, um ein kurzlebiges Token zu erhalten. Rufen Sie jedoch
generateAccessToken
auf, um ein Zugriffstoken abzurufen.generateIdToken
abrufen, um ein ID-Token zu erhalten.Zum Beispiel mit cURL:
ID_TOKEN=$(curl -0 -X POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT:generateIdToken \ -H "Content-Type: text/json; charset=utf-8" \ -H "Authorization: Bearer $STS_TOKEN" \ -d @- <<EOF | jq -r .token { "audience": "SERVICE_URL" } EOF ) echo $ID_TOKEN
Dabei ist
SERVICE_ACCOUNT
die E-Mail-Adresse des Dienstkontos, für das der Workload Identity-Pool konfiguriert ist, undSERVICE_URL
die URL des Cloud Run-Dienstes. Sie rufen auf. Der Wert sollte die URL des Dienstes bleiben, auch wenn Sie Anfragen an ein bestimmtes Traffic-Tag senden.$STS_TOKEN
ist das Token des Security Token Service, das Sie im vorherigen Schritt in der Anleitung zur Föderation von Workload Identity erhalten haben.
Sie können das ID-Token aus dem vorherigen Schritt in die Anfrage an den Dienst einfügen. Verwenden Sie dazu einen Authorization: Bearer ID_TOKEN
-Header oder einen X-Serverless-Authorization: Bearer ID_TOKEN
-Header. Wenn beide Header angegeben sind, wird nur der Header X-Serverless-Authorization
aktiviert.
Heruntergeladene Dienstkontoschlüssel von außerhalb von Google Cloud verwenden
Wenn die Workload Identity-Föderation für Ihre Umgebung nicht geeignet ist, können Sie sich von außerhalb von Google Cloud mit einem heruntergeladenen Dienstkontoschlüssel authentifizieren. Aktualisieren Sie Ihren Clientcode so, dass die Authentifizierungsbibliotheken wie oben beschrieben mit Standardanmeldedaten für Anwendungen verwendet werden.
Sie können ein von Google signiertes ID-Token mit einem selbst signierten JWT abrufen. Dies ist jedoch kompliziert und möglicherweise fehleranfällig. Die grundlegenden Schritte sind:
Signieren Sie ein Dienstkonto-JWT mit der Anforderung
target_audience
, die auf die URL des empfangenden Dienstes oder eine konfigurierte benutzerdefinierte Zielgruppe festgelegt ist. Wenn Sie keine benutzerdefinierten Domains verwenden, sollte der Werttarget_audience
als URL des Dienstes bleiben, auch wenn Sie Anfragen an ein bestimmtes Traffic-Tag senden.Tauschen Sie das selbst signierte JWT gegen ein von Google signiertes ID-Token aus, bei dem die Anforderung
aud
auf die oben verwendete URL festgelegt ist.Fügen Sie das ID-Token in der Anfrage an den Dienst mit einem
Authorization: Bearer ID_TOKEN
-Header oder einemX-Serverless-Authorization: Bearer ID_TOKEN
-Header ein. Wenn beide Header angegeben sind, wird nur der HeaderX-Serverless-Authorization
aktiviert.
In diesem Cloud Run-Funktionen-Beispiel finden Sie ein Beispiel der oben genannten Schritte.
Authentifizierte Anfragen empfangen
Innerhalb des privaten empfangenden Dienstes können Sie den Autorisierungsheader parsen, um die vom Bearer-Token gesendeten Informationen zu empfangen.