Authentification des utilisateurs avec Identity-Aware Proxy

Authentification des utilisateurs avec Identity-Aware Proxy

À propos de cet atelier de programmation

subjectDernière mise à jour : nov. 20, 2021
account_circleRédigé par engelke

1. Introduction

L'authentification des utilisateurs de votre application Web est souvent nécessaire, et requiert généralement une programmation spéciale dans votre application. Pour les applications Google Cloud Platform, vous pouvez déléguer ces tâches au service Identity-Aware Proxy. Si vous avez seulement besoin de restreindre l'accès aux utilisateurs sélectionnés, aucune modification ne doit être apportée à l'application. Si l'application doit connaître l'identité de l'utilisateur (par exemple pour conserver les préférences utilisateur côté serveur), Identity-Aware Proxy peut fournir cette information avec un code d'application minimal.

Qu'est-ce qu'Identity-Aware Proxy ?

Identity-Aware Proxy (IAP) est un service Google Cloud Platform qui intercepte les requêtes Web envoyées à votre application, authentifie l'utilisateur qui effectue la requête à l'aide du Google Identity Service, et transmet la requête seulement si elle provient d'un utilisateur que vous autorisez. De plus, IAP peut modifier les en-têtes de requête pour inclure des informations sur l'utilisateur authentifié.

Cet atelier de programmation vous explique comment créer votre propre application, en restreindre l'accès et obtenir l'identité des utilisateurs à partir d'IAP.

Objectif de cet atelier

Dans cet atelier de programmation, vous allez créer une application Web minimale avec Google App Engine, puis explorer différentes manières d'utiliser Identity-Aware Proxy pour restreindre l'accès à l'application et lui fournir des informations sur l'identité des utilisateurs. Cette application pourra :

  • Afficher une page de bienvenue
  • Accéder aux informations d'identité des utilisateurs fournies par IAP
  • Utiliser la validation cryptographique pour prévenir le spoofing des informations d'identité des utilisateurs

Points abordés

  • Écrire et déployer une application App Engine simple à l'aide de Python 3.7
  • Activer et désactiver IAP pour restreindre l'accès à votre application
  • Récupérer les informations d'identité des utilisateurs à partir d'IAP dans votre application
  • Valider les informations extraites d'IAP par des moyens cryptographiques afin de garantir la protection contre le spoofing

Prérequis

  • Un navigateur Web récent tel que Chrome
  • Connaissances de base du langage de programmation Python

Cet atelier de programmation est consacré à Google App Engine et IAP. Les concepts et les blocs de codes non pertinents ne sont pas abordés, et vous sont fournis afin que vous puissiez simplement les copier et les coller.

2. Configuration

Vous allez travailler dans l'environnement de ligne de commande Cloud Shell. Commencez par ouvrir cet environnement et récupérez-y l'exemple de code.

Lancer la console et Cloud Shell

En haut à gauche de la page de l'atelier, cliquez sur le bouton "Open Google Console" (Ouvrir la console Google). Vous devrez vous connecter à l'aide du nom d'utilisateur et du mot de passe affichés en dessous de ce bouton.

Toutes les commandes de cet atelier de programmation seront exécutées dans une session Cloud Shell correspondant au projet créé et ouvert. Ouvrez Cloud Shell en cliquant sur l'icône "Activer Cloud Shell" située à droite de l'en-tête de page de la console. La moitié inférieure de la page vous permet de saisir et d'exécuter des commandes.Vous pouvez exécuter ces commandes depuis votre propre PC, mais vous devez d'abord installer et configurer le logiciel de développement requis. Cloud Shell contient déjà tous les outils logiciels dont vous avez besoin.

Télécharger le code

Cliquez sur la zone de la ligne de commande dans Cloud Shell afin de pouvoir saisir des commandes. Extrayez le code de GitHub, puis accédez au dossier du code :

git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd user
-authentication-with-iap

Ce dossier contient un sous-dossier pour chaque étape de cet atelier de programmation. Vous devrez accéder au dossier approprié pour effectuer chaque étape.

3. Étape 1 : Déployer l'application et la protéger avec IAP

