Kontextsensitiven Zugriff mit Identity-Aware Proxy einrichten

In diesem Leitfaden wird gezeigt, wie Sie IAP-Zugriffsrichtlinien (Identity-Aware Proxy) mithilfe von Zugriffsebenen und mit IAM Conditions Framework (Identity and Access Management) erweitern. Zugriffsebenen ermöglichen Zugriffsbeschränkungen für Ressourcen auf Grundlage der IP-Adresse und der Endnutzergeräteattribute. Die IAM-Bedingungen ermöglichen Zugriffsbeschränkungen auf Grundlage von URL-Hosts, Pfaden, Datum und Uhrzeit.

Abhängig von der Richtlinienkonfiguration kann Ihre vertrauliche Anwendung beispielsweise:

  • Allen Mitarbeitern Zugriff gewähren, wenn sie ein vertrauenswürdiges Unternehmensgerät im Unternehmensnetzwerk verwenden.
  • Den Mitarbeitern der Gruppe Remotezugriff Zugriff gewähren, wenn sie ein vertrauenswürdiges Unternehmensgerät mit einem sicheren Passwort und mit den aktuellen Patches in einem beliebigen Netzwerk verwenden.
  • Den Mitarbeitern in der Gruppe Privilegierter Zugriff nur dann Zugriff gewähren, wenn der URL-Pfad mit /admin beginnt.

Vorbereitung

Für den Start ist Folgendes erforderlich:

  • Eine mit IAP gesicherte Anwendung, für die Sie Zugriffsrechte für Einzelpersonen oder Gruppen hinzufügen möchten.
  • Nutzer- oder Gruppennamen, denen Sie Zugriff gewähren möchten.

Zugriffsebene einrichten

Wenn Sie den Zugriff auf der Grundlage der IP-Adresse oder von Endnutzer-Geräteattributen beschränken möchten, müssen Sie eine Zugriffsebene erstellen. Informationen zum Erstellen einer Zugriffsebene finden Sie im Leitfaden zu Access Context Manager. IAP ordnet den Namen der Zugriffsebene einer mit IAP gesicherten Anwendung zu.

Dienstkonto erstellen

Sie benötigen für Ihr Projekt ein authentifiziertes Dienstkonto, um Zugriffsebenen verwenden und Ihre IAM-Richtlinie mithilfe der API aktualisieren zu können.

  1. Erstellen Sie ein neues Dienstkonto in dem Projekt, in dem Ihre Anwendung bereitgestellt wird.
  2. Authentifizieren Sie Ihr neues Dienstkonto mit gcloud auth activate-service-account.

Datei mit Anmeldedaten herunterladen

Zum Aktualisieren der IAM-Richtlinie mithilfe der API müssen Sie die JSON-Datei mit den Anmeldedaten für das neue Dienstkonto herunterladen:

  1. Rufen Sie die Seite Dienstkonten auf.
    Zur Seite "Dienstkonten"

  2. Klicken Sie auf die E-Mail-Adresse des Dienstkontos.

  3. Klicken Sie auf Bearbeiten.

  4. Klicken Sie auf Schlüssel erstellen.

  5. Wählen Sie JSON als Schlüsseltyp aus.

  6. Erstellen Sie einen neuen Schlüssel. Klicken Sie hierzu auf Erstellen und schließen Sie das Bestätigungsfenster, das angezeigt wird.

Die JSON-Datei mit den Anmeldedaten wurde jetzt heruntergeladen.

IAM-Richtlinie bearbeiten

Eine mit IAP gesicherte Anwendung hat eine IAM-Richtlinie, die die IAP-Rolle an die Anwendung bindet.

Durch das Hinzufügen einer bedingten IAM-Bindung zur IAM-Richtlinie wird der Zugriff auf Ihre Ressourcen auf der Grundlage von Anfrageattributen weiter eingeschränkt. Diese Anfrageattribute umfassen:

  • Zugriffsebenen
  • URL-Host/-Pfad
  • Datum/Uhrzeit

Beachten Sie, dass in einer bedingten IAM-Bindung festgelegte Anfragewerte, die mit request.host und request.path verglichen werden, exakt angegeben werden müssen. Wenn Sie beispielsweise den Zugriff auf Pfade beschränken, die mit /internal admin beginnen, kann man die Beschränkung über /internal%20admin umgehen. Weitere Informationen zu Hostnamen- und Pfadbedingungen finden Sie unter Hostnamen- und Pfadbedingungen verwenden.

