Authentifier les utilisateurs finaux des services Cloud Run pour Anthos grâce à Istio et à Identity Platform

Ce tutoriel montre comment authentifier les utilisateurs finaux des applications déployées via Cloud Run pour Anthos sur Google Cloud par le biais des règles d'authentification d'Istio et d'Identity Platform. Si vous utilisez Istio pour procéder à l'authentification, cela signifie que la logique d'authentification ne doit pas forcément faire partie du code de l'application. Cette séparation permet à différentes équipes d'être responsables du code d'application et de la règle d'authentification. De plus, des règles d'authentification peuvent ainsi s'appliquer à plusieurs applications ou services.

Présentation

Cloud Run pour Anthos permet aux développeurs de déployer et de diffuser des applications et des fonctions s'exécutant sur GKE. Il propose également aux équipes de développement une expérience sans serveur, compatible avec l'autoscaling basé sur la demande, le routage et la gestion du trafic pour les déploiements bleu-vert, etc. Cloud Run pour Anthos s'appuie sur les projets Open Source Istio et Knative, et s'intègre aux produits Google Cloud tels que Cloud Logging.

Istio peut authentifier les requêtes entrantes en validant les jetons Web JSON (JWT) conformément aux règles d'authentification. Les règles d'authentification peuvent s'appliquer à tous les services d'un espace de noms ou à des services nommés spécifiques. Une règle peut inclure et exclure des chemins de requête HTTP spécifiques, par exemple pour autoriser l'accès non authentifié aux éléments de sites Web publics et aux points de terminaison de vérification de l'état. Dans ce tutoriel, la passerelle d'entrée Istio applique la règle d'authentification.

Le schéma suivant illustre le processus d'authentification sur lequel se base ce tutoriel.

Istio authentifie les requêtes entrantes

Ce tutoriel utilise Identity Platform pour connecter les utilisateurs finaux, mais vous pouvez adapter cette solution à d'autres fournisseurs compatibles avec OpenID Connect, tels que Google Sign-In, Firebase Authentication, des offres tierces telles que Auth0, Gluu, Okta et Ping Identity, ou votre propre déploiement d'une mise en œuvre d'OpenID Connect.

Objectifs

  • Créer un cluster GKE avec le module complémentaire Cloud Run.
  • Configurer la plate-forme Identity Platform.
  • Déployer un exemple d'application consistant en une API backend et interface publique.
  • Ajouter une règle d'authentification pour l'API backend.
  • Vérifier l'authentification

Coûts

Ce tutoriel utilise les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez terminé ce tutoriel, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Consultez la page Effectuer un nettoyage pour en savoir plus.

Avant de commencer

  1. Connectez-vous à votre compte Google ou, si vous n'en avez pas, créez-en un.
  2. Dans Cloud Console, accédez à la page de sélection du projet.

    Accéder à la page de sélection du projet

  3. Sélectionnez ou créez un projet Cloud.

  4. Vérifiez que la facturation est activée pour votre projet Google Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  5. Activez les API Cloud Build, Cloud Run, Container Analysis et Google Kubernetes Engine, ainsi que les API Cloud.

    ACTIVER LES API

Initialiser l'environnement

Dans cette section, vous allez définir les variables d'environnement et les valeurs par défaut gcloud que vous utiliserez plus tard dans le tutoriel.

  1. Dans le menu déroulant Sélectionner un projet de Cloud Console, sélectionnez le projet que vous souhaitez utiliser.

  2. Ouvrez Cloud Shell.

    Accéder à Cloud Shell

    Utilisez Cloud Shell pour exécuter toutes les commandes de ce tutoriel.

  3. Définissez les variables d'environnement et les valeurs par défaut gcloud pour la zone Compute Engine et le nom du cluster GKE que vous souhaitez utiliser pour ce tutoriel :

    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
    

    Vous pouvez modifier la zone et le nom du cluster en fonction de vos besoins.

