Nutzerauthentifizierung mit Identity-Aware Proxy

1. Einführung

Das Authentifizieren der Nutzer Ihrer Webanwendung ist häufig notwendig und erfordert normalerweise eine spezielle Programmierung in Ihrer Anwendung. Bei Google Cloud Platform-Apps können Sie diese Aufgaben an den Dienst Identity-Aware Proxy ü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 Anfrageheader so ändern, dass sie Informationen über den authentifizierten Nutzer enthalten.

In diesem Codelab erfahren Sie, wie Sie Ihre eigene Anwendung erstellen, den Zugriff darauf einschränken und die Nutzeridentität aus IAP abrufen.

Überblick

In diesem Codelab erstellen Sie eine minimale Webanwendung mit der Google App Engine. Anschließend lernen Sie verschiedene Möglichkeiten kennen, wie Sie mit Identity-Aware Proxy den Zugriff auf die Anwendung einschränken und Informationen zur Nutzeridentität bereitstellen 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

Aufgaben in diesem Lab

  • 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

  • Einen modernen Webbrowser wie Chrome
  • Grundkenntnisse der Programmiersprache Python

In diesem Codelab geht es um Google App Engine und IAP. Auf irrelevante Konzepte wird nicht genauer eingegangen und entsprechende Codeblöcke können Sie einfach kopieren und einfügen.

2. Einrichtung

Sie arbeiten in der Cloud Shell-Befehlszeilenumgebung. Öffnen Sie zunächst diese Umgebung und rufen Sie den Beispielcode ab.

Konsole und Cloud Shell starten

Klicken Sie oben links auf der Lab-Seite auf die Schaltfläche Open Google Console (Google Console öffnen). Für die Anmeldung musst du deinen Nutzernamen und dein Passwort eingeben, die unter dieser Schaltfläche angezeigt werden.

Alle Befehle in diesem Codelab werden in Cloud Shell für das Projekt ausgeführt, das für Sie erstellt und geöffnet wurde. Öffnen Sie Cloud Shell, indem Sie rechts in der Kopfzeile der Konsole auf das Symbol „Cloud Shell aktivieren“ klicken. In der unteren Hälfte der Seite können Sie Befehle eingeben und ausführen.Die Befehle können auch von Ihrem eigenen PC aus ausgeführt werden, aber Sie müssen die erforderliche Entwicklungssoftware zuerst installieren und konfigurieren. Cloud Shell verfügt bereits über alle Softwaretools, die Sie benötigen.

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 user-authentication-with-iap

Dieser Ordner enthält für jeden Schritt in diesem Codelab einen Unterordner. Sie werden bei jedem Schritt in den entsprechenden Ordner wechseln.

3. Schritt 1: Anwendung bereitstellen und mit IAP schützen

Dies ist eine App Engine Standard-Anwendung, geschrieben in Python 3.7, die einfach eine "Hello, World"-Nachricht anzeigt. auf der Begrüßungsseite. 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 den Code für diesen Schritt enthält.

cd 1-HelloWorld

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

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

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, indem Sie oben rechts im Cloud Shell-Fenster auf das Stiftsymbol klicken, und sich den Code ansehen.

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

In App Engine bereitstellen

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

gcloud app deploy

Sie werden möglicherweise aufgefordert, eine Region für die Bereitstellung auszuwählen. Wählen Sie eine Adresse in Ihrer Nähe aus, für die „supports standard“ (unterstützt Standard) gilt. Wenn Sie gefragt werden, ob Sie fortfahren möchten, geben Sie Y für „Ja“ ein.

In wenigen Minuten sollte die Bereitstellung abgeschlossen sein und Sie erhalten eine Meldung, dass Sie die Anwendung mit gcloud app browse aufrufen können. Geben Sie diesen Befehl ein: Wird in Ihrem Browser kein neuer Tab geöffnet, klicken Sie auf den angezeigten Link, um ihn in einem neuen Tab zu öffnen, oder kopieren Sie ihn bei Bedarf 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:

1c1c0b166c6023e.png

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 den OAuth-Zustimmungsbildschirm konfigurieren müssen, bevor Sie IAP verwenden können.

Klicken Sie auf die Schaltfläche ZUSTIMMUNGSBILDSCHIRM KONFIGURIEREN. Ein neuer Tab wird geöffnet, in dem Sie den Zustimmungsbildschirm konfigurieren können.

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

Name der Anwendung

Beispiel für In-App-Kauf

Support-E-Mail-Adresse

Ihre E-Mail-Adresse. ist es möglicherweise bereits ausgefüllt.

Autorisierte Domain

Hostname der Anwendungs-URL, z.B. iap-example-999999.appspot.com. Sie können dies in der Adressleiste der zuvor geöffneten Hello World-Webseite sehen. Geben Sie weder den Anfang https:// noch den nachgestellten / aus dieser URL an.Sie müssen nach dem Ausfüllen dieses Werts die Eingabetaste drücken.

Link zur Startseite der Anwendung

Die URL, über die Sie Ihre App aufgerufen haben

Link zur Datenschutzerklärung der Anwendung

