Nutzerauthentifizierung mit Identity-Aware Proxy

Die Authentifizierung von Nutzern Ihrer Webanwendung ist häufig erforderlich und erfordert in der Regel eine besondere Programmierung. Bei Google Cloud Platform-Apps können Sie diese Verantwortung an den Identity-Aware Proxy-Dienst übergeben. Wenn Sie den Zugriff nur für bestimmte Nutzer einschränken müssen, sind keine Änderungen an der Anwendung erforderlich. Falls die Anwendung die Identität eines Nutzers erkennen soll (z. B. um die Nutzereinstellungen serverseitig beizubehalten), kann Identity-Aware Proxy diese Information mit minimalem Anwendungscode bereitstellen.

Was ist Identity-Aware Proxy?

Identity-Aware Proxy (IAP) ist ein Google Cloud Platform-Dienst, der an Ihre Anwendung gesendete Webanfragen abfängt, den anfragenden Nutzer über den Google Identity Service authentifiziert und die Anfragen nur weiterleitet, wenn sie von einem von Ihnen autorisierten Nutzer stammen. Außerdem kann der Dienst Anfrage-Header so ändern, dass sie Informationen über den authentifizierten Nutzer enthalten.

Darin lernen Sie Schritt für Schritt, wie Sie Ihre eigene Anwendung erstellen, den Zugriff darauf einschränken und die Nutzeridentität von IAP abrufen.

Überblick

In diesem Codelab werden Sie eine einfache Webanwendung mit Google App Engine erstellen und dann verschiedene Möglichkeiten nutzen, wie Sie mit Identity-Aware Proxy den Zugriff auf die Anwendung einschränken und Informationen zur Nutzeridentität zur Verfügung stellen können. Mit der Anwendung können Sie Folgendes tun:

  • Eine Begrüßungsseite anzeigen lassen
  • Auf Informationen zur Nutzeridentität zugreifen, die von IAP bereitgestellt werden
  • Mithilfe von kryptografischer Überprüfung das Spoofing von Informationen zur Nutzeridentität verhindern

Lerninhalte

  • Einfache App Engine-Anwendung mit Python 3.7 schreiben und bereitstellen
  • IAP aktivieren und deaktivieren, um den Zugriff auf die Anwendung einzuschränken
  • Informationen zur Nutzeridentität von IAP auf die Anwendung übertragen
  • Informationen von IAP zum Schutz vor Spoofing kryptografisch überprüfen

Voraussetzungen

  • Ein moderner Webbrowser wie Chrome.
  • Grundkenntnisse in der Programmiersprache Python

Dieses Codelab konzentriert sich auf Google App Engine und IAP. Auf irrelevante Konzepte wird nicht genauer eingegangen und entsprechende Codeblöcke können Sie einfach kopieren und einfügen.

Sie arbeiten in der Cloud Shell-Befehlszeile. Öffnen Sie zuerst die Umgebung und rufen Sie den Beispielcode ab.

Konsole und Cloud Shell starten

Klicken Sie links oben auf der Seite des Labs auf die Schaltfläche „Google Console öffnen“. Sie müssen sich mit dem unten angezeigten Nutzernamen und Passwort anmelden.

Alle Befehle in diesem Codelab werden in einer Cloud Shell für das Projekt ausgeführt, das für Sie erstellt und geöffnet wurde. Klicken Sie rechts in der Kopfzeile der Konsole auf „Cloud Shell aktivieren“. In der unteren Hälfte der Seite können Sie Befehle eingeben und ausführen.

Die Befehle können auf Ihrem eigenen Computer ausgeführt werden, Sie müssen jedoch zuerst die erforderliche Entwicklungssoftware installieren und konfigurieren. In Cloud Shell sind bereits alle erforderlichen Softwaretools vorhanden.

Code herunterladen

Klicken Sie in Cloud Shell auf den Befehlszeilenbereich, damit Sie Befehle eingeben können. Rufen Sie den Code von GitHub ab und wechseln Sie in den Codeordner:

git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd iap-codelab

In diesem Ordner gibt es für jeden Schritt dieses Codelabs einen Unterordner. Sie werden bei jedem Schritt in den entsprechenden Ordner wechseln.

Dies ist eine in Python 3.7 geschriebene App Engine-Standardanwendung, die einfach die Begrüßungsseite "Hello World" anzeigt. Sie werden die Anwendung bereitstellen und testen und anschließend mithilfe von IAP den Zugriff darauf beschränken.

Anwendungscode prüfen

Wechseln Sie vom Hauptprojektordner in den Unterordner 1-HelloWorld, der Code für diesen Schritt enthält.

cd 1-HelloWorld

Der Anwendungscode befindet sich in der Datei main.py. Es wird das Flask-Webframework verwendet, um auf Webanfragen mit dem Inhalt einer Vorlage zu antworten. Die Vorlagendatei befindet sich in templates/index.html und enthält in diesem Schritt nur HTML. Eine zweite Vorlagendatei enthält in templates/privacy.html ein Beispiel für eine Datenschutzerklärung.

Es gibt zwei weitere Dateien: requirements.txt listet alle nicht standardmäßigen Python-Bibliotheken auf, die von der Anwendung verwendet werden, und app.yaml teilt der Google Cloud Platform mit, dass dies eine Python 3.7-App Engine-Anwendung ist.

Sie können mit dem folgenden cat-Befehl jede Datei in der Shell auflisten:

cat main.py

Alternativ können Sie den Cloud Shell-Code-Editor öffnen. Klicken Sie dazu rechts oben im Cloud Shell-Fenster auf das Stiftsymbol.

Sie müssen für diesen Schritt keine Dateien ändern.

In App Engine bereitstellen

Anwendung jetzt für Python 3.7 in der App Engine-Standardumgebung bereitstellen

gcloud app deploy

Sie werden möglicherweise aufgefordert, eine Region für die Bereitstellung auszuwählen. Wählen Sie eine Person in Ihrer Nähe aus, auf der sie steht. Wenn Sie gefragt werden, ob Sie fortfahren möchten, geben Sie Y für „Ja“ ein.

In wenigen Minuten sollte die Bereitstellung abgeschlossen sein. Sie erhalten dann eine Meldung, dass Sie Ihre Anwendung mit gcloud app browse ansehen können. Geben Sie diesen Befehl ein: Wenn ein neuer Tab in Ihrem Browser nicht geöffnet wird, klicken Sie auf den angezeigten Link, um ihn in einem neuen Tab zu öffnen, oder kopieren Sie ihn gegebenenfalls in einen manuell geöffneten neuen Tab. Da diese Anwendung zum ersten Mal ausgeführt wird, dauert es beim Starten einer Cloud-Instanz einige Sekunden, bis sie angezeigt wird. Sie sollten dann das folgende Fenster sehen:

Sie können dieselbe URL von jedem Computer aus aufrufen, der mit dem Internet verbunden ist, um diese Webseite zu öffnen. Der Zugriff ist noch nicht eingeschränkt.

Zugriff mit IAP einschränken

Klicken Sie im Cloud Console-Fenster links oben auf das Menüsymbol, dann auf „Sicherheit“ und dann auf „Identity-Aware Proxy“.

Da Sie zum ersten Mal eine Authentifizierungsoption für dieses Projekt aktiviert haben, werden Sie in einer Meldung darauf hingewiesen, dass Sie Ihren OAuth-Zustimmungsbildschirm konfigurieren müssen, bevor Sie IAP verwenden können.

Klicken Sie auf die Schaltfläche „Einwilligungsbildschirm konfigurieren“. Ein neuer Tab wird geöffnet, auf dem Sie den Zustimmungsbildschirm konfigurieren können.

Füllen Sie die erforderlichen Felder mit den entsprechenden Werten aus:

Name der Anwendung

Beispiel für IAP

Support-E-Mail-Adresse

