Nutzerauthentifizierung mit Identity-Aware Proxy

1. Einführung

Das Authentifizieren der Nutzer von Webanwendungen ist häufig notwendig und erfordert in der Regel eine spezielle Programmierung. Bei Google Cloud Platform-Anwendungen 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 von IAP abrufen.

Überblick

In diesem Codelab erstellen Sie mit Google App Engine eine einfache Webanwendung und erfahren, wie Sie mithilfe von Identity-Aware Proxy (IAP) den Zugriff auf die Anwendung einschränken und Informationen zur Nutzeridentität für sie bereitstellen. 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

  • Mit Python 3.7 eine einfache App Engine-Anwendung 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.
  • Grundlegende Kenntnisse der Programmiersprache Python

In diesem Codelab liegt der Fokus 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.

2. Einrichtung

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

Console und Cloud Shell starten

Klicken Sie links oben auf der Lab-Seite auf die Schaltfläche „Google Console öffnen“. Sie müssen sich mit dem Nutzernamen und dem Passwort anmelden, die unter dieser Schaltfläche angezeigt werden.

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. Öffnen Sie Cloud Shell, indem Sie rechts im Header der Console-Seite 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 auf Ihrem eigenen PC ausgeführt werden, Sie müssen jedoch zuerst die erforderliche Entwicklungssoftware installieren und konfigurieren. Cloud Shell enthält bereits alle erforderlichen Softwaretools.

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

Sie erstellen mit Python 3.7 eine App Engine-Standardanwendung, in der eine einfache Begrüßungsseite mit dem Titel „Hello, World“ angezeigt wird. Sie stellen die Anwendung bereit und testen sie. Anschließend beschränken Sie den Zugriff mithilfe von IAP.

Anwendungscode überprü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. Er verwendet das Flask-Webframework, um auf Webanfragen mit dem Inhalt einer Vorlage zu antworten. Die Vorlagendatei befindet sich unter templates/index.html und enthält für diesen Schritt nur einfaches HTML. Eine zweite Vorlagendatei unter templates/privacy.html enthält eine beispielhafte einfache Datenschutzrichtlinie.

Es gibt noch zwei weitere Dateien: In requirements.txt sind alle nicht standardmäßigen Python-Bibliotheken aufgelistet, die von der Anwendung verwendet werden, und mit app.yaml wird der Google Cloud Platform mitgeteilt, dass es sich um eine in Python 3.7 geschriebene 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-Codeeditor öffnen, indem Sie rechts oben im Cloud Shell-Fenster auf das Stiftsymbol klicken, und so den Code abrufen.

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

In App Engine bereitstellen

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

gcloud app deploy

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

Nach einigen Minuten sollte die Bereitstellung abgeschlossen sein und Sie sehen 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, klicken Sie auf den angezeigten Link, um ihn in einem neuen Tab zu öffnen, oder kopieren Sie ihn, wenn nötig, 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 beschränken

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

Da Sie zum ersten Mal eine Authentifizierungsoption für dieses Projekt aktiviert haben, erscheint eine Meldung, in der Sie aufgefordert werden, Ihren OAuth-Zustimmungsbildschirm zu konfigurieren, um IAP verwenden zu können.

Klicken Sie auf die Schaltfläche „ZUSTIMMUNGSBILDSCHIRM KONFIGURIEREN“. Ein neuer Tab zum Konfigurieren des Zustimmungsbildschirms wird geöffnet.

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

Name der Anwendung

IAP-Beispiel

Support-E-Mail-Adresse

Ihre E‑Mail-Adresse. Möglicherweise ist das Feld bereits für Sie ausgefüllt.

Autorisierte Domain

Der Hostname-Abschnitt der URL der Anwendung, z.B. iap-example-999999.appspot.com. Sie können den Abschnitt in der Adressleiste der zuvor geöffneten „Hello World“-Webseite sehen. Geben Sie dabei nicht das einleitende https:// oder das nachfolgende Zeichen / aus der URL an.Sie müssen die Eingabetaste drücken, nachdem Sie diesen Wert eingegeben haben.

Link zur Startseite der Anwendung

Die URL, die Sie zum Anzeigen der App verwendet haben

Link zur Datenschutzerklärung der Anwendung

Der Link zur Datenschutzseite der App; entspricht dem Link zur Startseite plus der Endung /privacy

Klicken Sie auf Speichern. Sie werden aufgefordert, Anmeldedaten zu erstellen. Für dieses Codelab müssen Sie keine Anmeldedaten erstellen und können diesen Browsertab daher 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 auf den Ein/Aus-Button in der IAP-Spalte in der Zeile mit der App Engine-Anwendung, um IAP zu aktivieren.

