Authentification des utilisateurs avec Identity-Aware Proxy

L'authentification des utilisateurs de votre application Web est souvent nécessaire, et nécessite généralement une programmation particulière dans votre application. Pour les applications Google Cloud Platform, vous pouvez transférer ces responsabilités 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 depuis IAP.

Objectif de cet atelier

Dans cet atelier de programmation, vous allez créer une application Web minimale à l'aide de 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é de l'utilisateur. Cette appli 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

  • Développer 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 moderne tel que Chrome
  • Une connaissance de base du langage de programmation Python

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

Vous travaillerez 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

Dans l'angle supérieur gauche de la page de l'atelier, cliquez sur le bouton "Ouvrir la console Google". Vous devrez vous connecter avec le nom d'utilisateur et le mot de passe indiqués sous ce bouton.

Toutes les commandes de cet atelier de programmation seront exécutées dans Cloud Shell pour le projet créé et ouvert pour vous. Ouvrez Cloud Shell en cliquant sur l'icône "Activate Cloud Shell" (Activer Cloud Shell) située à droite de l'en-tête de la page de la console. La moitié inférieure de la page vous permet d'exécuter des commandes.

Même si les commandes étaient exécutées à partir de votre propre PC, vous devrez d'abord installer et configurer les logiciels de développement nécessaires. 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 le 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 iap-codelab

Ce dossier contient un sous-dossier pour chaque étape de cet atelier de programmation. Vous devrez vous placer dans le dossier approprié pour effectuer chaque étape.

Il s'agit d'une application standard App Engine codée en Python 3.7 qui affiche simplement une page de bienvenue "Hello, World". 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 de projet principal au sous-dossier 1-HelloWorld qui contient le code nécessaire à 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 contient le type templates/index.html. Pour cette étape, il s'agit d'un fichier HTML brut. Un second modèle de fichier contient un exemple de squelette de confidentialité dans templates/privacy.html.

Il existe deux autres fichiers : requirements.txt répertorie toutes les bibliothèques Python 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 répertorier chaque fichier contenu 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, puis examinez 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 pouvez être invité à choisir la région dans laquelle effectuer le déploiement. Sélectionnez celui à proximité indiquant qu'il est compatible avec la norme. Lorsque vous y êtes invité, saisissez Y pour continuer.

Dans quelques minutes, le déploiement devrait s'effectuer et vous verrez un message indiquant que vous pouvez afficher votre application avec gcloud app browse. Saisissez la commande suivante : Si, dans votre navigateur, un nouvel onglet ne s'ouvre pas, 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 démarrée. La fenêtre suivante s'ouvre :

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.

Limiter l'accès avec IAP

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

Étant donné que vous activez pour la première fois une option d'authentification pour ce projet, un message vous indique que vous devez configurer l'écran de consentement OAuth pour pouvoir utiliser IAP.

Cliquez sur le bouton CONFIGURE CONSENT SCREEN. Un nouvel onglet s'ouvre pour configurer l'écran de consentement.

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

Nom de l'application

Exemple d'IAP

Adresse e-mail d'assistance

à votre adresse e-mail. Celle-ci est peut-être déjà renseignée.

Domaine autorisé

la partie nom d'hôte de l'URL de l'application, par exemple iap-example-999999.appspot.com. Vous pouvez la voir dans la barre d'adresse de la page Web Hello World que vous avez précédemment ouverte. N'incluez pas la balise https:// de début ou de fin / de cette URL.

Vous devez appuyer sur Entrée après avoir renseigné ce champ.

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

Lien vers la page de confidentialité dans l'application, semblable 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. Il vous suffit donc de fermer cet onglet du navigateur.

Revenez à la page Identity-Aware Proxy et actualisez-la. Vous devez maintenant voir une liste de ressources que vous pouvez protéger.

Dans la ligne de l'application App Engine, cliquez sur le bouton d'activation dans la colonne "IAP" pour activer IAP.