Fügen Sie der IAM-Richtlinie bedingte Bindungen hinzu und bearbeiten Sie sie. Führen Sie hierzu die unten beschriebenen Schritte durch.

Console

So fügen Sie eine bedingte Bindung mithilfe der Cloud Console hinzu:

  1. Rufen Sie die IAP-Administratorseite auf.

    Zur IAP-Administratorseite

  2. Klicken Sie auf das Kästchen neben den Ressourcen, für die Sie IAM-Berechtigungen aktualisieren möchten.

  3. Klicken Sie auf der rechten Seite im Infobereich auf Mitglied hinzufügen.

  4. Geben Sie in das Feld Neues Mitglied die Mitglieder ein, denen Sie eine Rolle zuweisen möchten.

  5. Wählen Sie in der Drop-down-Liste Rolle auswählen die Rolle Nutzer von IAP-gesicherten Web-Apps aus und geben Sie die Bedingungen für Zugriffsebenen an, die die Mitglieder erfüllen müssen, um auf die Ressource zugreifen zu können.

    • Wenn Sie vorhandene Zugriffsebenen festlegen möchten, wählen Sie diese in der Drop-down-Liste Zugriffsebenen aus. Sie müssen die Rolle Nutzer von IAP-gesicherten Web-Apps auswählen und Berechtigungen auf Organisationsebene haben, um vorhandene Zugriffsebenen aufrufen zu können. Ihnen muss eine der folgenden Rollen zugewiesen werden:
      • Access Context Manager-Administrator
      • Access Context Manager-Bearbeiter
      • Access Context Manager-Leser
    • Zum Erstellen und Verwalten von Zugriffsebenen verwenden Sie Access Context Manager.
  6. Wenn Sie den Mitgliedern weitere Rollen hinzufügen möchten, klicken Sie auf Weitere Rolle hinzufügen.

  7. Wenn Sie mit dem Hinzufügen von Rollen fertig sind, klicken Sie auf Speichern.

    Sie haben der Ressource jetzt eine bedingte Bindung hinzugefügt.

So entfernen Sie eine bedingte Bindung:

  1. Rufen Sie die IAP-Administratorseite auf.

    Zur IAP-Administratorseite

  2. Klicken Sie auf das Kästchen neben der Ressource, von der Sie die IAM-Rolle eines Mitglieds entfernen möchten.

  3. Klicken Sie auf der rechten Seite im Infofeld unter Rolle/Mitglied auf die Rolle, die Sie dem Mitglied entziehen möchten.

  4. Klicken Sie neben dem Mitglied auf Entfernen.

  5. Klicken Sie dann im Dialogfeld Rolle des Mitglieds entfernen auf Entfernen. Wenn Sie dem Mitglied alle nicht übernommenen Rollen für die ausgewählte Ressource entziehen möchten, klicken Sie erst auf das Kästchen und dann auf Entfernen.

gcloud

Derzeit können Sie das gcloud-Tool nur zum Festlegen von bedingten Bindungen auf Projektebene verwenden.

Zum Festlegen bedingter Bindungen bearbeiten Sie die Datei policy.yaml Ihres Projekts in folgender Weise:

  1. Öffnen Sie mit dem folgenden gcloud-Befehl die IAM-Richtlinie für die Anwendung:

    gcloud projects get-iam-policy PROJECT_ID > policy.yaml

  2. Bearbeiten Sie die Datei policy.yaml, um Folgendes anzugeben:

    • Die Nutzer und Gruppen, auf die Sie die IAM-Bedingung anwenden möchten.
    • Die Rolle iap.httpsResourceAccessor, die ihnen Zugriff auf die Ressourcen gewährt.
    • Die IAM-Bedingung.

      Das folgende Snippet zeigt eine IAM-Bedingung mit nur einem festgelegten Attribut. Diese Bedingung gewährt dem Nutzer und der Gruppe Zugriff, wenn die Zugriffsebenenanforderungen für ACCESS_LEVEL_NAME erfüllt sind und der Ressourcen-URL-Pfad mit / beginnt.

      ...
      - members:
      - group:EXAMPLE_GROUP@GOOGLE.COM
      - user:EXAMPLE_USER@GOOGLE.COM
      role: roles/iap.httpsResourceAccessor
      condition:
          expression: "accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in
                       request.auth.access_levels && request.path.startsWith("/")
          title: CONDITION_TITLE
      ...

  3. Binden Sie die Richtlinie mithilfe des Befehls set-iam-policy an die Anwendung.

    gcloud projects set-iam-policy PROJECT_ID policy.yaml