Ihre E-Mail-Adresse. Diese ist möglicherweise bereits für Sie ausgefüllt.

Autorisierte Domain

den Teil der URL der Anwendung, z.B. iap-example-999999.appspot.com. Dieser finden Sie in der Adressleiste der zuvor geöffneten „Hello World“-Webseite. Die Anfangs- https:// und die nachgestellte / sind in der URL nicht zulässig.

Sie müssen den Eingabetaste drücken, nachdem Sie diesen Wert eingegeben haben.

Link zur Startseite der Anwendung

die URL, über die Sie Ihre App aufgerufen haben

Link zur Datenschutzerklärung der Anwendung

den Link zur Datenschutzseite in der App, genauso wie der Link zur Startseite mit „/privacy“ am Ende

Klicken Sie auf Speichern. Sie werden aufgefordert, Anmeldedaten zu erstellen. Sie müssen keine Anmeldedaten für dieses Codelab erstellen, also können Sie diesen Browsertab einfach schließen.

Kehren Sie zur Seite "Identity-Aware Proxy" zurück und aktualisieren Sie sie. Sie sollten nun eine Liste der Ressourcen sehen, die Sie schützen können.

Klicken Sie in der App Engine-Anwendungszeile auf die Ein-/Aus-Schaltfläche, um IAP zu aktivieren.

Sie sehen die Domainnamen, die durch IAP geschützt werden. Klicke auf „AKTIVIEREN“.

Öffnen Sie jetzt einen Browsertab und rufen Sie die URL für Ihre App auf. Es erscheint ein „Über Google anmelden“-Bildschirm, in dem Sie sich anmelden müssen, um auf die App zuzugreifen.

Melden Sie sich mit einem Google- oder G Suite-Konto an. Der Zugriff wird verweigert.

Sie haben Ihre Anwendung erfolgreich mit IAP geschützt. Als Nächstes legen Sie fest, welche Konten zugelassen werden sollen.

Kehren Sie in der Console zur Seite "Identity-Aware Proxy" zurück, klicken Sie das Kästchen neben der App Engine-Anwendung an und sehen Sie sich die rechte Seitenleiste an.

Jede E-Mail- oder Google Groups-Adresse und jeder G Suite-Domainname, dem Zugriff gewährt werden soll, muss als Mitglied hinzugefügt werden. Klicke auf MITGLIED HINZUFÜGEN. Geben Sie Ihre E-Mail-Adresse ein und wählen Sie die Rolle „Cloud IAP-/IAP-Secured Web App-Nutzer“ aus, die dieser Adresse zugewiesen werden soll. Sie können auf die gleiche Weise weitere Adressen oder G Suite-Domains eingeben.

Klicken Sie auf „Speichern“. Die Meldung "Policy Updated" (Richtlinie aktualisiert) wird am unteren Rand des Fensters angezeigt.

Gehen Sie zurück zur Anwendung und laden Sie die Seite neu. Sie sollten nun Ihre Webanwendung sehen, da Sie bereits als ein von Ihnen autorisierter Nutzer angemeldet sind. Möglicherweise wird Ihnen jedoch weiterhin die Seite „Sie haben keinen Zugriff“ angezeigt, da IAP Ihre Autorisierung möglicherweise nicht noch einmal prüft. Führen Sie in diesem Fall die folgenden Schritte aus:

  • Öffnen Sie im Webbrowser die Adresse der Startseite, bei der /_gcp_iap/clear_login_cookie am Ende der URL hinzugefügt wird, wie in https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie.
  • Es erscheint ein neuer "Über Google anmelden"-Bildschirm, auf dem Ihr Konto bereits angezeigt wird. Klicken Sie nicht auf das Konto, sondern auf "Use another account" (Anderes Konto verwenden) und geben Sie Ihre Anmeldedaten noch einmal ein.
  • IAP überprüft nun noch einmal Ihre Zugriffsrechte und Sie sollten den Startbildschirm der Anwendung sehen.

