OpenID : Centralisation d'authentification
Contents
1 Introduction
La problématique de l’authentification unique (Single Sign On) se pose depuis longtemps dans le domaine informatique. Il en était surtout question au sein des entreprises, où l’utilisateur accède régulièrement à une foule d’applications dans le cadre de son travail quotidien (poste de travail, messagerie, outil de gestion du temps, serveur distant, etc.). Vous me direz qu’un utilisateur lambda accède aussi à beaucoup d’applications de ce genre pour une utilisation personnelle. C’est vrai, mais, jusqu’à présent, ces quelques mots de passe à retenir sur sa machine personnelle ne justifiaient pas la dépense d’énergie nécessaire à la mise en place d’une solution de SSO. Mais, avec l’explosion des accès à Internet, la multiplication des blogs, wikis, forums et autres sites commerciaux, la question de simplifier la gestion de ces multiples comptes se pose à nouveau. Et c’est là qu’intervient OpenID. Après un court rappel sur ce qu’est l’authentification unique, nous détaillerons OpenID, puis nous verrons les différentes possibilités de mise en place d’une solution basée sur OpenID.
1.1 Authentification unique
Le principe de l’authentification unique est de permettre à l’utilisateur de s’authentifier une fois pour toutes lors de sa session, et de gérer l’accès à certaines de ses données personnelles (nom, prénom, email, etc.)?:
- Il s’authentifie auprès du serveur d’authentification (identifiant/mot de passe par exemple).
- Toute demande d’authentification d’une application quelconque est alors déroutée vers le serveur d’authentification, qui authentifie l’utilisateur auprès de cette application. Aucune intervention n’est nécessaire de la part de l’utilisateur.
- L’application peut obtenir auprès du serveur d’authentification certaines données personnelles sur l’utilisateur dont celui-ci aura au préalable autorisé la diffusion.
- Lorsque l’utilisateur quitte sa session, son authentification est révoquée.
2 OpenID
OpenID est une solution libre et décentralisée d’authentification unique. Elle vous permet d’obtenir rapidement une identité numérique, de changer ou de révoquer cette identité tout aussi rapidement. L’architecture étant décentralisée, vous ne dépendez pas que d’un seul fournisseur de service?: vous pouvez en changer régulièrement et facilement ou bien carrément héberger vous-même votre identité numérique?!
Grâce à votre identité numérique OpenID, vous pourrez?:
- vous connecter une seule fois et accéder à tous vos sites préférés sans retenir tous les couples identifiant/mot de passe auparavant nécessaires?;
- centraliser les modifications de vos informations (exemple?: changement d’adresse email...)?;
- gérer les autorisations d’accès à vos informations de chaque site visité.
Attention, il n’est pas question ici de sécurité. D’un point de vue du site qui demande une authentification, OpenID permet uniquement de confirmer que la personne qui souhaite se connecter est bien la personne dont l’identité numérique est décrite par l’URL fournie, et que les informations fournies par le serveur OpenID concernent bien cette personne. À partir de là, il y a deux cas de figure?:
- soit le site a une confiance aveugle au serveur OpenID et décrète que si l’utilisateur est valide, alors il peut se connecter au site?;
- soit le site demande l’authentification au serveur OpenID, mais gère ensuite lui-même les droits d’accès.
OpenID n’est qu’une brique simplifiant l’authentification. Elle ne dispense pas de mettre en place une politique de sécurité sur les sites utilisant cette technologie.
2.1 Fonctionnement d’OpenID
Lors d’une authentification unique, et donc lors d’une authentification via OpenID, on trouve trois entités?: l’utilisateur qui souhaite s’authentifier (en fait, le navigateur utilisé, EU ou End User)?; le site sur lequel l’utilisateur souhaite s’authentifier (RP ou Relaying Party)?; le serveur d’authentification (OP ou OpenID Provider, ici le serveur OpenID). Lors de cette authentification, les échanges suivants ont lieu entre les trois entités?: l’utilisateur entre son identifiant OpenID sur le site sur lequel il souhaite s’authentifier?; le site contacte alors le serveur, et ils partagent un secret?; l’utilisateur est redirigé vers le serveur qui lui demande de s’authentifier (s’il s’agit du premier accès de la session de navigation)?; l’utilisateur est averti des données auxquelles le site souhaite accéder?; l’utilisateur décide des données qu’il souhaite communiquer au site?; l’utilisateur est alors redirigé vers le site, avec ses informations cryptées grâce au secret partagé établi entre le site et le serveur?; l’utilisateur est authentifié sur le site. L’utilisateur a donc la main sur ce qu’il souhaite communiquer au site, et ces informations sont transmises de manière sécurisée du serveur vers le site.
2.2 Extensions d’OpenID
Les spécifications d’OpenID couvrent le protocole de manière globale. Elles sont spécialisées par le biais d’extensions?:
- Simple Registration Extension (SREG)?: elle permet un échange de profil très léger, adapté à l’utilisation sur la plupart des sites, ce profil léger ne contenant que les 9 champs identifiés comme récurrents pour les identifications web (pseudonyme, nom complet, adresse email, date de naissance, langue, horaire, sexe, pays et code postal).
- Yadis Discovery Protocol?: c’est une proposition de description et de découverte de ressources (personne, document, service) via des URL, qui est utilisée dans OpenID 2.0 bien qu’externe au projet OpenID.
- Provider Authentication Policy Extension (PAPE)?: pour le moment toujours en draft, c’est une extension permettant au site (RP) de spécifier au serveur OpenID (OP) quelle politique de sécurité doit être appliquée concernant l’authentification de l’utilisateur, et inversement à OP de préciser à RP quelle politique de sécurité a été appliquée lors de l’authentification, afin de renforcer les liens de confiance entre les différents intervenants.
3 OpenID du point de vue de l’utilisateur
3.1 Utilisation d’OpenID
Il est vraiment très simple d’utiliser OpenID. Tout d’abord, il faut choisir un fournisseur de service OpenID (OpenIDFrance, Verisign, Myopenid, Yahoo, votre serveur personnel, etc.) et s’inscrire auprès de ce fournisseur afin d’obtenir une identité numérique OpenID, matérialisée par une URL (exemple?: http://www.openidfrance.fr/jean.christophe.lauffer).
Il suffit ensuite de donner cette URL en tant qu’identifiant OpenID sur les sites permettant l’authentification via OpenID.
S’il s’agit de votre première connexion pour cette session, vous serez redirigé vers le site de votre fournisseur de service OpenID pour vous authentifier, puis, si l’authentification est correcte, le site recevra les informations nécessaires à votre connexion?; s’il ne s’agit pas de votre première connexion pour cette session, le site recevra automatiquement (pour peu que vous ayez autorisé ce site à recevoir des informations vous concernant) les informations nécessaires à votre connexion.
Enfin, vous fermez votre session de navigation, ce qui a pour effet d’effacer les données de votre session d’authentification. Mise en place d’une redirection vers une URL de votre choix
<html> <head> <link rel="openid.server" href="http://www.openidfrance.fr/index.php" /> <link rel="openid.delegate" href="http://www.openidfrance.fr/jean.christophe.lauffer" /> </head> <body> </body> </html>
Les deux lignes insérées entre les balises <head> et </head> permettent de rediriger la requête OpenID vers le serveur qui héberge réellement votre identité OpenID. Supposons que le code ci-dessus soit placé dans le fichier http://www.drylm.org/jc.lauffer. Je pourrai alors utiliser cette nouvelle URL à la place de celle originale fournie par OpenIDFrance, tout en conservant mon identité chez eux. Vous bénéficiez ainsi du service du fournisseur d’identité, que vous n’avez pas à gérer et vous avez un identifiant OpenID personnalisé, qui reflète peut-être mieux votre identité (http://entreprise/identifiant), mais surtout qui est plus facilement mémorisable?; de plus, si vous changez de fournisseur d’identité OpenID, vous changez la ligne de votre fichier HTML et vous continuez à utiliser le même identifiant personnalisé.
Il y a tout de même un inconvénient, chacun jugera de son importance?: sans sombrer dans la paranoïa, êtes-vous vraiment sûr de ce que le fournisseur d’identité fait de vos informations personnelles?? Si ce point vous interpelle, sachez que, grâce à OpenID, vous pouvez très bien héberger vous-même ces informations. C’est ce que nous allons étudier dans la partie suivante.
3.2 Mise en place de votre propre serveur d’identité
Il n’y a bien sûr pas qu’une seule solution (voir sur le site d’OpenID la liste des bibliothèques connues?[5]). Voici une liste non exhaustive de bibliothèques permettant de créer soi-même son serveur OpenID?: C++?: opkele?[6] (utilisée notamment par le module d’authentification OpenID pour Apache)?; PHP?: php-openid?; Perl?: Net::OpenID?; Python?: python-openid?; Ruby?: port de la bibliothèque Python.
Nous utiliserons pour notre exemple un serveur autonome?[8] en PHP, très léger?: phpMyID?[9]. phpMyID permet de mettre rapidement en place un serveur d’identité personnel. Vous devez disposer d’un serveur web avec PHP installé, et sur lequel vous pouvez déposer des fichiers. Nous allons tout de suite mettre en place ce type de serveur d’identité. Attachez vos ceintures, c’est parti?! Téléchargez sur le site de phpMyID?[9] la dernière version disponible et décompressez l’archive. Vous allez alors obtenir plusieurs fichiers. Ceux qui nous intéressent sont?:
- MyID.php : la bibliothèque implémentant les fonctions de base d’OpenID?;
- MyID.config.php : le fichier de configuration de notre serveur OpenID?;
- README : fichier d’aide en anglais. Les explications sont bien plus complètes que celles que je vais donner, s’y référer en cas de besoin plus précis ou de problème.
L’installation du serveur d’identité s’effectue comme suit?:
- Déposez les fichiers PHP sur votre serveur personnel (exemple, je les ai déposés dans le répertoire?: http://www.drylm.org/jean-christophe/)?;
- Chargez la page de configuration pour obtenir le domaine ("?realm?"). Dans mon cas?: http://www.drylm.org/jean-christophe/MyID.config.php. J’obtiens l’affichage que vous pouvez visualiser sur la figure?1. Le domaine ("?realm?") est donc ici phpMyID.
- Il est temps de mettre en place le couple identifiant/mot de passe qui servira à vous authentifier sur votre serveur OpenID?: vous devez obtenir un hash md5 à partir des informations identifiant, domaine ("?realm?") obtenu dans la partie précédente, et mot de passe?:
Vous obtenez un hash (c’est le grand nombre en hexadécimal)?; modifiez alors le fichier MyID.config.php avec le login choisi et le hash obtenu?:
** * User profile * @name $profile * @global array $GLOBALS[‘profile’] */ $GLOBALS[‘profile’] = array( # Basic Config - Required ‘auth_username’ => ‘jean-christophe’, ‘auth_password’ => ‘58d0a37a9dadec29546e0dce2360dbd7’, );
- Mettez à jour les données SREG (Simple Registration) dans le fichier MyID.config.php?:
/** * Simple Registration Extension * @name $sreg * @global array $GLOBALS[‘sreg’] */ $GLOBALS[‘sreg’] = array ( ‘nickname’ => ‘jean-christophe’, ‘email’ => ‘jean-christophe.lauffer@drylm.org’, ‘fullname’ => ‘Jean-Christophe LAUFFER’, # ‘dob’ => ‘1979-11-05’, ‘gender’ => ‘M’, # ‘postcode’ => ‘35135’, ‘country’ => ‘FR’, ‘language’ => ‘fr’, ‘timezone’ => ‘Europe/Paris’ );
Commentez avec un # les données que vous ne voulez pas partager.
- Déposez à nouveau le fichier MyID.config.php modifié sur le serveur, puis rechargez la page de configuration pour vérifier la connexion?: si vous obtenez un message similaire, c’est que votre serveur d’identité est correctement configuré.
À ce stade, vous possédez une identité numérique personnelle (dans mon cas http://www.drylm.org/jean-christophe/MyID.config.php) sur un serveur personnel (très simple), ce qui vous garantit que vos informations ne sont pas hébergées (et surtout divulguées) par un tiers. Mais cette URL n’est pas facile à retenir. Deux choix s’offrent à vous?: renommez le fichier MyID.config.php en index.php ou écrivez un fichier index.php contenant ces lignes de code?:
en remplaçant bien évidemment les adresses par les vôtres. Vous pourrez alors utiliser une URL du style http://www.drylm.org/jean-christophe qui est beaucoup plus simple à retenir?!
En tant qu’administrateur de site, vous utilisez en général soit une solution toute prête à modifier (Drupal, MediaWiki,...), qui propose en général des extensions pour gérer les différents moyens d’authentification, soit une solution réécrite entièrement, auquel cas il faudra mettre les mains dans le cambouis. Nous allons donc étudier deux exemples de mise en place pour illustrer ces possibilités.
4 OpenID du point de vue de l’administrateur de site
4.1 Mise en place sur Drupal
Drupal est un CMS, une application Web de gestion de contenu. C’est d’ailleurs cet outil qui est installé sur notre site web. L’installation du greffon OpenId est des plus simples?: Connectez-vous sur votre site avec un utilisateur disposant des droits d’administration, puis allez dans Administrer -> Modules et activez le module OpenId (disponible dans le paquet de base de Drupal, aucun téléchargement supplémentaire n’est à faire. Rendez-vous ensuite sur la page du profil de votre utilisateur et vous y trouverez un onglet OpenId Identities. Cliquez dessus et ajoutez votre URL d’authentification OpenId. Déconnectez-vous alors de votre session et sur la page principale de votre installation de Drupal, vous pourrez choisir le mode d’authentification OpenId. Les bibliothèques à votre disposition
On retrouve globalement les mêmes bibliothèques que celles listées précédemment, ces bibliothèques proposant les fonctions nécessaires à la partie serveur d’identité et interrogateur du serveur d’identité.
4.2 Mise en place sur votre propre site
Nous allons construire un petit exemple d’appel à un serveur OpenID pour l’authentification d’un utilisateur en utilisant la bibliothèque php-openid?[7]. Cet exemple est tiré de l’exemple fourni avec la bibliothèque. L’exemple contient quatre fichiers?:
Ces 4?fichiers, commentés, peuvent être téléchargés sur le site de Linux Pratique, à l’adresse http://www.linux-pratique.com/download/, archive nommée LP48_openid.tar.gz
- common.php : ce fichier contient les définitions de fonctions globales nécessaires au dialogue avec le serveur OpenID.
- index.php : il s’agit du fichier principal, qui sert à saisir l’URL OpenID et à gérer l’affichage des informations par inclusion dans les autres fichiers.
- authentification.php : ce fichier contient la première partie du processus d’authentification?:
- création d’un consommateur (qui va servir à dialoguer avec le serveur)
- construction de la requête qui sera envoyée au serveur OpenID sous forme d’URL
- redirection vers le serveur OpenID pour que l’utilisateur s’authentifie auprès de lui.
- recuperation.php?: ce fichier contient la dernière partie du processus d’authentification?:
- création d’un consommateur (qui va servir à dialoguer avec le serveur)
- récupération de la réponse envoyée par le serveur OpenID
- analyse de la réponse
- affichage des données fournies.
Pour tester cet exemple, dont vous trouverez les sources complètes sur notre site?[11], il suffit de publier ces quatre fichiers sur un serveur web (ça fonctionne même en local sur votre propre machine) et de saisir votre URL d’identité OpenID (Fig.?2)?!
5 Hameçonnage
Comme pour la plupart des données sensibles transmises sur Internet, il y a un risque d’hameçonnage inhérent au principe de redirection de l’authentification d’OpenID. En effet, rien n’empêche un site malveillant de vous rediriger vers une page factice dans le but de récupérer vos informations de connexion. Il revient donc à l’utilisateur d’être vigilant quant à la confiance qu’il accorde aux sites sur lesquels il se connecte. Des discussions sur d’éventuels moyens de contourner ce problème sont actuellement en cours?: elles sont disponibles sur le wiki. Ceci ne doit pas vous dissuader d’utiliser OpenID, mais au contraire vous encourager à être très vigilant (ce conseil est valable de manière générale?; pas seulement pour OpenID, mais on a déjà dû vous le dire?;-)).
6 Conclusion
Nous venons d’effectuer ensemble un parcours d’initiation à OpenID. Grâce à cet article, nous espérons que l’authentification unique et l’authentification via OpenID ne sont plus seulement que de vagues termes aperçus par hasard en surfant. L’authentification unique est en train de sortir du monde de l’entreprise pour se démocratiser et toucher les utilisateurs personnels, confrontés à la multiplication des comptes notamment sur l’internet. Nous avons jeté les bases qui vous permettront d’utiliser OpenID, que vous soyez un utilisateur ou un administrateur de site web. Nous espérons vous avoir intéressé suffisamment pour que vous ressentiez l’envie de vous pencher un peu plus sur cette technologie.
7 Ressources
http://www.unixgarden.com/index.php/web/decouvrez-openid-un-systeme-d%E2%80%99authentification-decentralise
OpenID foundation?: http://openid.net/
OpenID France?: http://www.openidfrance.fr/
Spécifications du format OpenID et de ses extensions?: http://openid.net/developers/#specs
Site dédié aux développeurs OpenID?: http://www.openidsource.org
Liste des bibliothèques?: http://wiki.openid.net/Bibliothèques/
opkele : http://kin.klever.net/libopkele/
php-openid : http://www.openidenabled.com/php-openid/
Liste de serveurs autonomes?: http://wiki.openid.net/Run_your_own_identity_server_(fr)
Site de phpMyID?: http://siege.org/projects/phpMyID/
Site de Drupal?: http://www.drupal.org
Sources de l’exemple?: http://www.drylm.org/lp/openid