Il s'agit d'une application standard App Engine écrite en Python 3.7 qui affiche simplement le message "Hello, World". page d'accueil. Nous allons déployer et tester cette application, puis en restreindre l'accès à l'aide d'IAP.

Examiner le code de l'application

Passez du dossier principal du projet au sous-dossier 1-HelloWorld qui contient le code pour cette étape.

cd 1-HelloWorld

Le code de l'application se trouve dans le fichier main.py. Il utilise le framework Web Flask pour répondre aux requêtes Web avec le contenu d'un modèle. Ce fichier de modèle se trouve dans templates/index.html et, pour cette étape, ne contient que du code HTML brut. Un deuxième fichier de modèle contient un exemple de squelette de règles de confidentialité dans templates/privacy.html.

Il existe deux autres fichiers: requirements.txt répertorie toutes les bibliothèques Python autres que celles par défaut utilisées par l'application, et app.yaml indique à Google Cloud Platform qu'il s'agit d'une application App Engine Python 3.7.

Vous pouvez lister tous les fichiers contenus dans le shell à l'aide de la commande cat, comme dans l'exemple suivant :

cat main.py

Vous pouvez également ouvrir l'éditeur de code Cloud Shell en cliquant sur l'icône en forme de crayon en haut à droite de la fenêtre Cloud Shell et examiner le code de cette façon.

Aucun fichier n'a besoin d'être modifié pour cette étape.

Déployer dans App Engine

Déployez maintenant l'application dans l'environnement standard App Engine pour Python 3.7.

gcloud app deploy

Vous serez peut-être invité à choisir une région dans laquelle effectuer le déploiement. Sélectionnez une adresse à proximité indiquant "supports standard" (compatible avec la version standard). Lorsque vous êtes invité à poursuivre l'opération, saisissez Y pour "oui".

Après quelques minutes, le déploiement devrait être terminé et un message vous indique que vous pouvez afficher votre application avec gcloud app browse. Saisissez la commande suivante : Si un nouvel onglet ne s'ouvre pas dans votre navigateur, cliquez sur le lien affiché pour l'ouvrir dans un nouvel onglet, ou copiez-le dans un nouvel onglet ouvert manuellement si nécessaire. Cette application étant exécutée pour la première fois, elle met quelques secondes à apparaître, le temps qu'une instance Cloud soit lancée. La fenêtre suivante s'ouvre :

1c1c0b166c6023e.png

Vous pouvez ouvrir cette même URL à partir de n'importe quel ordinateur connecté à Internet pour afficher cette page Web. L'accès n'est pas encore restreint.

Restreindre l'accès avec IAP

Dans la fenêtre de la console Cloud, cliquez sur l'icône de menu en haut à gauche de la page, sur "Sécurité", puis sur "Identity-Aware Proxy".

Comme c'est la première fois que vous activez une option d'authentification pour ce projet, un message vous indique que vous devez configurer votre écran de consentement OAuth avant de pouvoir utiliser IAP.

Cliquez sur le BOUTON CONFIGURER L'ÉCRAN D'AUTORISATION. Un nouvel onglet s'ouvrira pour configurer l'écran de consentement.

Renseignez les champs obligatoires à l'aide des valeurs appropriées :

Nom de l'application

Exemple IAP

Adresse e-mail d'assistance

votre adresse e-mail. il est peut-être déjà renseigné pour vous.

Domaine autorisé

la partie nom d'hôte de l'URL de l'application, par exemple iap-example-999999.appspot.com. Vous pouvez le voir dans la barre d'adresse de la page Web Hello World que vous avez ouverte précédemment. N'incluez pas le https:// début ni le / de fin de cette URL.Vous devez appuyer sur Entrée après avoir renseigné cette valeur.

Lien vers la page d'accueil de l'application

L'URL que vous avez utilisée pour afficher votre application

Lien vers les règles de confidentialité de l'application

Le lien vers la page des règles de confidentialité dans l'application, identique au lien vers la page d'accueil avec "/privacy" ajouté à la fin

Cliquez sur Enregistrer. Vous êtes invité à créer des identifiants. Vous n'avez pas besoin de créer d'identifiants pour cet atelier de programmation. Vous pouvez donc simplement fermer cet onglet du navigateur.

