Zum Aufrufen authentifizieren
Damit eine authentifizierte Cloud Run Function aufgerufen werden kann, muss das zugrunde liegende Hauptkonto die folgenden Anforderungen erfüllen:
- Es ist berechtigt, die Funktion aufzurufen.
- Es muss ein ID-Token angeben, wenn die Funktion aufgerufen wird.
Was ist ein Hauptkonto? Wie im Hilfeartikel Cloud Run Functions schützen beschrieben, unterstützen Cloud Run Functions zwei verschiedene Arten von Identitäten, die auch Hauptkonten genannt werden:
- Dienstkonten: Dies sind spezielle Konten, die als Identität einer Nicht-Identität verwendet werden, beispielsweise eine Funktion, eine Anwendung oder eine VM. Sie bieten Ihnen die Möglichkeit, diese Nicht-Personen zu authentifizieren.
- Nutzerkonten: Diese Konten stellen Personen dar, entweder als einzelne Google-Kontoinhaber oder als Teil einer von Google kontrollierten Entität wie einer Google-Gruppe.
Weitere Informationen zu den grundlegenden IAM-Konzepten finden Sie in der IAM-Übersicht.
Zum Aufrufen einer authentifizierten Cloud Run-Funktion muss das Hauptkonto die IAM-Berechtigung für Aufrufer haben:
run.routes.invoke
. Dies geschieht normalerweise über die Rolle Cloud Run Invoker. Diese Berechtigung muss der Cloud Run-Dienstressource zugewiesen werden.
Verwenden Sie zum Erteilen dieser Berechtigungen den Befehl add-invoker-policy-binding
, wie unter Feature für Funktionsaufrufe authentifizieren beschrieben.
Zum Erstellen, Aktualisieren oder Ausführen anderer administrativer Aktionen für eine Funktion muss das Hauptkonto eine entsprechende Rolle haben. Rollen enthalten Berechtigungen, die die Aktionen definieren, die das Hauptkonto ausführen darf. Weitere Informationen finden Sie unter IAM zum Autorisieren von Zugriff verwenden.
Das Aufrufen einer Funktion kann zusätzliche Komplexitäten haben. Ereignisgesteuerte Funktionen können nur von der Ereignisquelle aufgerufen werden, für die sie abonniert sind. HTTP-Funktionen können jedoch von unterschiedlichen Identitäten aufgerufen werden. Der Aufrufer ist zum Beispiel ein Entwickler, der die Funktion oder eine andere Funktion oder einen anderen Dienst testet, der bzw. die die Funktion verwenden möchte. Standardmäßig müssen diese Identitäten ein ID-Token mit der Anfrage zur eigenen Authentifizierung bereitstellen. Darüber hinaus müssen dem verwendeten Konto auch die entsprechenden Berechtigungen erteilt worden sein.
ID-Tokens generieren und verwenden.
Authentifizierungsbeispiele
In diesem Abschnitt finden Sie verschiedene Beispiele für die Aufruf-Authentifizierung.
Beispiel 1: Entwicklertests authentifizieren
Als Entwickler benötigen Sie Zugriff auf das Erstellen, Aktualisieren und Löschen von Funktionen und dies wird mithilfe des normalen IAM-Prozesses gewährt.
Als Entwickler müssen Sie jedoch möglicherweise zu Testzwecken auch Funktionen aufrufen. Beachten Sie Folgendes, wenn Sie eine Funktion mit curl
oder ähnlichen Tools aufrufen:
Weisen Sie Ihrem Cloud Run Functions-Nutzerkonto eine Rolle mit der Berechtigung „invoke“ zu.
run.routes.invoke
. Dies geschieht normalerweise über die Rolle Cloud Run Invoker.
Wenn Sie von Ihrem lokalen Computer aus arbeiten, richten Sie den Befehlszeilenzugriff ein, indem Sie die Google Cloud CLI initialisieren.
Geben Sie Ihre Anfrage mit Authentifizierungsanmeldedaten als von Google generiertes ID-Token an, das in einem
Authorization
-Header gespeichert ist. So rufen Sie beispielsweise ein ID-Token mitgcloud
ab:curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ https://FUNCTION_URL
Dabei ist FUNCTION_URL die URL Ihrer Funktion. Rufen Sie diese URL auf der Seite „Cloud Run Functions“ der Google Cloud Console oder durch Ausführen des Befehls
gcloud functions describe
ab, wie im ersten Schritt des Beispiel für einen Google-Cloud CLI-Bereitstellungsbefehl
Sie können von gcloud
erstellte Tokens verwenden, um HTTP-Funktionen in einem beliebigen Projekt aufzurufen, solange Ihr Konto die cloudfunctions.functions.invoke
-Berechtigung für die aufgerufene Funktion hat. Verwenden Sie zu Entwicklungszwecken von gcloud
generierte ID-Tokens. Beachten Sie dabei, dass solche Tokens keine Zielgruppenanforderung haben, was sie für Relay-Angriffe anfällig macht. In Produktionsumgebungen verwenden Sie ID-Tokens, die für ein Dienstkonto ausgestellt wurden und für die die angemessene Zielgruppe angegeben wurde. Dieser Ansatz verbessert die Sicherheit, da die Tokennutzung auf den gewünschten Dienst beschränkt wird.
Wie immer empfehlen wir, dass Sie die minimalen Berechtigungen zuweisen, die zum Entwickeln und Verwenden von Funktionen erforderlich sind. Achten Sie dabei darauf, dass die IAM-Richtlinien für die Funktionen auf die Mindestanzahl von Nutzern und Dienstkonten beschränkt sind.
Beispiel 2: Funktion für Funktionsaufrufe authentifizieren
Wenn Sie Dienste erstellen, die mehrere Funktionen miteinander verbinden, sollten Sie dafür sorgen, dass jede Funktion nur Anfragen an eine bestimmte Teilmenge der anderen Funktionen senden kann. Eine login
-Funktion sollte zwar beispielsweise auf die user profiles
-Funktion zugreifen können, aber keinen Zugriff auf die search
-Funktion haben.
Wenn Sie die empfangende Funktion so konfigurieren möchten, dass Anfragen von einer bestimmten Aufruffunktion akzeptiert werden, müssen Sie dem Dienstkonto der aufrufenden Funktion in der empfangenden Funktion die entsprechende Aufruferrolle zuweisen.
Die Rolle des Aufrufers ist „Cloud Run Invoker“ (roles/run.invoker
) und muss für den zugrunde liegenden Dienst gewährt werden:
Console
Cloud Run-Aufrufer verwenden:
Öffnen Sie die Google Cloud Console:
Klicken Sie in der Liste der Cloud Run-Dienste auf das Kästchen neben der empfangenden Funktion. (Klicken Sie nicht auf die Funktion selbst.)
Der Bereich Berechtigungen wird geöffnet.
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
.Beachten Sie, dass sich die Projektnummer von Projekt-ID und Projektnamen unterscheidet. Die Projektnummer finden Sie in der Google Cloud Console auf der Dashboard-Seite:
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 functions add-invoker-policy-binding
aus:
gcloud functions add-invoker-policy-binding RECEIVING_FUNCTION \ --member='serviceAccount:CALLING_FUNCTION_IDENTITY'
Mit dem Befehl add-invoker-policy-binding
wird eine IAM-Richtlinienbindung für die Rolle „Aufrufer“ hinzugefügt, die es dem angegebenen Mitglied (Hauptkonto) ermöglicht, die angegebene Funktion aufzurufen. Die Google Cloud CLI erkennt die Funktionsgeneration automatisch und fügt die richtige Rolle „Aufrufer“ (run.invoker
für Cloud Run-Funktionen) hinzu.
Ersetzen Sie Folgendes:
RECEIVING_FUNCTION
: Der Name der empfangenden Funktion.CALLING_FUNCTION_IDENTITY
: Die Identität der aufrufenden Funktion, eine E-Mail-Adresse des Dienstkontos.
Da sie die empfangende Funktion aufrufen, muss die aufrufende Funktion auch ein von Google signiertes ID-Token zur Authentifizierung bereitstellen. Hierzu sind zwei Schritte notwendig:
Erstellen Sie ein von Google signiertes ID-Token, in dem das Zielgruppenfeld (
aud
) auf die URL der empfangenden Funktion eingestellt ist.Geben Sie das ID-Token in der Anfrage an die Funktion in einem
Authorization: Bearer ID_TOKEN
-Header an.
Die bei Weitem einfachste und zuverlässigste Methode für die Verwaltung dieses Prozesses ist die Verwendung der unten aufgeführten Authentifizierungsbibliotheken, um dieses Token zu generieren und anzuwenden.
ID-Tokens generieren
In diesem Abschnitt werden verschiedene Möglichkeiten beschrieben, wie Sie das ID-Token generieren können, das Hauptkonten benötigen, um Funktionen aufzurufen.
Nicht authentifizierter Zugriff ohne ein ID-Token ist möglich, muss aber aktiviert werden. Weitere Informationen finden Sie unter IAM zum Autorisieren von Zugriff verwenden.
Tokens programmatisch generieren
Nachdem der folgende Code ein ID-Token generiert hat, ruft er Ihre Funktion mit diesem Token in Ihrem Namen auf. Dieser Code funktioniert in jeder Umgebung, in der die Bibliotheken Anmeldedaten zur Authentifizierung abrufen können, einschließlich Umgebungen, die lokale Standardanmeldedaten für Anwendungen unterstützen.
Node.js
Python
Go
Java
Tokens manuell generieren
Wenn Sie eine Funktion aufrufen und aus irgendeinem Grund die Authentifizierungsbibliotheken nicht verwenden können, gibt es zwei Möglichkeiten, das ID-Token manuell abzurufen, entweder über den Compute-Metadatenserver oder indem du ein selbstsigniertes JWT erstellst und es gegen ein von Google signiertes ID-Token austauscht.
Metadatenserver verwenden
Sie können den Compute-Metadatenserver verwenden, um ID-Tokens mit einer bestimmten Zielgruppe so abzurufen:
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
-H "Metadata-Flavor: Google"
Ersetzen Sie AUDIENCE durch die URL der aufgerufenen Funktion. Sie können diese URL wie oben im Abschnitt Entwicklertests authentifizieren beschrieben abrufen.
Ein selbst signiertes JWT für ein von Google signiertes ID-Token austauschen
Gewähren Sie dem Dienstkonto der aufrufenden Funktion für die empfangende Funktion die Rolle „Aufrufer“ (
roles/cloudfunctions.invoker
).Erstellen Sie ein Dienstkonto und einen Schlüssel und laden Sie die Datei mit dem privaten Schlüssel im JSON-Format auf den Host herunter, von dem aus die aufrufende Funktion oder der Dienst Anfragen stellt.
Erstellen Sie ein JWT, bei dem der Header auf
{"alg":"RS256","typ":"JWT"}
gesetzt ist. Die Nutzlast sollte einetarget_audience
-Anforderung enthalten, die auf die URL der empfangenden Funktion festgelegt ist, und dieiss
- undsub
-Anforderungen, die auf die E-Mail-Adresse des oben verwendeten Dienstkontos festgelegt sind. Außerdem sollten die Anforderungenexp
undiat
enthalten sein. Für die Anforderungaud
musshttps://www.googleapis.com/oauth2/v4/token
festgelegt sein.Verwenden Sie den oben heruntergeladenen privaten Schlüssel, um das JWT zu signieren.
Senden Sie mithilfe dieses JWT eine POST-Anfrage an https://www.googleapis.com/oauth2/v4/token. Authentifizierungsdaten müssen im Header und im Hauptteil der Anfrage enthalten sein.
Im Header:
Authorization: Bearer $JWT - where $JWT is the JWT you just created Content-Type: application/x-www-form-urlencoded
Im Hauptteil:
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=$JWT
Ersetzen Sie
$JWT
durch das gerade erstellte JWT.Dadurch wird ein anderes JWT zurückgegeben, das einen von Google signierten
id_token
enthält.
Senden Sie Ihre GET-/POST-Anfrage an die empfangende Funktion. Fügen Sie das von Google signierte ID-Token in der Anfrage in einen Authorization: Bearer ID_TOKEN_JWT
-Header ein.
Nächste Schritte
Hier finden Sie Hilfe zu anderen Möglichkeiten zum Generieren von ID-Tokens.