Endnutzer von Cloud Run for Anthos-Diensten mit Istio und Identity Platform authentifizieren

In dieser Anleitung wird beschrieben, wie Endnutzer von Anwendungen authentifiziert werden, die in Cloud Run for Anthos mithilfeIstio-Authentifizierungsrichtlinien undIdentity Platform bereitgestellt werden. Wenn Sie Istio zur Authentifizierung verwenden, muss die Authentifizierungslogik nicht Teil des Anwendungscodes sein. Durch diese Trennung können verschiedene Teams für den Anwendungscode und die Authentifizierungsrichtlinie verantwortlich sein. Außerdem können die Authentifizierungsrichtlinien für mehrere Anwendungen oder Dienste gelten.

Einführung

Mit Cloud Run for Anthos können Entwicklungsteams in GKE ausgeführte Anwendungen und Funktionen serverlos bereitstellen und verwalten. Die Lösung unterstützt bedarfsgesteuertes Autoscaling, Routing- und Trafficverwaltung für Blau/Grün-Deployments und vieles mehr. Cloud Run for Anthos basiert auf den Open-Source-Projekten Istio und Knative und kann in Google Cloud-Produkte wie Cloud Logging eingebunden werden.

Istio kann eingehende Anfragen durch Validierung von JSON-Web-Tokens (JWT) gemäß den Authentifizierungsrichtlinien authentifizieren. Die Authentifizierungsrichtlinien können auf alle Dienste in einem Namespace oder auf bestimmte benannte Dienste angewendet werden. Eine Richtlinie kann bestimmte HTTP-Anfragepfade einschließen und ausschließen, um beispielsweise den nicht authentifizierten Zugriff auf öffentliche Websiteobjekte und Endpunkte für Systemdiagnosen zu ermöglichen. In dieser Anleitung wird die Authentifizierungsrichtlinie durch das Istio Ingress Gateway erzwungen.

Das folgende Diagramm zeigt den Authentifizierungsablauf, der dieser Anleitung zugrunde liegt.

Istio authentifiziert eingehende Anfragen

In dieser Anwendung werden Endnutzer über die Identity Platform angemeldet. Sie können die Anwendung jedoch auch für andere Anbieter anpassen, die OpenID Connect unterstützen, darunter Google Sign-In, Firebase Authentication, Angebote von Drittanbietern wie Auth0, Gluu, Okta, Ping Identity oder Ihr eigenes Deployment einer OpenID Connect-Implementierung.

Ziele

  • GKE-Cluster mit dem Cloud Run-Add-On erstellen
  • Identity Platform einrichten
  • Beispielanwendung bereitstellen, die aus einer öffentlichen Front-End- und Back-End-API besteht
  • Authentifizierungsrichtlinie für die Back-End-API hinzufügen
  • Authentifizierung überprüfen

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss dieser Anleitung können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweis

  1. Melden Sie sich in Ihrem Google-Konto an oder, falls Sie noch keines haben, registrieren Sie sich für ein neues Konto.
  2. Rufen Sie in der Google Cloud Console die Seite für die Projektauswahl auf.

    Zur Projektauswahl

  3. Wählen Sie ein Google Cloud-Projekt aus oder erstellen Sie eines.

  4. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  5. Aktivieren Sie die Cloud Build, Cloud Run, Container Analysis und Google Kubernetes Engine APIs und die Cloud APIs.

    APIS AKTIVIEREN

Umgebung initialisieren