Vous verrez les noms de domaines qui seront protégés par IAP. Cliquez sur "ACTIVER".

Ouvrez un onglet dans le navigateur et accédez à l'URL de votre application. Un écran "Se connecter avec Google" s'affiche. Vous devez 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 "Utilisateur de l'application Web sécurisée par Cloud IAP/IAP" à attribuer à cette adresse. Vous pouvez saisir de la même manière d'autres adresses ou domaines G Suite.

Cliquez sur "Enregistrer". Le message "Policy Updated" (Le règlement a été mis à 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é. Il est cependant possible que la page "Vous n'y ayez pas accès" s'affiche toujours, car il est possible qu'IAP ne vérifie pas à nouveau votre autorisation. Dans ce cas, effectuez la procédure suivante :

  • Ouvrez votre navigateur Web jusqu'à l'adresse de la page d'accueil et ajoutez /_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 "Sign in with Google" (Se connecter avec Google) dans lequel votre compte est déjà affiché s'ouvre. 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 "You Don't Have Access" (Vous n'avez pas accès) apparaît à la place de votre application.

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 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 le service de gestion de l'authentification de Google à cet utilisateur. Ces données seront affichées pour l'utilisateur dans la page d'accueil.

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

cd ~/iap-codelab/2-HelloUser

Déployer une application sur App Engine

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 y êtes invité, saisissez "Y" (Oui) pour continuer. 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 doit s'afficher :

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 que dans l'étape 1, mais deux 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.

Deux lignes sont utilisées dans main.py pour obtenir 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 indiquer en majuscules ou en minuscules si vous le souhaitez. L'instruction render_template inclut maintenant ces valeurs qui peuvent ainsi ê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 de accounts.google.com, indiquant la provenance des informations. Votre application peut supprimer toutes les informations situées avant le deux-points, y compris le deux-points, 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 Cloud Console, cliquez sur l'icône de menu en haut à gauche de la page, puis sur "Security" (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 :

L'application n'étant plus protégée, un utilisateur peut envoyer une requête Web qui s'avère être passée par IAP. Par exemple, vous pouvez exécuter la commande curl suivante à partir de Cloud Shell pour effectuer cette opération (remplacer <votre-url-ici> par l'URL correcte pour votre appli):

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

La page Web s'affiche alors dans la ligne de commande, comme suit:

<!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é. S'il existe un risque potentiel, l'étape 3 représente une solution.

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. Cela utilise un troisième en-tête de requête Web, appelé X-Goog-IAP-JWT-Assertion, ajouté par IAP. 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, et la dernière étape s'est terminée avec Cloud Shell ouvert 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 y êtes invité, saisissez "Y" (Oui) pour continuer. 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, de sorte qu'aucune donnée IAP n'est fournie à l'application. Une page semblable à la suivante s'affiche :

Comme précédemment, vous devrez peut-être patienter quelques minutes avant que la nouvelle version ne 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 Cloud Console, cliquez sur l'icône de menu en haut à gauche de la page, puis sur "Security" (Sécurité), puis sur "Identity-Aware Proxy". Cliquez sur le bouton d'activation d'IAP à côté de l'application App Engine pour le réactiver.

Actualisez la page. La page se présente sous la forme suivante :

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 que dans 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é signée de manière 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 validé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 signées de manière cryptographique fournies 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 d'assistance keys() et audience() collectent et renvoient ces valeurs.

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

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

Vous avez déployé une application Web App Engine. À l'étape 1, vous avez restreint l'accès à l'application aux utilisateurs de votre choix. À l'étape 2, vous avez récupéré et affiché l'identité des utilisateurs autorisés par IAP à accéder à votre application, et vous avez vu comment ces informations pourraient être falsifiées si IAP était désactivé ou ignoré. À l'étape 3, vous avez vérifié les assertions signées de manière cryptographique de l'identité de l'utilisateur, qui ne peut pas être falsifiée.

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 nouvelle 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.