Créer un cluster GKE avec Cloud Run activé

  • Créez un cluster GKE avec le module complémentaire Cloud Run :

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

Rechercher l'adresse IP publique

Cloud Run pour Anthos sur Google Cloud expose des services externes sur l'adresse IP publique de la passerelle d'entrée Istio.

  1. Vérifiez l'état de la création d'une adresse IP externe pour le service Kubernetes istio-ingress :

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

    Attendez que la valeur EXTERNAL-IP passe de <pending> à une adresse IP. Si vous obtenez une erreur NotFound, patientez une minute, puis exécutez à nouveau la commande. Pour interrompre l'attente, appuyez sur Ctrl+C.

  2. Créez une variable d'environnement pour stocker l'adresse IP publique de la passerelle d'entrée Istio :

    export EXTERNAL_IP=$(kubectl get services istio-ingress \
        --namespace gke-system \
        --output jsonpath='{.status.loadBalancer.ingress[0].ip}')
    
  3. Affichez l'adresse IP publique de la passerelle d'entrée Istio. Vous aurez besoin de cette adresse ultérieurement.

    echo $EXTERNAL_IP
    

Remarque : Dans ce tutoriel, vous accédez aux services à l'aide d'une adresse IP et d'un protocole HTTP non chiffré. Pour une configuration de production, nous vous recommandons d'effectuer les deux opérations suivantes :

  • Créez un enregistrement DNS A pour votre nom de domaine et définissez sa valeur sur l'adresse IP publique de la passerelle d'entrée Istio. Dans ce cas, remplacez $EXTERNAL_IP dans le reste de ce tutoriel par le nom de domaine de l'enregistrement DNS A. Si vous utilisez Cloud DNS, suivez le guide de démarrage rapide. Si vous utilisez un autre fournisseur, reportez-vous à la documentation correspondante.
  • Activez HTTPS pour Cloud Run pour Anthos sur les services Google Cloud.

Configurer Identity Platform

  1. Laissez Cloud Shell ouvert et accédez à Google Cloud Marketplace pour activer Identity Platform dans une nouvelle fenêtre de navigateur Web.

    Accéder à Identity Platform sur Google Cloud Marketplace

  2. Dans le menu déroulant Sélectionner un projet, sélectionnez le projet Google Cloud dans lequel vous souhaitez configurer Identity Platform. Vous pouvez configurer le cluster GKE et Identity Platform dans des projets Google Cloud distincts. Pour plus de simplicité, utilisez le même projet dans ce tutoriel.

  3. Cliquez sur Activer Identity Platform.

    Vous êtes désormais sur la page Identity Platform > Fournisseurs de Cloud Console.

  4. Sur la page Fournisseurs, cliquez sur Ajouter un fournisseur.

  5. Dans la liste déroulante Sélectionner un fournisseur, faites défiler vers le bas, puis sélectionnez E-mail/Mot de passe. Dans le cas de votre propre application, vous pouvez choisir les fournisseurs que vous souhaitez activer.

  6. Assurez-vous que l'option Activé est sélectionnée.

  7. Décochez la case Autoriser la connexion sans mot de passe.

  8. Cliquez sur Enregistrer.

  9. Accédez à la page Identity Platform > Paramètres.

  10. Cliquez sur l'onglet Sécurité.

  11. Cliquez sur Ajouter un domaine. La boîte de dialogue Ajouter un domaine autorisé s'ouvre.

  12. Dans le champ Domaine, entrez l'adresse IP publique de la passerelle d'entrée Istio de la section précédente ($EXTERNAL_IP).

  13. Cliquez sur Ajouter. La boîte de dialogue se ferme. L'adresse IP que vous avez saisie se trouve dans la table Domaines autorisés.

  14. Sur la page Identity Platform > Paramètres, cliquez sur Enregistrer.