In diesem Abschnitt legen Sie Umgebungsvariablen und gcloud-Standardwerte fest, die Sie später in der Anleitung verwenden.

  1. Wählen Sie in der Cloud Console aus dem Drop-down-Menü Projekt auswählen das Projekt aus, das Sie verwenden möchten.

  2. Öffnen Sie Cloud Shell:

    Zu Cloud Shell

    Für alle Befehle in dieser Anleitung wird Cloud Shell verwendet.

  3. Legen Sie Umgebungsvariablen und gcloud-Standardwerte für die Compute Engine-Zone und den GKE-Clusternamen fest, die Sie für diese Anleitung verwenden möchten:

    ZONE=us-central1-c
    CLUSTER=cloud-run-gke-auth-tutorial
    
    gcloud config set compute/zone $ZONE
    gcloud config set run/cluster $CLUSTER
    gcloud config set run/cluster_location $ZONE
    

    Sie können die Zone und den Clusternamen entsprechend Ihren Anforderungen ändern.

GKE-Cluster mit aktiviertem Cloud Run erstellen

  • GKE-Cluster mit dem Cloud Run-Add-On erstellen:

    gcloud beta container clusters create $CLUSTER \
        --addons HorizontalPodAutoscaling,HttpLoadBalancing,CloudRun \
        --enable-ip-alias \
        --machine-type n1-standard-2
    

Öffentliche IP-Adresse ermitteln