Über den Link zur Datenschutzseite in der App, genau wie der Link zur Startseite mit dem Zusatz „/privacy“

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

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 Zeile mit der App Engine-Anwendung 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 nun einen Browsertab und rufen Sie die URL Ihrer App auf. Daraufhin wird der Bildschirm „Über Google anmelden“ angezeigt, auf dem Sie sich anmelden müssen, um auf die App zugreifen zu können.

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. Klicken Sie auf MITGLIED HINZUFÜGEN. Geben Sie Ihre E-Mail-Adresse ein und wählen Sie dann die Rolle "Nutzer von IAP-gesicherten Web-Apps" 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 „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. Unter Umständen wird aber weiterhin der Hinweis „Sie haben keinen Zugriff“ angezeigt. da IAP Ihre Autorisierung möglicherweise nicht erneut überprüft. Führen Sie in diesem Fall die folgenden Schritte aus:

  • Öffnen Sie in Ihrem Webbrowser die Adresse der Startseite und hängen Sie /_gcp_iap/clear_login_cookie an die URL an, z. B. https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie.
  • Es erscheint ein neuer Bildschirm „Über Google anmelden“, 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 „Sie haben keinen Zugriff“ angezeigt.

4. Schritt 2: Auf Informationen zur Nutzeridentität zugreifen

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. Im letzten Schritt war Cloud Shell im Ordner iap-codelab/1-HelloWorld geöffnet. Wechseln Sie für diesen Schritt in den folgenden Ordner:

cd ~/iap-codelab/2-HelloUser

Auf der App Engine bereitstellen

Da die Bereitstellung einige Minuten dauert, stellen Sie die Anwendung zuerst 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 „Ja“ 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 bereit ist, wird die Meldung angezeigt, dass Sie sich die Anwendung mit gcloud app browse ansehen 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:

5b5fb03111258cec.png

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 untersuchen

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

In main.py gibt es zwei Zeilen, über die die von IAP bereitgestellten Identitätsdaten abgerufen werden:

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 wird die Groß- und Kleinschreibung nicht berücksichtigt, sodass sie nach Bedarf vollständig in Groß- oder Kleinschreibung angegeben werden können. 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, wird den bereitgestellten Daten das Präfix accounts.google.com vorangestellt. Damit wird angegeben, 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 auf die Ein/Aus-Schaltfläche für IAP neben der App Engine-Anwendung, 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:

17c850de95fea839.png

Da die Anwendung jetzt ungeschützt ist, könnte ein Nutzer eine Webanfrage senden, die scheinbar IAP durchlaufen hat. Dazu können Sie beispielsweise den folgenden curl-Befehl über Cloud Shell ausführen. Ersetzen Sie dabei <Ihre-URL> durch die richtige URL für Ihre Anwendung:

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

Die Webseite wird in der Befehlszeile angezeigt und sieht so aus:

<!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. Wenn dies ein potenzielles Risiko ist, zeigt Schritt 3 eine Lösung an.

5. Schritt 3 – Kryptografische Überprüfung verwenden

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 Webanfrageheader mit dem Namen X-Goog-IAP-JWT-Assertion verwendet, der von IAP hinzugefügt wird. 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. Im letzten Schritt war Cloud Shell im Ordner iap-codelab/2-HelloUser geöffnet. 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 „Ja“ 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 bereit ist, wird die Meldung angezeigt, dass Sie sich die Anwendung mit gcloud app browse ansehen 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 IAP in Schritt 2 deaktiviert haben, sodass der Anwendung keine IAP-Daten zur Verfügung gestellt werden. Sie sollten eine Seite sehen, die in etwa so aussieht:

8ef2abcc23d96958.png

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 auf den IAP-Umschalter neben der App Engine-Anwendung, um IAP wieder zu aktivieren.

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

3a4d93c11f228852.png

Beachten Sie, dass die E-Mail-Adresse, die mit der bestätigten Methode bereitgestellt wird, 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 untersuchen

Dieser Ordner enthält die gleichen Dateien wie in Schritt 2 dargestellt, allerdings wurden zwei Dateien geändert und eine neue Datei ist neu. Die neue Datei ist auth.py und bietet eine user()-Methode zum Abrufen und Überprüfen der kryptografisch signierten Identitätsinformationen. 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 nicht bestätigten Header werden ebenfalls zum Vergleich 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']

Die assertion sind die kryptografisch signierten Daten, die im angegebenen Anfrageheader bereitgestellt werden. 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. Außerdem wird die Zielgruppe ermittelt, für die die Daten vorbereitet wurden (im Wesentlichen das zu schützende Google Cloud-Projekt). Die Hilfsfunktionen keys() und audience() erfassen diese Werte und geben sie zurück.

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

Damit ist Schritt 3 abgeschlossen.

6. Zusammenfassung

Sie haben eine App Engine-Webanwendung bereitgestellt. In Schritt 1 haben Sie den Zugriff auf die Anwendung auf die von Ihnen ausgewählten Nutzer beschränkt. In Schritt 2 haben Sie die Identität der Nutzer abgerufen und angezeigt, denen IAP Zugriff auf Ihre Anwendung gewährt hat. Außerdem haben Sie gesehen, wie diese Informationen gefälscht werden können, wenn IAP deaktiviert oder umgangen wird. In Schritt 3 haben Sie kryptografisch signierte Assertions zur Identität des Nutzers verifiziert, die nicht gefälscht werden können.

7. Bereinigen

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