Die Cloud IAM-Richtlinie enthält jetzt eine bedingte Bindung.

API

Zum Bearbeiten der Datei policy.json Ihrer Anwendung gehen Sie wie unten für Ihren Anwendungstyp dargestellt vor. Weitere Informationen zum Verwenden der IAM API für das Verwalten von Zugriffsrichtlinien finden Sie unter Zugriff auf Ressourcen verwalten, die mit IAP gesichert sind.

Bevor Sie die folgenden anwendungsspezifischen API-Schritte ausführen:

  1. Laden Sie die Datei mit den Anmeldedaten für Ihr Dienstkonto herunter.
  2. Exportieren Sie die folgenden Variablen.

    export PROJECT_NUM=PROJECT_NUMBER
    export IAP_BASE_URL=https://iap.googleapis.com/v1beta1/projects/${PROJECT_NUMBER}/iap_web
    # Replace with the path to your local service account's downloaded JSON file
    export JSON_CREDS=EXAMPLE.IAM.GSERVICEACCOUNT.COM.JSON
    # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
    export JSON_NEW_POLICY=POLICY_FILE.JSON
    

  3. Konvertieren Sie die JSON-Datei mit den Anmeldedaten für das Dienstkonto mithilfe von Oauth2l in einen OAuth-Zugriffstoken. Führen Sie hierzu den folgenden Befehl aus:

    oauth2l header --json ${JSON_CREDS} cloud-platform

  4. Wenn Sie den obigen Befehl das erste Mal ausführen, folgen Sie bei Aufforderung den folgenden Schritten:

    1. Rufen Sie den Bestätigungscode ab. Klicken Sie hierzu auf den angezeigten Link und kopieren Sie den Code.
    2. Fügen Sie den Bestätigungscode in die Eingabeaufforderung der Anwendung ein.
    3. Kopieren Sie das zurückgegebene Inhabertoken.
    4. Exportieren Sie eine neue Variable, die dem zurückgegebenen Inhabertoken zugewiesen wurde.
      export CLOUD_OAUTH_TOKEN=AUTHORIZATION_BEARER_TOKEN
  5. Wenn Sie diesen Befehl vorher schon einmal ausgeführt haben, exportieren Sie die folgende Variable.

    export CLOUD_OAUTH_TOKEN ="$(oauth2l header --json ${JSON_CREDS} cloud-platform)"

App Engine

  1. Exportieren Sie die folgenden App Engine-Variablen:

    # The APP_ID is usually the project ID
    export GAE_APP_ID=APP_ID
    export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}

  2. Rufen Sie die IAM-Richtlinie für die App Engine-Anwendung mit der Methode getIamPolicy ab. Das leere Datenbit am Ende wandelt die curl-Anfrage in POST anstelle von GET um.

    curl -i -H "${CLOUD_OAUTH_TOKEN}" ${GAE_BASE_URL}/:getIamPolicy \
         -d ''
    

  3. Fügen Sie der JSON-Datei der IAM-Richtlinie die bedingte IAM-Bindung hinzu. Im Folgenden finden Sie ein Beispiel für eine bearbeitete Datei policy.json, mit der die Rolle iap.httpsResourceAccessor an zwei Nutzer gebunden und diesen Zugriff auf die mit IAP gesicherten Ressourcen gewährt wird. Es wurde eine IAM-Bedingung hinzugefügt, damit sie nur dann Zugriff auf die Ressourcen haben, wenn die Zugriffsebenenanforderung für ACCESS_LEVEL_NAME erfüllt ist und der URL-Pfad der Ressource mit / beginnt. Es kann nur eine Bedingung pro Bindung geben.

    Beispieldatei policy.json

    {
    "policy": {
    "bindings": [
    {
      "role": "roles/iap.httpsResourceAccessor",
      "members": [
          "group:EXAMPLE_GROUP@GOOGLE.COM",
          "user:EXAMPLE_USER@GOOGLE.COM"
      ],
      "condition": {
        "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")",
        "title": "CONDITION_NAME"
      }
    }
    ]
    }
    }

  4. Legen Sie die neue Datei policy.json mit der Methode setIamPolicy fest.

    curl -i -H "${CLOUD_OAUTH_TOKEN}" ${GAE_BASE_URL}:setIamPolicy \
         -d @${JSON_NEW_POLICY}

App Engine-Dienste und -Versionen