Revenez à la page Identity-Aware Proxy et actualisez-la. Vous devriez maintenant voir une liste de ressources que vous pouvez protéger.Cliquez sur le bouton d'activation dans la colonne "IAP" sur la ligne de l'application App Engine pour activer IAP.

Les noms de domaine qui seront protégés par IAP s'affichent. Cliquez sur "ACTIVER".

Ouvrez maintenant un onglet de navigateur et accédez à l'URL de votre application. Un écran "Se connecter avec Google" s'affiche, vous invitant à vous connecter pour accéder à l'application.

Connectez-vous avec un compte Google ou G Suite. Un écran vous refusant l'accès s'affiche.

Cela signifie que vous avez correctement protégé votre application avec IAP, mais que vous n'avez pas encore indiqué les comptes autorisés à y accéder.

Revenez à la page Identity-Aware Proxy de la console, cochez la case située à côté de l'application App Engine et repérez la barre latérale à droite de la page.

Chaque adresse e-mail (ou adresse de groupe Google Groupes, ou nom de domaine G Suite) à laquelle vous voulez autoriser l'accès doit être ajoutée en tant que "Member" (Membre). Cliquez sur AJOUTER UN MEMBRE. Saisissez votre adresse e-mail, puis choisissez le rôle d'utilisateur de l'application Web sécurisée par Cloud IAP/IAP pour l'attribuer à cette adresse. Vous pouvez saisir de la même manière d'autres adresses ou domaines G Suite.

Cliquez sur "Enregistrer". Le message "Règle mise à jour" apparaît au bas de la fenêtre.

Revenez dans votre application et rechargez la page. Vous devez maintenant voir votre application Web, car vous vous êtes déjà connecté avec un compte utilisateur que vous avez autorisé. Toutefois, le message "Vous n'avez pas accès" peut toujours s'afficher car IAP ne revérifiera peut-être pas votre autorisation. Dans ce cas, effectuez la procédure suivante :

  • Ouvrez votre navigateur Web à l'adresse de la page d'accueil, en ajoutant /_gcp_iap/clear_login_cookie à la fin de l'URL, comme dans https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie.
  • Un nouvel écran "Se connecter avec Google" s'ouvre, dans lequel votre compte est déjà affiché. Ne cliquez pas sur ce compte. Cliquez sur "Use another account" (Utiliser un autre compte) et ressaisissez vos identifiants.
  • Cette procédure oblige IAP à revérifier votre accès, et l'écran d'accueil de votre application doit maintenant s'afficher.

Si vous avez accès à un autre navigateur ou pouvez utiliser le mode de navigation Incognito (Navigation privée) sur votre navigateur, et que vous avez accès à un autre compte Gmail ou G Suite, vous pouvez utiliser ce navigateur pour accéder à la page de votre application et vous connecter avec un autre compte. Ce compte n'ayant pas été autorisé, l'écran "Vous n'avez pas accès" apparaît à la place de votre application.

4. Étape 2 : Accédez aux informations d'identité des utilisateurs

Une fois qu'une application est protégée avec IAP, elle peut utiliser les informations d'identité qu'IAP fournit dans les en-têtes de requête Web qu'elle transmet. Dans cette étape, l'application récupérera l'adresse e-mail de l'utilisateur connecté et un ID utilisateur unique persistant attribué par Google Identity Service à cet utilisateur. Ces données seront affichées pour l'utilisateur dans la page d'accueil.

Il s'agit de l'étape 2. La dernière étape s'est terminée avec votre session Cloud Shell ouverte dans le dossier iap-codelab/1-HelloWorld. Accédez au dossier approprié pour cette étape :

cd ~/iap-codelab/2-HelloUser

Déployer l'application sur App Engine

Comme le déploiement prend quelques minutes, commencez par déployer l'application dans l'environnement standard App Engine pour Python 3.7:

gcloud app deploy

Lorsque vous êtes invité à poursuivre l'opération, saisissez "Y" pour "oui". Le déploiement devrait s'effectuer en quelques minutes. En attendant, vous pouvez examiner les fichiers de l'application comme décrit ci-dessous.