Wenn Sie auf einen anderen Browser zugreifen oder den Inkognitomodus in Ihrem Browser verwenden können und ein weiteres Gmail- oder G Suite-Konto besitzen, können Sie über diesen Browser zur Seite Ihrer Anwendung gehen und sich mit diesem Konto anmelden. Da dieses Konto nicht autorisiert wurde, wird Ihnen anstelle Ihrer Anwendung die Meldung "You don't have access" (Sie haben keinen Zugriff) angezeigt.

Sobald eine Anwendung durch IAP geschützt ist, kann sie bereitgestellte Informationen zur Identität des Nutzers verwenden, die IAP in den Headern der Webanfragen weiterleitet. In diesem Schritt erhält die Anwendung die E-Mail-Adresse des angemeldeten Nutzers und eine dauerhafte eindeutige Nutzer-ID, die vom Google Identity Service zugewiesen wird. Diese Daten werden dem Nutzer auf der Begrüßungsseite angezeigt.

Dies ist Schritt 2 und der letzte Schritt wurde beendet, als Cloud Shell im Ordner iap-codelab/1-HelloWorld geöffnet war. Wechseln Sie für diesen Schritt in den folgenden Ordner:

cd ~/iap-codelab/2-HelloUser

Auf App Engine bereitstellen

Da die Bereitstellung einige Minuten dauert, stellen Sie die Anwendung zuerst für die Python 3.7-Anwendung in der App Engine-Standardumgebung bereit:

gcloud app deploy

Wenn Sie gefragt werden, ob Sie fortfahren möchten, geben Sie „Y“ für „Yes“ ein. In wenigen Minuten sollte die Bereitstellung abgeschlossen sein. Während Sie warten, können Sie sich die Anwendungsdateien wie unten beschrieben ansehen.

Wenn die Bereitstellung abgeschlossen ist, sehen Sie eine Meldung, dass Sie Ihre Anwendung mit gcloud app browse aufrufen können. Geben Sie diesen Befehl ein: Wenn sich in Ihrem Browser kein neuer Tab öffnet, kopieren Sie den angezeigten Link und öffnen Sie ihn in einem neuen Tab. Sie sollten eine Seite sehen, die in etwa so aussieht:

Möglicherweise müssen Sie einige Minuten warten, bis die neue Version Ihrer Anwendung die vorherige Version ersetzt. Aktualisieren Sie die Seite bei Bedarf, sodass eine Seite angezeigt wird, die so ähnlich wie die Seite oben aussieht.

Anwendungsdateien prüfen

Dieser Ordner enthält die gleichen Dateien wie in Schritt 1, aber zwei der Dateien wurden geändert: main.py und templates/index.html. Das Programm wurde geändert, damit es Informationen zu Nutzern abrufen kann, die IAP in den Anfrage-Headern bereitstellt. In der Vorlage werden diese Daten nun angezeigt.

Es gibt zwei Zeilen in main.py, die die von IAP bereitgestellten Identitätsdaten abrufen:

user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id = request.headers.get('X-Goog-Authenticated-User-ID')

Die X-Goog-Authenticated-User--Header werden von IAP bereitgestellt. Bei den Namen muss die Groß- und Kleinschreibung nicht berücksichtigt werden. Die Anweisung render_template beinhaltet jetzt diese Werte, damit sie angezeigt werden können:

page = render_template('index.html', email=user_email, id=user_id)

In der Vorlage index.html werden diese Werte angezeigt, wenn die Namen in doppelte geschweifte Klammern eingeschlossen werden:

Hello, {{ email }}! Your persistent ID is {{ id }}.

Wie Sie sehen, sind die bereitgestellten Daten mit dem Präfix accounts.google.com versehen. So ist ersichtlich, woher die Informationen stammen. Ihre Anwendung kann bei Bedarf alles bis einschließlich des Doppelpunkts entfernen, um die Rohwerte zu erhalten.

IAP deaktivieren