Créer un utilisateur test

  1. Dans Cloud Console, accédez à la page Identity Platform > Utilisateurs.
  2. Cliquez sur Ajouter un utilisateur pour ajouter un utilisateur test pour ce tutoriel. La boîte de dialogue Ajouter un utilisateur s'ouvre.
  3. Dans le champ E-mail, entrez l'adresse e-mail d'un utilisateur final. Dans le cadre d'un test, cette adresse e-mail ne doit pas forcément être réelle. Pour ce tutoriel, utilisez user@example.com :
  4. Dans le champ Mot de passe, entrez un mot de passe pour l'utilisateur test. Conservez ce mot de passe, car vous en aurez besoin ultérieurement.
  5. Cliquez sur Ajouter pour terminer le processus d'ajout. La boîte de dialogue se ferme et vous revenez à la page Identity Platform > Utilisateurs.

Créer un exemple d'application

Vous allez déployer un exemple d'application comportant deux services. L'un des services est une interface utilisateur frontend publique, et l'autre est une API backend.

  1. Sur la page Identity Platform > Utilisateurs, cliquez sur le lien Informations sur la configuration de l'application dans la partie droite de la fenêtre. La boîte de dialogue Configurer votre application s'ouvre.

  2. Mettez en surbrillance et copiez la valeur d'apiKey dans votre presse-papiers (Control+C sous Chrome OS/Linux/Windows, Cmd+C sur macOS).

  3. Cliquez sur Fermer pour fermer la boîte de dialogue Configurer votre application.

  4. Dans Cloud Shell, créez une variable d'environnement pour stocker l'apiKey, où api-key correspond à l'apiKey de la boîte de dialogue Configurer votre application :

    export AUTH_APIKEY=api-key
    
  5. Créez une variable d'environnement pour authDomain :

    export AUTH_DOMAIN=$GOOGLE_CLOUD_PROJECT.firebaseapp.com
    
  6. Clonez le dépôt d'exemples Cloud Run à partir de GitHub :

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples.git
    
  7. Basculez vers le répertoire contenant les fichiers de ce tutoriel :

    cd cloud-run-samples/identity-platform/gke
    
  8. Remplacez les variables d'Identity Platform dans le fichier JavaScript d'interface :

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

Déployer l'exemple d'application

  1. Utilisez Cloud Build pour créer deux images de conteneur pour l'exemple d'application, une pour l'interface et une pour le backend :

    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 stocke les images dans Container Registry.

  2. Dans le cluster GKE, créez deux espaces de noms appelés public et api :

    kubectl create namespace public
    
    kubectl create namespace api
    
  3. Déployez l'image de conteneur d'interface dans Cloud Run pour Anthos sur Google Cloud en tant que service dans l'espace de noms public :

    gcloud run deploy frontend \
        --namespace public \
        --image gcr.io/$GOOGLE_CLOUD_PROJECT/cloud-run-gke-auth-frontend \
        --platform gke
    
  4. Déployez l'image de conteneur backend dans Cloud Run pour Anthos sur Google Cloud en tant que service dans l'espace de noms api :

    gcloud run deploy backend \
        --namespace api \
        --image gcr.io/$GOOGLE_CLOUD_PROJECT/cloud-run-gke-auth-backend \
        --platform gke
    
  5. Créez un service virtuel Istio qui achemine les requêtes par chemin d'URI :

    kubectl apply -f istio/virtualservice.yaml
    

    Ce service virtuel achemine les requêtes dont le chemin d'URI commence par /api/ vers l'API backend et toutes les autres requêtes vers l'interface utilisateur.

    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. Vérifiez que les requêtes non authentifiées adressées à l'API backend aboutissent :

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

    Si vous n'obtenez pas HTTP/1.1 200 OK, attendez une minute, puis réessayez.