Lorsque le déploiement est prêt, un message vous indique que vous pouvez afficher votre application avec gcloud app browse. Saisissez la commande suivante : Si un nouvel onglet ne s'ouvre pas dans votre navigateur, copiez le lien affiché et ouvrez-le normalement dans un nouvel onglet. Une page semblable à la suivante s'affiche :

5b5fb03111258cec.png

Le remplacement de l'ancienne version de votre application par la nouvelle peut prendre quelques minutes. Si besoin, actualisez la page pour afficher une page semblable à celle illustrée ci-dessus.

Examiner les fichiers de l'application

Ce dossier contient le même ensemble de fichiers qu'à l'étape 1, mais deux des fichiers ont été modifiés: main.py et templates/index.html. Le programme a été modifié pour récupérer les informations utilisateur qu'IAP fournit dans les en-têtes de requête, et le modèle affiche maintenant ces données.

main.py contient deux lignes qui récupèrent les données d'identité fournies par IAP:

user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id
= request.headers.get('X-Goog-Authenticated-User-ID')

Les en-têtes X-Goog-Authenticated-User- sont fournis par IAP, et les noms ne sont pas sensibles à la casse. Vous pouvez donc les saisir en minuscules ou en majuscules si vous préférez. L'instruction render_template inclut maintenant ces valeurs qui peuvent alors être affichées :

page = render_template('index.html', email=user_email, id=user_id)

Le modèle index.html peut afficher ces valeurs, encadrées par des accolades doubles :

Hello, {{ email }}! Your persistent ID is {{ id }}.

Comme vous pouvez le voir, les données fournies sont précédées du préfixe accounts.google.com:, indiquant la provenance des informations. Votre application peut supprimer toutes les informations situées avant le signe deux-points, y compris ce signe, pour extraire les valeurs brutes, selon les besoins.

Désactiver le service IAP

Que se passe-t-il si le service IAP est désactivé ou ignoré d'une quelconque façon (par exemple par d'autres applications s'exécutant sur votre même projet Cloud) ? Désactivez IAP pour le savoir.

Dans la fenêtre de la console Cloud, cliquez sur l'icône de menu en haut à gauche de la page, sur "Sécurité", puis sur "Identity-Aware Proxy". Cliquez sur le bouton d'activation d'IAP à côté de l'application App Engine pour désactiver IAP.

Un message d'avertissement vous informe que tous les utilisateurs pourront alors accéder à l'application.

Actualisez la page Web de l'application. Vous devez normalement voir la même page, mais sans aucune information utilisateur :

17c850de95fea839.png