Was passiert mit dieser Anwendung, wenn IAP deaktiviert ist oder auf irgendeine Weise umgangen wird (z. B. durch andere Anwendungen, die in demselben Cloud-Projekt ausgeführt werden)? Deaktivieren Sie IAP, um es zu erfahren.

Klicken Sie im Cloud Console-Fenster links oben auf das Menüsymbol, dann auf „Sicherheit“ und dann auf „Identity-Aware Proxy“. Klicken Sie neben „App Engine“ auf den Schieberegler für IAP, um IAP zu deaktivieren.

Sie werden gewarnt, dass dies allen Nutzern den Zugriff auf die Anwendung ermöglicht.

Aktualisieren Sie die Webseite der Anwendung. Sie sollten dieselbe Seite sehen, jedoch ohne Nutzerinformationen:

Da die Anwendung jetzt nicht geschützt ist, kann ein Nutzer eine Webanfrage senden, die scheinbar über IAP übertragen wurde. Führen Sie dazu den folgenden curl-Befehl über Cloud Shell aus. Ersetzen Sie dabei „lt &your-url-here&gt“ durch die korrekte URL für Ihre App.

curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"

Die Webseite wird in der Befehlszeile angezeigt und so aussehen:

<!doctype html>
<html>
<head>
  <title>IAP Hello User</title>
</head>
<body>
  <h1>Hello World</h1>

  <p>
    Hello, totally fake email! Your persistent ID is None.
  </p>

  <p>
    This is step 2 of the <em>User Authentication with IAP</em>
    codelab.
 </p>

</body>
</html>

Die Anwendung kann nicht erkennen, dass IAP deaktiviert oder umgangen wurde. In Fällen, in denen dies ein potenzielles Risiko darstellt, zeigt Schritt 3 eine Lösung.

Wenn die Gefahr besteht, dass IAP deaktiviert oder umgangen wird, kann Ihre Anwendung überprüfen, ob die empfangenen Informationen zur Nutzeridentität gültig sind. Dabei wird ein dritter Webanfragen-Header mit dem Namen X-Goog-IAP-JWT-Assertion verwendet. Der Wert des Headers ist ein kryptografisch signiertes Objekt, das auch die Daten zur Nutzeridentität enthält. Ihre Anwendung kann die digitale Signatur überprüfen und anhand der in diesem Objekt bereitgestellten Daten feststellen, ob sie unverändert von IAP bereitgestellt wurden.

Die Überprüfung der digitalen Signatur erfordert mehrere zusätzliche Schritte, z. B. das Abrufen der neuesten öffentlichen Schlüssel von Google. Sie entscheiden, ob Ihre Anwendung diese zusätzlichen Schritte benötigt – je nachdem, wie hoch das Risiko ist, dass jemand IAP deaktiviert oder umgeht, und je nachdem, ob die Anwendung vertrauliche Informationen empfängt oder nicht.

Dies ist Schritt 3 und der letzte Schritt endete, wenn Cloud Shell im Ordner iap-codelab/2-HelloUser geöffnet war. Wechseln Sie für diesen Schritt in den folgenden Ordner:

cd ~/iap-codelab/3-HelloVerifiedUser

In App Engine bereitstellen

Stellen Sie die Anwendung in der App Engine-Standardumgebung für Python 3.7 bereit:

gcloud app deploy

Wenn Sie gefragt werden, ob Sie fortfahren möchten, geben Sie „Y“ für „Yes“ ein. In wenigen Minuten sollte die Bereitstellung abgeschlossen sein. Während Sie warten, können Sie sich die Anwendungsdateien wie unten beschrieben ansehen.

Wenn die Bereitstellung abgeschlossen ist, sehen Sie eine Meldung, dass Sie Ihre Anwendung mit gcloud app browse aufrufen können. Geben Sie diesen Befehl ein: Wenn sich in Ihrem Browser kein neuer Tab öffnet, kopieren Sie den angezeigten Link und öffnen Sie ihn in einem neuen Tab.