Sie können auch die IAM-Richtlinie eines App Engine-Dienstes, aller Versionen oder einer bestimmten Version eines Dienstes aktualisieren. Führen Sie die folgenden Schritte für eine bestimmte Version eines Dienstes aus:

  1. Exportieren Sie die folgenden zusätzlichen Variablen.
    export GAE_SERVICE=SERVICE_NAME
    export GAE_VERSION=VERSION_NAME
    
  2. Aktualisieren Sie die exportierte Variable GAE_BASE_URL.
    export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}/services/${GAE_SERVICE}/versions/${GAE_VERSION}
  3. Rufen Sie die IAM-Richtlinie für die Version ab und richten Sie sie mithilfe der oben dargestellten Befehle getIamPolicy und setIamPolicy ein.

GKE und Compute Engine

  1. Exportieren Sie die Projekt-ID Ihres Back-End-Dienstes.

    export BACKEND_SERVICE_NAME=BACKEND_SERVICE_NAME

  2. Rufen Sie die IAM-Richtlinie für die Compute Engine-Anwendung mit der Methode getIamPolicy ab. Das leere Datenbit am Ende wandelt die curl-Anfrage in POST anstelle von GET um.

    curl -i -H "${CLOUD_OAUTH_TOKEN}" ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:getIamPolicy \
         -d ''

  3. Fügen Sie der JSON-Datei der IAM-Richtlinie die bedingte IAM-Bindung hinzu. Im Folgenden finden Sie ein Beispiel für eine bearbeitete Datei policy.json, mit der die Rolle iap.httpsResourceAccessor an zwei Nutzer gebunden und diesen Zugriff auf die mit IAP gesicherten Ressourcen gewährt wird. Es wurde eine IAM-Bedingung hinzugefügt, damit sie nur dann Zugriff auf die Ressourcen haben, wenn die Zugriffsebenenanforderung für ACCESS_LEVEL_NAME erfüllt ist und der URL-Pfad der Ressource mit / beginnt. Es kann nur eine Bedingung pro Bindung geben.


    Beispieldatei policy.json

    {
    "policy": {
    "bindings": [
    {
    "role": "roles/iap.httpsResourceAccessor",
    "members": [
      "group":EXAMPLE_GROUP@GOOGLE.COM,
      "user:EXAMPLE_USER@GOOGLE.COM"
    ],
    "condition": {
      "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")",
      "title": "CONDITION_NAME"
    }
    }
    ]
    }
    }

  4. Legen Sie die neue Datei policy.json mit der Methode setIamPolicy fest.

    curl -i -H "Content-Type:application/json" \
         -H "$(oauth2l header --json ${JSON_CREDS} cloud-platform)" \
         ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:setIamPolicy \
         -d @${JSON_NEW_POLICY}

Hostnamen- und Pfadbedingungen verwenden

Der Zugriff auf Ihre Anwendung kann mithilfe des Hostnamens und des Pfads einer Anfrage-URL gesichert werden. Beispielsweise kann die IAM-Bedingung request.path.startsWith dazu verwendet werden, um Mitarbeitern der Gruppe Privilegierter Zugriff nur dann Zugriff zu gewähren, wenn der URL-Pfad mit /admin beginnt.

Weitere Informationen zur Verwendung von Hostnamen- und Pfadbedingungen finden Sie unter Anfrageattribute.

Stringnormalisierung

Eine URL hat einen Hostnamen und einen Pfad. Beispielsweise enthält die URL https://sheets.google.com/create?query=param einen Hostnamen von sheets.google.com und einen Pfad von /create.

Back-Ends können Hostnamen und Pfade auf verschiedene Arten interpretieren. IAP normalisiert beim Prüfen der Richtlinien Hostnamen und Pfadstrings, um Mehrdeutigkeiten zu beseitigen.

IAP führt zwei Richtlinienprüfungen durch, wenn eine Anfrage einen nicht normalisierten Pfad enthält. Wenn der nicht normalisierte Pfad die Richtlinienprüfung besteht, normalisiert IAP den Pfad und eine zweite Richtlinienprüfung wird ausgeführt. Der Zugriff wird gewährt, wenn sowohl der nicht normalisierte als auch der normalisierte Pfad die Richtlinienprüfung bestehen.

Wenn eine Anfrage beispielsweise den Pfad /internal;some_param/admin enthält, führt IAP zuerst eine Richtlinienprüfung für den nicht normalisierten Pfad aus (/internal). Wenn diese Prüfung bestanden wird, führt IAP eine zweite Richtlinienprüfung für den normalisierten Pfad aus (/internal/admin).