L'application n'étant plus protégée, un utilisateur peut envoyer une requête Web qui semble avoir été transmise via IAP. Pour ce faire, vous pouvez par exemple exécuter la commande curl suivante à partir de Cloud Shell (remplacez <your-url-here> par l'URL de votre application):

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

La page Web sera affichée sur la ligne de commande et sera semblable au résultat suivant :

<!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>

L'application n'a aucun moyen de savoir qu'IAP a été désactivé ou ignoré. Pour les cas où il s'agit d'un risque potentiel, l'étape 3 présente une solution.

5. Étape 3 : Utilisez la validation cryptographique

S'il existe un risque qu'IAP soit désactivé ou ignoré, votre application peut effectuer une vérification pour s'assurer que les informations d'identité qu'elle reçoit sont valides. Elle utilise un troisième en-tête de requête Web ajouté par IAP, appelé X-Goog-IAP-JWT-Assertion. La valeur de cet en-tête est un objet avec signature cryptographique qui contient également les données d'identité de l'utilisateur. Votre application peut valider la signature numérique et utiliser les données fournies dans cet objet pour s'assurer qu'elles sont fournies par IAP sans altération.

La validation de la signature numérique requiert quelques étapes supplémentaires, telles que l'extraction du dernier ensemble de clés publiques Google. Vous pouvez déterminer la nécessité d'ajouter ces étapes supplémentaires à votre application en fonction du risque qu'un utilisateur puisse désactiver ou ignorer IAP, et également du caractère sensible de l'application.

Il s'agit de l'étape 3. La dernière étape s'est terminée avec votre session Cloud Shell ouverte dans le dossier iap-codelab/2-HelloUser. Accédez au dossier approprié pour cette étape :

cd ~/iap-codelab/3-HelloVerifiedUser

Déployer dans App Engine

Déployez l'application dans l'environnement standard App Engine pour Python 3.7:

gcloud app deploy

Lorsque vous êtes invité à poursuivre l'opération, saisissez "Y" pour "oui". Le déploiement devrait s'effectuer en quelques minutes. En attendant, vous pouvez examiner les fichiers de l'application comme décrit ci-dessous.

Lorsque le déploiement est prêt, un message vous indique que vous pouvez afficher votre application avec gcloud app browse. Saisissez la commande suivante : Si un nouvel onglet ne s'ouvre pas dans votre navigateur, copiez le lien affiché et ouvrez-le normalement dans un nouvel onglet.

Rappelez-vous que vous avez désactivé IAP à l'étape 2. Par conséquent, aucune donnée IAP n'est fournie à l'application. Une page semblable à la suivante s'affiche :

8ef2abcc23d96958.png

Comme précédemment, vous devrez peut-être patienter quelques minutes avant que la nouvelle version soit activée dans la nouvelle version de la page.

IAP étant désactivé, aucune information relative aux utilisateurs n'est disponible. Vous allez maintenant réactiver IAP.

Dans la fenêtre de la console Cloud, cliquez sur l'icône de menu en haut à gauche de la page, sur "Sécurité", puis sur "Identity-Aware Proxy". Cliquez sur le bouton d'activation d'IAP à côté de l'application App Engine pour réactiver IAP.

Actualisez la page. La page devrait ressembler à l'exemple ci-dessous :

3a4d93c11f228852.png

Notez que l'adresse e-mail fournie par la méthode validée ne comporte pas le préfixe accounts.google.com:.

Si IAP est désactivé ou ignoré, les données valides seront manquantes ou non valides, car elles ne peuvent pas avoir de signature valide à moins d'avoir été créées par le détenteur des clés privées de Google.

Examiner les fichiers de l'application

Ce dossier contient le même ensemble de fichiers qu'à l'étape 2, avec deux fichiers modifiés et un nouveau fichier. Le nouveau fichier, auth.py, fournit une méthode user() pour récupérer et valider les informations d'identité avec signature cryptographique. Les fichiers modifiés sont main.py et templates/index.html, qui utilisent désormais les résultats de cette méthode. Les en-têtes non vérifiés trouvés à l'étape 2 sont également affichés à des fins de comparaison.

La nouvelle fonctionnalité réside principalement dans la fonction user():

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']

assertion correspond aux données avec signature cryptographique fournie dans l'en-tête de requête spécifié. Le code utilise une bibliothèque pour valider et décoder ces données. La validation utilise les clés publiques fournies par Google pour vérifier les données qu'il signe, et pour connaître le public pour lequel les données ont été préparées (essentiellement le projet Google Cloud en cours de protection). Les fonctions de l'outil d'aide keys() et audience() collectent et renvoient ces valeurs.

L'objet signé contient deux données dont nous avons besoin: l'adresse e-mail validée et la valeur d'identifiant unique (fournie dans le champ standard sub pour "subscriber" [abonné]).

Cette opération met fin à l'étape 3.

6. Résumé

Vous avez déployé une application Web App Engine. À l'étape 1, vous avez limité l'accès à l'application aux seuls utilisateurs que vous avez choisis. À l'étape 2, vous avez récupéré et affiché l'identité des utilisateurs auxquels IAP a autorisé l'accès à votre application, et vous avez vu comment ces informations pouvaient être spoofées si IAP était désactivé ou ignoré. À l'étape 3, vous avez validé les assertions à signature cryptographique de l'identité de l'utilisateur, qui ne peut pas être spoofée.

7. Nettoyage

Les seules ressources Google Cloud Platform que vous avez utilisées dans cet atelier de programmation sont des instances App Engine. Chaque fois que vous avez déployé l'application, une version est créée et continue d'exister jusqu'à sa suppression. Quittez l'atelier pour supprimer le projet et toutes les ressources qu'il contient.