Denken Sie daran, dass Sie in Schritt 2 IAP deaktiviert haben. Daher werden keine IAP-Daten an die Anwendung gesendet. Sie sollten eine Seite sehen, die in etwa so aussieht:

Es kann wieder einige Minuten dauern, bis die neue Version der Seite angezeigt wird.

Da IAP deaktiviert ist, sind keine Informationen über die Nutzer verfügbar. Aktivieren Sie IAP nun wieder.

Klicken Sie im Cloud Console-Fenster links oben auf das Menüsymbol, dann auf „Sicherheit“ und dann auf „Identity-Aware Proxy“. Klicken Sie neben „App Engine“ auf den Schieberegler für IAP, um IAP wieder zu aktivieren.

Aktualisieren Sie die Seite. Sie sollte in etwa so aussehen:

Beachten Sie, dass die von der bestätigten Methode bereitgestellte E-Mail-Adresse nicht das Präfix accounts.google.com: hat.

Wenn IAP deaktiviert oder umgangen wird, fehlen die überprüften Daten oder sind ungültig, da sie nur dann eine gültige Signatur haben, wenn sie vom Inhaber der privaten Schlüssel von Google erstellt wurden.

Anwendungsdateien prüfen

Dieser Ordner enthält dieselben Dateien wie in Schritt 2, wobei zwei Dateien geändert und eine neue Datei erstellt werden. Die neue Datei ist auth.py. Sie enthält eine user()-Methode, mit der Sie die kryptografisch signierten Identitätsinformationen abrufen und prüfen können. Die geänderten Dateien sind main.py und templates/index.html, für die jetzt die Ergebnisse dieser Methode verwendet werden. Die in Schritt 2 ermittelten Header, die nicht bestätigt wurden, werden ebenfalls zu Vergleichszwecken angezeigt.

Die neue Funktion befindet sich hauptsächlich in der user()-Funktion:

def user():
    assertion = request.headers.get('X-Goog-IAP-JWT-Assertion')
    if assertion is None:
        return None, None

    info = jwt.decode(
        assertion,
        keys(),
        algorithms=['ES256'],
        audience=audience()
    )

    return info['email'], info['sub']

Der assertion ist die kryptografisch signierte Daten, die im angegebenen Anfrageheader angegeben wurden. Sie werden mithilfe einer Bibliothek überprüft und decodiert. Bei der Überprüfung werden die öffentlichen Schlüssel verwendet, die Google zur Überprüfung der signierten Daten bereitstellt, und es wird die Zielgruppe ermittelt, für die die Daten vorbereitet wurden (im Wesentlichen das zu schützende Google Cloud-Projekt). Mit den Hilfsfunktionen keys() und audience() werden diese Werte erfasst und zurückgegeben.

Das signierte Objekt verfügt über zwei Daten, die wir benötigen: die bestätigte E-Mail-Adresse und den eindeutigen ID-Wert (enthalten im sub für Abonnenten, Standardfeld).

Damit ist Schritt 3 abgeschlossen.

Sie haben eine App Engine-Webanwendung bereitgestellt. In Schritt 1 haben Sie den Zugriff auf die App auf die von Ihnen ausgewählten Nutzer beschränkt. In Schritt 2 haben Sie die Identität von Nutzern abgerufen und angezeigt, die IAP den Zugriff auf die Anwendung gewährt haben. Dabei wurde festgestellt, wie diese Informationen gefälscht werden können, wenn IAP deaktiviert oder umgangen wird. In Schritt 3 hast du kryptografische Assertions der Nutzeridentität bestätigt, die nicht gefälscht werden können.

Die einzigen Google Cloud Platform-Ressourcen, die Sie in diesem Codelab verwenden, sind App Engine-Instanzen. Bei jeder Bereitstellung der Anwendung wird eine neue Version erstellt und ist so lange bestehen, bis sie gelöscht wird. Schließen Sie das Lab, um das Projekt und alle darin enthaltenen Ressourcen zu löschen.