Hostnamen

So werden Hostnamen normalisiert:

  • Punkte am Ende entfernen
  • Umwandlung in Kleinbuchstaben durchführen
  • Umwandlung in ASCII durchführen

Hostnamen, die Nicht-ASCII-Zeichen enthalten, werden mithilfe von Punycode weiter normalisiert. Sie müssen den Hostnamenstring mithilfe von Punycode umwandeln, damit ein Abgleich ausgeführt werden kann.

Verwenden Sie dafür einen Converter wie Punycoder.

Im Folgenden finden Sie Beispiele für normalisierte Hostnamen:

  • FOO.com wird auf foo.com normalisiert
  • café.fr wird auf xn--caf-dma.fr normalisiert

Pfade

So werden Pfade normalisiert:

  • Pfadparameter entfernen
  • Relative Pfade in ihre absolute Entsprechung auflösen

Ein Pfadparameter enthält alle Zeichen von einem ; bis entweder zum nächsten / oder zum Ende des Pfads.

Anfragen, die am Anfang eines Pfadabschnitts ..; enthalten, gelten als ungültig. Beispiel: /..;bar/ und /bar/..;/ geben den Fehler HTTP 400: Bad Request zurück.

Im Folgenden finden Sie Beispiele für normalisierte Pfade:

  • /internal;some_param/admin wird auf /internal/admin normalisiert
  • /a/../b wird auf /b normalisiert
  • /bar;param1/baz;baz;param2 wird auf /bar/baz normalisiert

Subdomain-Endungen

Eine mit request.host.endsWith("google.com") festgelegte Richtlinie entspricht sowohl sub_domain.google.com wie testgoogle.com. Wenn Sie Ihre Richtlinie auf alle Subdomains beschränken möchten, die mit google.com enden, legen Sie Ihre Richtlinie auf request.host.endsWith(".google.com") fest.

Beachten Sie, dass die Festlegung Ihrer Richtlinie auf request.host.endsWith(".google.com") der Subdomain sub_domain.google.com entspricht, wegen des zusätzlichen Zeichens . aber nicht google.com.

Cloud-Audit-Logs und Zugriffsebenen

Durch Aktivieren von Cloud-Audit-Logging für Ihr mit IAP gesichertes Projekt können Sie feststellen, welche autorisierten und nicht autorisierten Zugriffsanfragen gesendet wurden. Prüfen Sie mit den zugehörigen Audit-Logs die Anfragen und alle Zugriffsebenen, die ein Anfragender erfüllt hat. Führen Sie hierzu folgende Schritte aus:

  1. Rufen Sie in der Cloud Console die Seite Logs für Ihr Projekt auf.
    Zur Seite „Logs“
  2. Wählen Sie in der Drop-down-Liste Ressourcenauswahl eine Ressource aus. Zu den mit IAP gesicherten HTTPS-Ressourcen gehören die GAE-Anwendung und der GCE-Back-End-Dienst. Mit IAP gesicherte SSH- und TCP-Ressourcen befinden sich unter einer GCE-VM-Instanz.
  3. Wählen Sie in der Drop-down-Liste Logtyp die Option data_access aus.
    • Der Logtyp data_access wird nur angezeigt, wenn nach dem Aktivieren von Cloud-Audit-Logging für IAP Traffic zu Ihrer Ressource gesendet wurde.
  4. Maximieren Sie das Datum und die Uhrzeit des Zugriffs, den Sie untersuchen möchten.
    • Autorisierte Zugriffe sind mit einem blauen i-Symbol gekennzeichnet.
    • Nicht autorisierte Zugriffe haben ein orangefarbenes !!-Symbol.
  5. Rufen Sie die vom Anfragenden erfüllten Zugriffsebenen auf. Erweitern Sie hierzu die Abschnitte durch Klicken, bis Sie protoPayload > requestMetadata > requestAttributes > auth > accessLevels erreichen.

Wenn Sie eine Anfrage aufrufen, werden alle Zugriffsebenen, die ein Nutzer erfüllt hat, aufgeführt, einschließlich Zugriffsebenen, die für den Zugriff nicht erforderlich waren. Für eine nicht autorisierte Anfrage wird aber nicht angezeigt, welche Zugriffsebenen nicht erfüllt wurden. Dazu müssen Sie die Bedingungen für die Ressource mit den Zugriffsebenen vergleichen, die für die Anfrage angegeben werden.

Weitere Informationen zu Logs finden Sie in der Anleitung Cloud-Audit-Logging.