Ajouter une règle d'authentification Istio

  1. Créez une règle d'authentification Istio :

    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

    Cette règle authentifie les requêtes dont le chemin d'URI commence par /api/, à l'exception du chemin /api/healthz. En raison des règles de routage du service virtuel Istio déployé dans la section précédente, cette règle authentifie les requêtes adressées à l'API backend.

  2. L'application de la règle peut prendre un certain temps. Exécutez la commande suivante et attendez que la console affiche HTTP/1.1 401 Unauthorized :

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

    Initialement, le résultat peut alterner entre HTTP/1.1 200 OK et HTTP/1.1 401 Unauthorized. Cela est dû à la cohérence à terme entre Istio et le proxy Envoy.

    Lorsque la console n'affiche plus que HTTP/1.1 401 Unauthorized, appuyez sur Ctrl+C pour interrompre l'attente.

Tester la solution

  1. Ouvrez une fenêtre de navigateur à l'adresse http://$EXTERNAL_IP/api/secure.json, où $EXTERNAL_IP correspond à l'adresse IP publique de la passerelle d'entrée Istio que vous avez trouvée dans la section Rechercher l'adresse IP publique.

    Il s'agit d'une requête adressée directement à l'API backend. La fenêtre de navigateur affiche Échec de l'authentification d'origine, car la requête n'a pas inclus d'identifiants conformes à la règle d'authentification Istio.

  2. Ouvrez une fenêtre de navigateur à l'adresse $EXTERNAL_IP. Un formulaire de connexion devrait s'afficher.

  3. Connectez-vous en tant que l'utilisateur test créé dans la section Créer un utilisateur test.

    La page affiche l'adresse e-mail de l'utilisateur test ainsi que le texte The secret message is: Hello World. Le message peut mettre un certain temps à s'afficher.

    Le navigateur récupère le message en envoyant une requête HTTP à l'API backend (/api/secure.json), à l'aide d'un jeton obtenu auprès d'Identity Platform lors de la connexion. Inspectez le fichier frontend/index.js pour afficher la mise en œuvre et reportez-vous à la bibliothèque FirebaseUI pour obtenir plus de documentation.

Dépannage

Si vous rencontrez des problèmes avec ce tutoriel, nous vous recommandons de consulter les documents ci-dessous :

Nettoyer

Pour éviter que les ressources utilisées dans ce tutoriel ne soient facturées sur votre compte Google Cloud, procédez comme suit :

  1. Dans Cloud Console, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer .
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer les ressources

Si vous souhaitez conserver le projet Google Cloud que vous avez utilisé dans ce tutoriel, supprimez les différentes ressources :

  1. Supprimez le cluster GKE :

    gcloud container clusters delete $CLUSTER --async --quiet
    
  2. Supprimez les exemples d'images de conteneur d'application dans 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. Supprimez le fournisseur d'identité E-mail/Mot de passe dans Identity Platform.

    1. Dans Cloud Console, accédez à la page Identity Platform > Fournisseurs :

      ACCÉDER À LA PAGE FOURNISSEURS

    2. Recherchez le fournisseur d'identité E-mail/Mot de passe dans la table des fournisseurs et cliquez sur .

    3. Dans la boîte de dialogue qui s'affiche, cliquez sur Supprimer pour confirmer.

  4. Supprimez l'utilisateur test.

    1. Accédez à la page Identity Platform > Utilisateurs :

      ACCÉDER À LA PAGE UTILISATEURS

    2. Recherchez user@example.com dans la table des utilisateurs, puis cliquez sur .

    3. Dans la boîte de dialogue qui s'affiche, cliquez sur Supprimer pour confirmer.

  5. Supprimez le domaine autorisé.

    1. Accédez à la page Identity Platform > Paramètres :

      ACCÉDER À LA PAGE PARAMÈTRES

    2. Dans la table des domaines autorisés, recherchez l'adresse IP que vous avez ajoutée à la section Configurer Identity Platform ($EXTERNAL_IP), puis cliquez sur .

    3. Cliquez sur Enregistrer.

Étapes suivantes