Cloud Run for Anthos stellt externe Dienste unter der öffentlichen IP-Adresse des Istio Ingress Gateways zur Verfügung.

  1. Prüfen Sie den Status der Erstellung einer externen IP-Adresse für den Kubernetes-Dienst istio-ingress:

    kubectl get services istio-ingress -n gke-system --watch
    

    Warten Sie, bis sich der Wert für EXTERNAL-IP von <pending> in eine IP-Adresse ändert. Wenn der Fehler NotFound ausgegeben wird, warten Sie eine Minute und führen Sie den Befehl noch einmal aus. Zum Abbrechen des Wartevorgangs drücken Sie Strg+C.

  2. Erstellen Sie eine Umgebungsvariable zum Speichern der öffentlichen IP-Adresse des Istio Ingress Gateways:

    export EXTERNAL_IP=$(kubectl get services istio-ingress \
        --namespace gke-system \
        --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
    
  3. Rufen Sie die öffentliche IP-Adresse des Istio Ingress Gateways auf. Sie benötigen diese Adresse später.

    echo $EXTERNAL_IP
    

Hinweis: In dieser Anleitung nutzen Sie eine IP-Adresse und unverschlüsseltes HTTP, um auf die Dienste zuzugreifen. Zum Einrichten der Produktion empfehlen wir, die folgenden beiden Schritte auszuführen:

  • Erstellen Sie einen DNS-A-Eintrag für Ihren Domainnamen und legen Sie als Wert die öffentliche IP-Adresse des Istio-Ingress-Gateways fest. Ersetzen Sie dabei im weiteren Verlauf dieser Anleitung $EXTERNAL_IP durch den Domainnamen des DNS-A-Eintrags. Wenn Sie Cloud DNS verwenden, folgen Sie der Kurzanleitung. Wenn Sie einen anderen Anbieter verwenden, lesen Sie die zugehörige Dokumentation.
  • HTTPS für Cloud Run for Anthos-Dienste aktivieren

Identity Platform einrichten

  1. Lassen Sie Cloud Shell geöffnet und besuchen Sie den Google Cloud Marketplace, um Identity Platform in einem neuen Browserfenster zu aktivieren.

    Zu Identity Platform in Google Cloud Marketplace

  2. Wählen Sie aus der Drop-down-Liste Projekt auswählen das Google Cloud-Projekt aus, in dem Sie Identity Platform einrichten möchten. Sie können den GKE-Cluster und Identity Platform in separaten Google Cloud-Projekten einrichten. Verwenden Sie der Einfachheit halber dasselbe Projekt in dieser Anleitung.

  3. Klicken Sie auf Identity Platform aktivieren.

    Sie befinden sich nun auf der Seite Identity Platform > Anbieter in der Cloud Console.

  4. Auf der Seite Anbieter klicken Sie auf Anbieter hinzufügen.

  5. Scrollen Sie in der Drop-down-Liste Anbieter auswählen nach unten und wählen Sie E-Mail/Passwort aus. Für Ihre eigene Anwendung können Sie die Anbieter auswählen, die Sie aktivieren möchten.

  6. Achten Sie darauf, dass Aktiviert ausgewählt ist.

  7. Deaktivieren Sie Anmeldung ohne Passwort zulassen.

  8. Klicken Sie auf Speichern.

  9. Wechseln Sie zur Seite Identity Platform > Einstellungen.

  10. Klicken Sie auf den Tab Sicherheit.

  11. Klicken Sie auf Add Domain. Hierdurch wird das Dialogfeld Autorisierte Domain hinzufügen geöffnet.

  12. Geben Sie im Feld Domain die öffentliche IP-Adresse des Istio Ingress Gateways aus dem vorherigen Abschnitt ein ($EXTERNAL_IP).

  13. Klicken Sie auf Hinzufügen. Das Dialogfeld wird geschlossen. Die von Ihnen eingegebene IP-Adresse befindet sich in der Tabelle Autorisierte Domains.

  14. Klicken Sie auf der Seite Identity Platform > Einstellungen auf Speichern.

Testnutzer erstellen

  1. Öffnen Sie in der Cloud Console die Seite Identity Platform > Nutzer.
  2. Klicken Sie auf Nutzer hinzufügen, um einen Testnutzer für diese Anleitung hinzuzufügen. Hierdurch wird das Dialogfeld Nutzer hinzufügen geöffnet.
  3. Geben Sie im Feld E-Mail die E-Mail-Adresse eines Endnutzers ein. Zum Testen muss diese E-Mail-Adresse nicht echt sein. Verwenden Sie für diese Anleitung user@example.com.
  4. Geben Sie im Feld Passwort ein Passwort für den Testnutzer ein. Notieren Sie sich dieses Passwort, da Sie es später benötigen.
  5. Klicken Sie auf Hinzufügen, um den Nutzer hinzuzufügen. Dadurch wird das Dialogfeld geschlossen und Sie kehren zur Seite Identity Platform > Nutzer zurück.

Beispielanwendung erstellen

Stellen Sie eine Beispielanwendung mit zwei Diensten bereit. Einer der Dienste ist eine öffentliche Front-End-Benutzeroberfläche. Der andere Dienst ist eine Back-End-API.

  1. Klicken Sie auf der Seite Identity Platform > Nutzer rechts im Fenster auf den Link Einrichtungsdetails für die Anwendung. Daraufhin wird das Dialogfeld Anwendung konfigurieren geöffnet.

  2. Markieren und kopieren Sie den Wert apiKey in Ihre Zwischenablage (Strg+C unter Chrome OS/Linux/Windows, Befehlstaste+C unter MacOS).

  3. Klicken Sie auf Schließen, um das Dialogfeld Anwendung konfigurieren zu schließen.

  4. Erstellen Sie in Cloud Shell eine Umgebungsvariable, um apiKey zu speichern. Dabei ist api-key der apiKey aus dem Dialogfeld Anwendung konfigurieren:

    export AUTH_APIKEY=api-key
    
  5. Erstellen Sie eine Umgebungsvariable für authDomain:

    export AUTH_DOMAIN=$GOOGLE_CLOUD_PROJECT.firebaseapp.com
    
  6. Klonen Sie das Repository der Cloud Run-Beispiele aus GitHub:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples.git
    
  7. Wechseln Sie in das Verzeichnis mit den Dateien für diese Anleitung:

    cd cloud-run-samples/identity-platform/gke
    
  8. Ersetzen Sie die Identity Platform-Variablen in der Front-End-JavaScript-Datei:

    envsubst < frontend/index.template.js > frontend/index.js
    

Beispielanwendung bereitstellen

  1. Verwenden Sie Cloud Build, um zwei Container-Images für die Beispielanwendung zu erstellen, eines für das Front-End und eines für das Back-End:

    gcloud builds submit -t gcr.io/$GOOGLE_CLOUD_PROJECT/cloud-run-gke-auth-frontend frontend
    
    gcloud builds submit -t gcr.io/$GOOGLE_CLOUD_PROJECT/cloud-run-gke-auth-backend backend
    

    Cloud Build speichert die Images in Container Registry.

  2. Erstellen Sie im GKE-Cluster zwei Namespaces mit den Namen public und api:

    kubectl create namespace public
    
    kubectl create namespace api
    
  3. Stellen Sie das Front-End-Container-Image als Dienst im Namespace public in Cloud Run for Anthos bereit:

    gcloud run deploy frontend \
        --namespace public \
        --image gcr.io/$GOOGLE_CLOUD_PROJECT/cloud-run-gke-auth-frontend \
        --platform gke
    
  4. Stellen Sie das Back-End-Container-Image als Dienst im Namespace api in Cloud Run for Anthos bereit:

    gcloud run deploy backend \
        --namespace api \
        --image gcr.io/$GOOGLE_CLOUD_PROJECT/cloud-run-gke-auth-backend \
        --platform gke
    
  5. Erstellen Sie einen virtuellen Istio-Dienst, der Anfragen anhand des URI-Pfads weiterleitet:

    kubectl apply -f istio/virtualservice.yaml
    

    Dieser virtuelle Dienst leitet Anfragen, bei denen der URI-Pfad mit /api/ beginnt, an die Back-End-API und alle anderen Anfragen an die Front-End-Benutzeroberfläche weiter.

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: cloud-run-gke-auth
    spec:
      gateways:
      - gke-system-gateway.knative-serving.svc.cluster.local
      hosts:
      - "*"
      http:
      - match:
        - uri:
            prefix: "/api/"
        rewrite:
          authority: backend.api.svc.cluster.local
        route:
        - destination:
            host: cluster-local-gateway.gke-system.svc.cluster.local
      - match:
        - uri:
            prefix: "/"
        rewrite:
          authority: frontend.public.svc.cluster.local
        route:
        - destination:
            host: cluster-local-gateway.gke-system.svc.cluster.local
  6. Überprüfen Sie, ob nicht authentifizierte Anfragen an die Back-End-API erfolgreich sind:

    curl -si $EXTERNAL_IP/api/secure.json | head -n1
    

    Wenn die Ausgabe nicht HTTP/1.1 200 OK ist, warten Sie eine Minute und versuchen Sie es noch einmal.

Istio-Authentifizierungsrichtlinie hinzufügen

  1. Erstellen Sie eine Istio-Authentifizierungsrichtlinie:

    envsubst < istio/authenticationpolicy.template.yaml | kubectl apply -f -
    
    apiVersion: authentication.istio.io/v1alpha1
    kind: Policy
    metadata:
      name: api-origin-auth
      namespace: gke-system
    spec:
      targets:
      - name: istio-ingress
        ports:
        - number: 80
        - number: 443
      origins:
      - jwt:
          issuer: "https://securetoken.google.com/$GOOGLE_CLOUD_PROJECT"
          audiences:
          - "$GOOGLE_CLOUD_PROJECT"
          jwksUri: "https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com"
          trigger_rules:
          - excluded_paths:
            - exact: /api/healthz
            included_paths:
            - prefix: /api/
      principalBinding: USE_ORIGIN

    Diese Richtlinie authentifiziert Anfragen, deren URI-Pfad mit /api/ beginnt, mit Ausnahme des Pfads /api/healthz. Aufgrund der Weiterleitungsregeln im virtuellen Istio-Dienst, der im vorherigen Abschnitt bereitgestellt wurde, authentifiziert diese Richtlinie Anfragen an die Back-End-API.

  2. Es kann einen Moment dauern, bis die Richtlinie wirksam wird. Führen Sie den folgenden Befehl aus und warten Sie, bis HTTP/1.1 401 Unauthorized angezeigt wird:

    while sleep 2; do
      curl -si $EXTERNAL_IP/api/secure.json | head -n1
    done
    

    Zu Beginn wird möglicherweise abwechselnd HTTP/1.1 200 OK und HTTP/1.1 401 Unauthorized ausgegeben. Dies liegt an der Eventual Consistency von Istio und Envoy Proxy.

    Wenn nur HTTP/1.1 401 Unauthorized angezeigt wird, drücken Sie Strg+C, um den Wartevorgang zu beenden.

Lösung testen

  1. Öffnen Sie ein Browserfenster unter der Adresse http://$EXTERNAL_IP/api/secure.json. Dabei ist $EXTERNAL_IP die öffentliche IP-Adresse des Istio Ingress Gateways, die Sie im Abschnitt Öffentliche IP-Adresse ermitteln ermittelt haben.

    Diese Anfrage richtet sich direkt an die Back-End-API. Im Browserfenster wird die Meldung Origin authentication failed angezeigt, da die Anfrage keine Anmeldedaten enthielt, die die Istio-Authentifizierungsrichtlinie erfüllten.

  2. Öffnen Sie ein Browserfenster unter der Adresse $EXTERNAL_IP. Daraufhin wird ein Anmeldeformular angezeigt.

  3. Melden Sie sich mit dem Testnutzer an, den Sie im Abschnitt Testnutzer erstellen erstellt haben.

    Auf dieser Seite werden die E-Mail-Adresse des Testnutzers und der Text The secret message is: Hello World angezeigt. Es kann einen Moment dauern, bis die Nachricht angezeigt wird.

    Der Browser ruft die Nachricht über eine HTTP-Anfrage an die Back-End-API (/api/secure.json) ab. Dabei wird ein Token verwendet, das von Identity Platform bei der Anmeldung bezogen wurde. Untersuchen Sie die Datei frontend/index.js, um die Implementierung aufzurufen. Weitere Informationen finden Sie in der FirebaseUI-Bibliothek.

Fehlerbehebung

Wenn Sie Probleme mit dieser Anleitung haben, empfehlen wir Ihnen, die folgenden Dokumente zu lesen:

Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden:

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Ressourcen löschen

Wenn Sie das in dieser Anleitung verwendete Google Cloud-Projekt beibehalten möchten, löschen Sie die einzelnen Ressourcen:

  1. Löschen Sie den GKE-Cluster:

    gcloud container clusters delete $CLUSTER --async --quiet
    
  2. Löschen Sie die Beispiele für Anwendungs-Container-Images in Container Registry:

    gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/cloud-run-gke-auth-frontend \
        --force-delete-tags --quiet
    
    gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/cloud-run-gke-auth-backend \
        --force-delete-tags --quiet
    
  3. Löschen Sie den Identitätsanbieter E-Mail/Passwort in Identity Platform.

    1. Öffnen Sie in der Google Console die Seite Identity Platform > Anbieter:

      ZUR SEITE "ANBIETER"

    2. Suchen Sie in der Tabelle der Anbieter nach dem Identitätsanbieter E-Mail/Passwort und klicken Sie auf (löschen).

    3. Klicken Sie im angezeigten Dialogfeld zur Bestätigung auf Löschen.

  4. Löschen Sie den Testnutzer.

    1. Öffnen Sie die Seite Identity Platform > Nutzer:

      ZUR SEITE "NUTZER"

    2. Suchen Sie in der Tabelle der Nutzer nach user@example.com und klicken Sie auf (löschen).

    3. Klicken Sie im angezeigten Dialogfeld zur Bestätigung auf Löschen.

  5. Löschen Sie die autorisierte Domain.

    1. Öffnen Sie die Seite Identity Platform > Einstellungen:

      ZUR SEITE "EINSTELLUNGEN"

    2. Suchen Sie in der Tabelle der autorisierten Domains nach der IP-Adresse, die Sie im Abschnitt Identity Platform einrichten ($EXTERNAL_IP) eingefügt haben, und klicken Sie auf (löschen).

    3. Klicken Sie auf Speichern.

Nächste Schritte