Sie sehen die Domainnamen, die von IAP geschützt werden. Klicken Sie auf „Aktivieren“.

Öffnen Sie nun einen Browsertab und rufen Sie die Anwendung anhand der URL auf. Die Seite „Über Google anmelden“ wird angezeigt, auf der Sie aufgefordert werden, sich anzumelden, um auf die Anwendung 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. Klicken Sie auf „Mitglied hinzufügen“. Geben Sie Ihre E-Mail-Adresse ein und wählen Sie die Cloud IAP-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. Ihnen wird möglicherweise trotzdem die Meldung „You don't have access“ (Sie haben keinen Zugriff) angezeigt, da IAP Ihre Autorisierung möglicherweise noch nicht wieder überprüft hat. Führen Sie in diesem Fall die folgenden Schritte aus:

  • Öffnen Sie mit Ihrem Webbrowser die Startseite und fügen Sie am Ende der URL /_gcp_iap/clear_login_cookie hinzu, sodass die URL https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie lautet.
  • 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 „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 der angemeldeten Nutzerin oder 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.

Das ist Schritt 2. Im letzten Schritt war in Cloud Shell der 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 „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, erscheint die Meldung, dass Sie Ihre Anwendung mit dem Befehl 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:

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 ansehen

Dieser Ordner enthält die gleichen Dateien wie in Schritt 1, jedoch wurden zwei Dateien verä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.

Es gibt in main.py zwei Zeilen, die die von IAP bereitgestellten Informationen zur Nutzeridentität empfangen:

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 zur Verfügung gestellt. In den Namen wird die Groß-/Kleinschreibung nicht berücksichtigt, sodass sie je nach Präferenz auch 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 accounts.google.com: vorangestellt. Dies gibt an, woher die Daten 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 Fenster der Cloud Console oben links auf das Menüsymbol, dann auf „Sicherheit“ und anschließend auf „Identity-Aware Proxy“. Klicken Sie auf den Ein/Aus-Schalter 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, kann ein Nutzer eine Webanfrage senden, die scheinbar IAP durchlaufen hat. Sie können beispielsweise den folgenden curl-Befehl in Cloud Shell ausführen (ersetzen Sie <your-url-here> durch die richtige 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 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. In Fällen, in denen dies ein potenzielles Risiko darstellt, bietet Schritt 3 eine Lösung.

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 Webanfrage-Header mit dem Namen X-Goog-IAP-JWT-Assertion von IAP hinzugefügt. 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 in Cloud Shell der 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 „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, erscheint die Meldung, dass Sie Ihre Anwendung mit dem Befehl 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 IAP in Schritt 2 deaktiviert haben. Die Anwendung erhält daher keine IAP-Daten. 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 Fenster der Cloud Console oben links auf das Menüsymbol, dann auf „Sicherheit“ und anschließend auf „Identity-Aware Proxy“. Klicken Sie auf den Ein/Aus-Schalter für IAP 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 Überprüfungsmethode bereitgestellt wurde, nicht das Präfix accounts.google.com: enthält.

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 ansehen

Dieser Ordner enthält die gleichen Dateien wie in Schritt 2, jedoch wurden zwei Dateien verändert und eine neue hinzugefügt. Die neue Datei heißt 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, die nun die Ergebnisse dieser Methode verwenden. Zum Vergleich werden auch die nicht überprüften Header angezeigt, die in Schritt 2 gefunden wurden.

Die neuen Informationen befinden 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-Daten sind die kryptografisch signierten Daten, die im angegebenen Anfrageheader bereitgestellt 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. Außerdem 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 gesammelt und zurückgegeben.

Das signierte Objekt enthält zwei Datenwerte, die Sie benötigen: die geprüfte E-Mail-Adresse und den eindeutigen ID-Wert (angegeben im Standardfeld sub, das für „subscriber“ steht).

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 derjenigen Nutzer abgerufen und anzeigen lassen, denen IAP Zugriff auf Ihre Anwendung gewährt hat. Sie haben dann 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 überprüft, die nicht gefälscht werden können.

7. Bereinigen

Die einzigen Google Cloud Platform-Ressourcen, die Sie in diesem Codelab verwendet haben, sind App Engine-Instanzen. Bei jeder Bereitstellung der App wurde eine neue Version erstellt, die bis zum Löschen weiterhin vorhanden ist. Beenden Sie das Lab, um das Projekt und alle darin enthaltenen Ressourcen zu löschen.