Guide de lecture des recommandations OpenID Connect de l’ANSSI

L’ANSSI a publiĆ© dĆ©but septembre des Ā«Ā recommandations pour la sĆ©curisation de la mise en œuvre du protocole OpenID ConnectĀ«Ā .

Comme toutes les publications de l’ANSSI, ce document regorge de conseils pertinents. L’application de l’ensemble des recommandations est souhaitable et renforcera un niveau de sĆ©curitĆ© dĆ©jĆ  Ć©levĆ©.

Or le document est aussi trĆØs thĆ©orique et sa lecture est parfois ardue. On sent qu’une Ć©tude minutieuse de la norme a Ć©tĆ© conduite, mais il manque un recul pratique soutenu par du vĆ©cu et de l’expĆ©rience.

C’est bien normal pour des recommandations, qui ne sont pas des exigences Ć  remplir obligatoirement. Elles doivent ĆŖtre comprises dans le contexte des applications Ć  protĆ©ger et, comme le rappelle le document, aprĆØs une Ć©tude et une analyse de risques.

On rĆ©sume ici notre analyse de cette publication de l’ANSSI et on essaie d’apporter des Ć©lĆ©ments de rĆ©flexion pour Ć©clairer le lecteur dans les dĆ©cisions qu’il sera amenĆ© Ć  prendre pour ses projets concrets.

Les relations complexes entre OpenID Connect et OAuth 2

On a coutume de dire comme l’ANSSI que Ā«Ā la norme OIDC complĆØte le protocole OAuth 2.0Ā Ā». C’est vrai, mais c’est plus compliquĆ©. Les deux protocoles n’ont pas du tout la mĆŖme finalitĆ©.

OAuth 2 est apparu d’abord, dans un contexte d’autorisation d’accĆØs Ć  des services web par une application tierce, soit pour son compte propre, soit pour le compte de l’utilisateur de l’application. Dans ce schĆ©ma, on retrouve la notion de client (l’application) et de Resource server (le service web).

OpenID Connect s’applique Ć  un autre cas : l’authentification Ć  une application. Dans son cas d’usage strict, le Resource server disparaĆ®t et il reste plus que le client (l’application). Il ne s’agit plus d’ouvrir l’accĆØs Ć  un service web, mais d’authentifier un utilisateur auprĆØs d’une application.

La finalitĆ© des normes est donc trĆØs diffĆ©rente :
ā€¢ OAuth 2 donne des autorisation d’accĆØs Ć  un service web (sans interaction directe avec un utilisateur qui n’existe pas toujours), sous la forme d’un jeton d’accĆØs
ā€¢ OpenID Connect transmet des informations sur l’identitĆ© d’une personne qui souhaite se connecter Ć  une application, grĆ¢ce Ć  un jeton d’identitĆ©

SchĆ©matiquement, OAuth 2 manipule des jetons d’accĆØs et OpenID Connect des jetons d’identitĆ©.

On a donc deux notions bien distinctes, mais avec des points de conjonction. OpenID Connect reprend en effet les concepts et les cinĆ©matiques d’OAuth 2, en les adaptant pour son cas d’usage. Ensuite, OpenID Connect fait usage de services web dans ses cinĆ©matiques et les sĆ©curise par OAuth 2. Elle fait donc usage en interne de jetons d’accĆØs.

Les deux protocoles sont d’ailleurs souvent utilisĆ©s en conjonction, dans la situation oĆ¹ une application doit Ć  la fois authentifier ses utilisateurs et faire appel Ć  des services web. La proximitĆ© des normes simplifie l’architecture en rassemblant dans un mĆŖme serveur les fonctions d’authentification et d’autorisation.

On notera au passage que l’on parle ici d’authentification par abus de langage. Il s’agit en fait techniquement de transmettre Ć  l’application l’identitĆ© de l’utilisateur. Les recommandations de l’ANSSI le soulignent avec raison : la phase concrĆØte d’authentification n’est pas couverte par la norme OpenID Connect. Elle est laissĆ©e Ć  l’apprĆ©ciation du fournisseur d’identitĆ©, qui fera la vĆ©rification par mot de passe, par authentification Ć  facteurs multiples, ou qui pourra mĆŖme la dĆ©lĆ©guer Ć  un autre serveur.

Cette dĆ©lĆ©gation se fait d’ailleurs elle-mĆŖme par OIDC : le fournisseur d’identitĆ© devient alors l’application qui confie son authentification Ć  un autre fournisseur d’identitĆ©. Qui peut Ć  son tour continuer le mouvement en se tournant vers un troisiĆØme fournisseur d’identitĆ©.

C’est par exemple la maniĆØre de fonctionner de France Connect.

Le fournisseur de donnĆ©es n’a pas sa place dans la liste des acteursĀ 


Le chapitre prĆ©cĆ©dent permet de clarifier une petite confusion dans la liste des acteurs des recommandations. Elle contient l’utilisateur, le fournisseur de service (l’application), le fournisseur d’identitĆ© et le fournisseur de donnĆ©es (Resource server).

Or si ce dernier est en jeu dans la norme OAuth 2 (c’est le service web), mais il n’intervient en aucune maniĆØre dans OIDC qui rĆ©alise l’authentification de l’utilisateur d’une application.

Les nouvelles cinƩmatiques OpenID Connect

Les recommandations de l’ANSSI prĆ©sentent les trois cinĆ©matiques initiales de la norme : authorization code, implicit et hybrid.

La cinĆ©matique authorization code a Ć©tĆ© conƧue pour les applications web classiques, oĆ¹ les traitements se font au niveau d’un serveur d’application qui a besoin de l’identitĆ© de l’utilisateur pour vĆ©rifier ses habilitations. Pour cela, l’application rĆ©cupĆØre un jeton d’identitĆ© directement du fournisseur d’identitĆ©, sans qu’il passe par le navigateur, dans une relation de serveur Ć  serveur qui limite les possibilitĆ©s d’usurpation d’identitĆ© et d’Ć©lĆ©vation de privilĆØge.

Or avec les applications modernes s’exĆ©cutant directement dans les navigateurs (SPA pour Single Page Application), la notion d’Ć©change serveur Ć  serveur n’a pas de sens. Et d’ailleurs la notion mĆŖme d’authentification auprĆØs de l’application n’a pas tellement de sens. L’utilisateur ayant le contrĆ“le de son navigateur, il peut modifier toutes les donnĆ©es qui s’y trouvent.

En revanche, ce qui est important, c’est que ces applications SPA (ou mobiles) se connectent Ć  un backend par des services web, et lĆ  la notion d’habilitation retrouve tout son sens. Mais on sort du pĆ©rimĆØtre OpenID Connect pour entrer dans celui d’OAuth 2. Pour une application SPA, le jeton d’identitĆ© n’est pas utile Ć  la sĆ©curitĆ©, mais le jeton d’accĆØs l’est.

Il n’est pas inutile Ć  ce stade de faire un petit dĆ©tour vers la sĆ©curisation des SPA. Ce type d’application s’est dĆ©veloppĆ© de maniĆØre importante car elles permettent une rĆ©activitĆ© inĆ©galĆ©e de l’interface et donc une amĆ©lioration sensible de l’expĆ©rience utilisateur. Les applications se sont alors sĆ©parĆ©es en deux : la prĆ©sentation au niveau du navigateur (frontend) et les traitements sur le serveur (backend). Il n’est pas illĆ©gitime de pousser la logique jusqu’au bout et de casser le lien entre les deux composantes pour en faire deux applications distinctes : une SPA sur le navigateur qui appelle des API sur le serveur.
Le backend se transforme alors en service web indĆ©pendant, et il peut mĆŖme se dĆ©multiplier en microservices. Le nouveau service web entre alors en plein dans le champ d’application d’OAuth 2 et du jeton d’accĆØs.

Sauf que le jeton d’accĆØs est une information critique car s’il est interceptĆ© il peut ĆŖtre rejouĆ© sans qu’il soit la plupart du temps possible de trouver le moyen de s’y opposer. Dans l’architecture SPA + API, l’application qui s’exĆ©cute sur le navigateur doit dĆ©tenir le jeton d’accĆØs pour le prĆ©senter Ć  l’API. Or il est impossible Ć  l’heure actuelle de garantir la protection du jeton d’accĆØs dans le navigateur.

Le moyen le plus efficace de protĆ©ger l’accĆØs d’une SPA Ć  un backend reste la session HTTP et son cookie HttpOnly qui le rend inaccessible. Il est illusoire de vouloir conjuguer de maniĆØre sĆ©curisĆ©e SPA et jeton d’accĆØs. L’architecture avec un frontend et un backend dĆ©diĆ© reliĆ©s par une session HTTP est donc prĆ©fĆ©rable du point de vue de la sĆ©curitĆ©.

Les applications mobiles sont un cas diffĆ©rent car avec le modĆØle actuel, on ne s’attend pas Ć  s’authentifier Ć  chaque fois qu’on accĆØde Ć  une app. On dispose de moyens de protections dĆ©diĆ©s (keystore Android et keychain iOS) et on dĆ©porte une partie de la sĆ©curitĆ© au niveau de l’Ć©quipement qui se dĆ©verrouille par PIN ou par biomĆ©trie.

Il est donc acceptable que les app mobiles conservent en propre non seulement des jetons d’accĆØs, mais encore des jetons de rafraĆ®chissement donnant accĆØs aux backend dans la durĆ©e.

Pour en revenir Ć  OpenID Connect, la norme a proposĆ© pour les SPA (malgrĆ© les rĆ©serves prĆ©sentĆ©es ci-dessus) et pour les app mobiles une cinĆ©matique appelĆ©e implicit calquĆ©e sur la cinĆ©matique OAuth 2 correspondante. L’application rĆ©cupĆØre directement deux jetons en retour d’authentification : un jeton d’accĆØs pour sĆ©curiser les appels au backend et un jeton d’identitĆ© pour afficher des informations sur l’utilisateur.

Or la cinĆ©matique implicit d’OAuth 2 a Ć©tĆ© abandonnĆ©e en 2018 Ć  cause de problĆØmes de sĆ©curitĆ© (possibilitĆ© de fuite ou d’injection de jeton).

Il ne reste alors plus que la cinĆ©matique authorization_code. Mais appliquĆ©e strictement aux SPA et app mobiles, elle pose un problĆØme de diffusion de mot de passe. La cinĆ©matique requiert en effet un secret pour sĆ©curiser l’Ć©change du code contre les jetons. Il faudrait alors que le mot de passe soit prĆ©sent dans les navigateurs et sur les mobiles, ce qui ferait basculer son statut de secret Ć  public.

Pour rĆ©soudre le problĆØme, OAuth 2 a ajoutĆ© Ć  la cinĆ©matique authorization code une mĆ©thode de vĆ©rification alternative lors de l’Ć©change, appelĆ©e Proof Key for Code Exchange (PKCE). On donne plus de dĆ©tails un peu plus bas.

Du fait de la grande proximitĆ© des cinĆ©matiques entre les deux protocoles, PKCE a pu ĆŖtre adaptĆ© Ć  OpenID Connect. Face Ć  un rival mieux sĆ©curisĆ©, la cinĆ©matique implicit d’OpenID Connect n’est plus recommandĆ©e (mĆŖme si elle est plus sĆ©curisĆ© que son pendant OAuth 2) et les bonnes pratiques lui prĆ©fĆØrent authorization code avec PKCE.

Maintenant qu’en est-il de la cinĆ©matique hybride ? Elle permet de rĆ©cupĆ©rer directement un jeton d’identitĆ© par retour d’authentification et d’obtenir un jeton d’accĆØs de maniĆØre sĆ©curisĆ©e en Ć©change d’un code Ć  usage unique. Son utilitĆ© est cependant discutable. Elle se justifie si l’application souhaite rĆ©aliser un traitement immĆ©diat sur l’identitĆ©, avant de rĆ©cupĆ©rer le jeton d’accĆØs par la suite. Certains avancent un cas d’usage oĆ¹ le jeton d’identitĆ© est interceptĆ© par une SPA sur le navigateur et oĆ¹ le code est rĆ©cupĆ©rĆ© par le backend pour obtention d’un jeton d’accĆØs.

Le jeton d’accĆØs doit alors ĆŖtre considĆ©rĆ© comme public, ne contenir aucune information confidentielle et ĆŖtre considĆ©rĆ© comme potentiellement falsifiĆ©. Il sort du champ de la sĆ©curisation, aux yeux de laquelle la cinĆ©matique hybride se comporte comme la cinĆ©matiques authorization code.

Il ne reste donc plus effectivement que la seule cinƩmatique authorization code (avec ou sans PKCE).

La recommandation R1 est donc correcte (utiliser en prioritĆ© authorization code), et pourrait avantageusement ĆŖtre complĆ©tĆ©e par des considĆ©rations sur la sĆ©curitĆ© des SPA et des app mobiles, et par une rĆ©fĆ©rence Ć  PKCE.

HTTPS est la fondation d’OpenID Connect

La recommandation R3 demande que toutes les communications soient sƩcurisƩes par le protocole TLS.

C’est en effet fondamental, car l’essentiel de la sĆ©curitĆ© d’OAuth 2, et par extension d’OpenID Connect, repose sur HTTPS.

Les concepteurs d’OAuth 2 sont partis du retour d’expĆ©rience mitigĆ© de la norme SAML, qui a rĆ©ussi Ć  s’imposer pour l’authentification des applications cloud, mais qui avait du mal Ć  se gĆ©nĆ©raliser aux autres applications. La complexitĆ© des exigences de sĆ©curitĆ© ont limitĆ© le nombre de bibliothĆØques disponibles. Pendant longtemps, il a mĆŖme Ć©tĆ© difficile de trouver un module SAML pour Java (pourtant langage le plus populaire). La raison en Ć©tait qu’il fallait coder des fonctions de sĆ©curitĆ© avancĆ©es, en particulier la signature et le chiffrement de documents XML. Or la cryptographie n’est pas Ć  la portĆ©e de tout le monde.

Avec OAuth 2, une partie importante de la sĆ©curitĆ© a Ć©tĆ© dĆ©portĆ©e vers le protocole HTTPS. Il a l’avantage d’ĆŖtre implĆ©mentĆ© dans tous les langages ; c’est un composant facile Ć  mettre en place, sĆ©curisĆ© et bien compris. On limite par lĆ -mĆŖme la possibilitĆ© de vulnĆ©rabilitĆ©s introduites par l’inexpĆ©rience.

Il n’a cependant pas Ć©tĆ© possible de couvrir toute la sĆ©curitĆ© par HTTPS. Il reste au moins une fonction de cryptographie : la vĆ©rification de signature des JWT.

Pour en revenir Ć  HTTPS, la recommandation R7 sur le certificate pinning est difficile Ć  mettre en oeuvre. Elle consiste Ć  installer une rĆ©fĆ©rence au certificat du serveur au sein de l’application qui demande l’authentification. On en perƧoit bien les bĆ©nĆ©fices thĆ©oriques, mais la mise en pratique s’annonce laborieuse. L’expiration du certificat devra ĆŖtre anticipĆ©e Ć  l’avance pour s’assurer d’installer le nouveau dans toutes les applications, avant de l’installer sur le serveur, puis de repasser sur toutes les applications pour retirer celui qui n’est plus valable.

Augmenter la sĆ©curitĆ© des demandes d’authentification par des contraintes supplĆ©mentaires risque d’avoir l’effet inverse

La demande d’authentification est le point de dĆ©part de la cinĆ©matique d’authentification. Elle correspond Ć  la redirection de l’utilisateur vers le fournisseur d’identitĆ© qui doit l’authentifier. A cette occasion, une demande est formalisĆ©e, sous la forme d’une requĆŖte d’authentification.

Cette requĆŖte donne au serveur des prĆ©cisions sur le processus Ć  suivre : essentiellement le protocole, la cinĆ©matique et l’URL de retour (pour savoir oĆ¹, au sein de l’application, renvoyer l’utilisateur une fois qu’il sera identifiĆ©).

Les recommandations R8 et R8+ conseillent de signer la requĆŖte pour Ć©viter toute manipulation de la requĆŖte. Ƈa part d’un bon sentiment. En thĆ©orie, plus on signe et plus on chiffre, et plus on est sĆ©curisĆ©.

Mais Ƨa, c’est la thĆ©orie. Dans la pratique, trop de signature et trop de chiffrement a l’effet inverse. Comme partout en sĆ©curitĆ©, Ć  mesure que les exigences augmentent, les utilisateurs trouvent des moyens de contournement qui abaissent le niveau gĆ©nĆ©ral.

C’est ce qu’illustre l’expĆ©rience SAML, qui Ć©tait la norme d’authentification avant qu’apparaisse OIDC.
ReplaƧons nous dans le contexte. On partait d’une situation oĆ¹ les applications gĆ©raient elles-mĆŖmes leur authentification, avec les consĆ©quences qui ont fait les titres de la presse informatique : fuite de mots de passe mal protĆ©gĆ©s, vulnĆ©rabilitĆ©s exploitĆ©es des fonctions d’authentification, difficultĆ©s Ć  mettre en place des authentifications fortes, impossibilitĆ© d’adapter l’authentification au contexte de l’utilisateur.

ReplaƧons nous dans le contexte. On partait d’une situation oĆ¹ les applications gĆ©raient elles-mĆŖmes leur authentification, avec les consĆ©quences qui ont fait les titres de la presse informatique : fuite de mots de passe mal protĆ©gĆ©s, vulnĆ©rabilitĆ©s exploitĆ©es des fonctions d’authentification, difficultĆ©s Ć  mettre en place des authentifications fortes, impossibilitĆ© d’adapter l’authentification au contexte de l’utilisateur.

La fĆ©dĆ©ration des identitĆ©s, avec SAML, a proposĆ© une avancĆ©e concrĆØte en dĆ©lĆ©guant la fonction d’authentification Ć  des serveurs spĆ©cialisĆ©s et sĆ©curisĆ©s, intĆ©grant des mĆ©canismes de protection contre les attaques et ouverts vers les diffĆ©rentes mĆ©thodes d’authentification. Mais son adoption s’est largement limitĆ©e aux services dans le cloud.

La raison en est Ć©vidente pour qui a interfacĆ© une application en SAML : la lourdeur et la complexitĆ© de la norme. Il faut Ć©changer des mĆ©tadonnĆ©es, faire de la signature et du chiffrement XML, prĆ©ciser tous les types de donnĆ©es. En cas d’incompatibilitĆ©, l’authentification tombe en erreur. RĆ©sultat : il existait trĆØs peu de bibliothĆØques SAML, qui Ć©taient souvent incomplĆØtes. L’authentification est restĆ©e intĆ©grĆ©e aux applications, avec tous les problĆØmes de sĆ©curitĆ© associĆ©s.

Fort de ce constat, la norme OIDC a Ć©tĆ© pensĆ©e comme simple et efficace, ce qui s’est traduit par une large adoption dans les entreprises. Non seulement l’offre en bibliothĆØques est plĆ©thorique, mais l’interfaƧage d’une application, tout en Ć©tant toujours relativement complexe, reste Ć  la portĆ©e de chacun.

Les recommandations R8 et R8+ sont dans l’absolu souhaitables, mais dans la rĆ©alitĆ© elles reprĆ©sentent dans la plupart des cas une barriĆØre inutile qui freinera la diffusion de la fĆ©dĆ©ration des identitĆ©s. Les applications conserveront plus longtemps leur authentification interne, et leur niveau de sĆ©curitĆ© discutable.

Il existe cependant des moyens de renforcer la sƩcuritƩ sans prƓner le tout cryptographie.

L’ANSSI nous indique que le risque le plus important en phase de requĆŖte d’authentification, c’est qu’un tiers manipule le champ scope utilisĆ© pour demander des claims, c’est-Ć -dire des informations personnelles sur l’utilisateur. Effectivement, si quelqu’un Ć©coute les Ć©changes, il ne faut pas qu’il puisse demander subrepticement le numĆ©ro INSEE (NIR) de la personne et l’obtenir.

Pour empĆŖcher cela, on conseille de fixer au niveau du serveur la liste des informations transmises Ć  une application donnĆ©e. Et c’est d’ailleurs une bonne pratique mise en œuvre par la plupart des fournisseurs d’identitĆ© : ce n’est pas parce qu’une application demande une information qu’on va la lui donner.

Faire mieux que la norme n’est pas toujours souhaitable

Les recommandations s’intĆ©ressent de prĆØs aux capacitĆ©s de sĆ©curitĆ© du fournisseur d’identitĆ©, afin de guider les administrations dans le choix du serveur chargĆ© de rĆ©aliser l’authentification.

Les conseils sont pertinents, qu’ils soient gĆ©nĆ©raux comme sur les algorithmes de cryptographie, ou plus spĆ©cifiques comme sur la conservation des jetons.

Il arrive cependant que les recommandations aillent Ć  l’encontre de la norme OpenID Connect. L’ANSSI relĆØve d’ailleurs le point et avertit le lecteur que Ā«Ā les implĆ©mentations certifiĆ©es par la fondation OpenID respectent strictement la norme OIDCĀ Ā» et que la recommandation concernĆ©e ne pourra pas ĆŖtre mise en oeuvre par un tel fournisseur d’identitĆ©.

L’ANSSI est dans son rĆ“le quand elle fait une lecture critique des normes pour pointer leurs insuffisances.

Mais dans le cadre de l’authentification, le respect de la norme est le garant de la bonne interopĆ©rabilitĆ© entre les systĆØmes. La dĆ©cision d’en sortir doit ĆŖtre prise en pleine conscience des consĆ©quences. Elle restreint l’Ć©ventail des choix, et impose souvent un dĆ©veloppement complĆ©mentaire.

Car si les Ć©diteurs et dĆ©veloppeurs de fournisseurs d’identitĆ© ont en effet intĆ©rĆŖt Ć  proposer des fonctions diffĆ©renciatrices, ils le font toujours dans le cadre de la norme pour des raisons Ć©videntes.

Fort heureusement les recommandations en question portent la plupart du temps sur la possibilitĆ© d’imposer un comportement aux applications. Une telle obligation ne passe pas nĆ©cessairement par des moyens techniques, elle peut se faire juridiquement dans le cadre du contrat de service avec les applications.

A l’inverse, la recommandation R17 est une obligation dĆ©jĆ  imposĆ©e par la norme OpenID Connect. Elle s’applique une fois l’authentification rĆ©alisĆ©e, lorsque le fournisseur d’identitĆ© redonne la main Ć  l’application. C’est fait par une redirection vers une URL fournie lors de la demande d’authentification. La norme indique qu’elle ne peut se faire que vers des URL dĆ»ment enregistrĆ©es au prĆ©alable, pour Ć©viter qu’un attaquant ayant rĆ©ussi Ć  modifier la requĆŖte d’authentification ne dirige les utilisateurs vers un serveur qu’il contrĆ“le, d’oĆ¹ il rĆ©cupĆØrera les jetons des utilisateurs.

L’authentification du client nĆ©cessite quelques complĆ©mentsĀ 

Dans la cinĆ©matique d’authentification, les jetons ne sont pas transmis directement lors du retour du fournisseur d’identitĆ© vers l’application. Ce retour s’opĆØre en effet par redirection et les jetons transiteraient par le navigateur de l’utilisateur qui est un point faible en termes de sĆ©curitĆ©. Les jetons peuvent y ĆŖtre interceptĆ©s, possiblement par un attaquant, et trĆØs facilement pour l’utilisateur lui-mĆŖme qui pourra tenter de les altĆ©rer Ć  son profit.

A la place d’un jeton, c’est un code Ć  usage unique qui est transmis, et qui est utilisĆ© par l’application lors d’un Ć©change direct avec le fournisseur d’identitĆ© pour rĆ©cupĆ©rer les jetons. Pour cela, l’application (appelĆ©e client) doit au prĆ©alable s’authentifier pour Ć©viter qu’un attaquant ayant rĆ©cupĆ©rĆ© un code puisse s’en servir.

La norme propose plusieurs mĆ©thodes : le simple mot de passe ou la signature d’un jeton (HMAC ou clĆ©s asymĆ©triques). L’ANSSI ne tranche pas et conseille d’utiliser le moyen le plus appropriĆ© dans le contexte de l’application.

Les Ć©changes se faisant en HTTPS entre deux serveurs, on considĆØre souvent que la fourniture du mot de passe est suffisante. On n’envisagera les mĆ©thodes par signature que si le risque d’Ć©coute des Ć©changes est fort.

Ce qui est toutefois passĆ© sous silence, c’est la protection du mot de passe par l’application. L’ANSSI semble se placer dans le cadre exclusif de l’application web classique exĆ©cutĆ©e sur un serveur.

Or OpenID Connect n’est pas utilisĆ© que dans cette unique configuration. Les applications de type page unique (SPA) ou les apps mobiles entrent certes dans le cas d’usage OAuth 2 (rĆ©cupĆ©ration d’informations auprĆØs d’un backend), mais ont aussi parfois besoin dans un premier temps de vĆ©rifier que l’utilisateur a bien accĆØs Ć  l’application. Le point a Ć©tĆ© dĆ©veloppĆ© plus haut.

Elle commencent donc par vĆ©rifier un jeton d’identitĆ© et ne font parfois appel au backend que suite Ć  une sollicitation de l’utilisateur.

Dans le cas des SPA, on prĆ©fĆØre protĆ©ger les jetons (en particulier le jeton OAuth 2 de rafraĆ®chissement) au sein d’un serveur dans un backend dĆ©diĆ©, mais certaines applications dĆ©cident de s’en passer, conservent un jeton d’accĆØs localement et le renouvellent par rĆ©authentification transparente. Les apps mobiles conservent souvent en interne le jeton de rafraĆ®chissement.

Ce qui fait qu’on a bien, en OpenID Connect, des cas lĆ©gitimes de clients publics, c’est-Ć -dire de rĆ©cupĆ©ration de jeton d’identitĆ© directement par une application non protĆ©gĆ©e : sur un navigateur ou dans un mobile.

La phase d’Ć©change du code contre des jetons pose alors problĆØme, car l’application doit ĆŖtre authentifiĆ©e auprĆØs du fournisseur d’identitĆ©. Elle devrait donc contenir un secret, mais dans un navigateur ou dans un tĆ©lĆ©phone, rien n’est secret.

La cinĆ©matique implicit avait Ć©tĆ© prĆ©vue pour ce cas d’usage, mais la transmission directe des jetons pose problĆØme. Un complĆ©ment Ć  la norme OAuth 2, repris par OIDC, a ensuite Ć©tĆ© produit pour adresser ce problĆØme. Il est appelĆ© PKCE et au lieu d’authentifier le client en tant que tel, il assure que les jetons sont bien donnĆ©s Ć  l’application qui en a fait la demande.

La bonne pratique est maintenant pour les clients publics d’utiliser PKCE (prononcer pixy) pour la rĆ©cupĆ©ration des jetons en Ć©change du code Ć  usage unique.

En attente de conseils sur les niveaux de sƩcuritƩ

La recommandation R29 suggĆØre de vĆ©rifier que le niveau de sĆ©curitĆ© de l’authentification demandĆ© correspond bien Ć  celui obtenu. On peut en effet exiger dans la requĆŖte d’authentification qu’elle soit rĆ©alisĆ©e avec plusieurs facteurs (authentification forte). Il convient ensuite vĆ©rifier que l’authentification qui a Ć©tĆ© effectivement rĆ©alisĆ©e correspond bien Ć  l’exigence de dĆ©part.

On aurait aimĆ© que l’ANSSI nous Ć©claire sur ces niveaux de sĆ©curitĆ©, en donnant des dĆ©finitions, en explicitant la maniĆØre de les appliquer, en indiquant comment les vĆ©rifier, etc.

L’annexe B3 du RGS traite de l’authentification, mais elle date de 2010 et elle n’aborde pas la question.

L’Europe avec eIDAS dĆ©finit trois niveaux. L’ISO avec ISO/IEC 29115 en dĆ©finit quatre. L’IANA maintient un registre des niveaux de sĆ©curitĆ© oĆ¹ l’on retrouve un peu n’importe quoi. De son cĆ“tĆ© aux Etats-Unis le NIST a produit une documentation extensive et traite l’identitĆ©, l’authentification et la fĆ©dĆ©ration, avec trois niveaux pour chaque.

Dans ce dĆ©ferlement d’informations pas toujours exploitables, les conseils de l’ANSSI seraient les bienvenus.

Informations personnelles dans le jeton ou par userinfo

La norme dĆ©finit deux moyens pour une application de rĆ©cupĆ©rer des informations personnelles lors de la phase d’authentification. Le premier consiste Ć  enrichir le jeton d’identitĆ© et le second correspond Ć  utiliser un service web (appelĆ© userinfo).

Les recommandations ne se prononcent pas sur ce qu’il convient d’utiliser. Pourtant les deux options ne sont pas Ć©quivalentes.

Le jeton d’identitĆ© est en effet une entitĆ© qui est susceptible d’ĆŖtre diffusĆ©e. Dans le cas des clients publics (SPA et app mobiles), il est rĆ©cupĆ©rable facilement par l’utilisateur et risque d’ĆŖtre dĆ©robĆ©.

On prĆ©fĆ©rera donc n’enrichir le jeton qu’avec des informations non confidentielles, Ć  moins qu’on soit certain de sa bonne protection. Le service web userinfo est plus sĆ©curisĆ© et il doit ĆŖtre privilĆ©giĆ© pour les donnĆ©es critiques.

Ces principes s’appliquent pleinement dans un cadre OAuth 2 puisque le jeton d’accĆØs est par nature Ć©changĆ© entre l’application et le service web, et qu’il a donc besoin d’ĆŖtre protĆ©gĆ©. Si on sort ici du cadre strict d’OpenID Connect, on a d’une maniĆØre gĆ©nĆ©rale intĆ©rĆŖt Ć  Ć©tendre les bonnes pratiques aux deux protocoles.

Ces suggestions doivent cependant ĆŖtre tempĆ©rĆ©s par les capacitĆ©s techniques des fournisseurs d’identitĆ©s qui n’offrent pas tous les mĆŖmes libertĆ©s dans la configuration des donnĆ©es (claims). Il existe ainsi des systĆØmes qui n’autorisent pas l’enrichissement du jeton, pourtant prĆ©vu par la norme. D’autres publient exactement les mĆŖmes informations dans les jetons et dans le service web userinfo, sans possibilitĆ© d’en restreindre le nombre dans le jeton.

On aura donc intĆ©rĆŖt Ć  privilĆ©gier les fournisseurs d’identitĆ© qui se montrent souples dans la configuration de la diffusion des claims.

Bien vĆ©rifier la validitĆ© du jetonĀ 

Ceux qui n’ont jamais touchĆ© Ć  la cryptographie sont enclins Ć  vouloir tout chiffrer pour adresser tous les problĆØmes de sĆ©curitĆ©.

Ceux qui l’ont pratiquĆ©e vous le diront : Ā«Ā cryptography is hardĀ Ā». MĆŖme pour les experts. En 2013 une base de 38 millions de mots de passe a fuitĆ© d’Adobe. Mais heureusement, elle Ć©tait chiffrĆ©e. Ouf. Sauf que ce qui Ć©tait chiffrĆ©, c’Ć©tait juste le mot de passe, et avec un algorithme rĆ©versible et sans Ā«Ā selĀ Ā». Une simple analyse statistique aurait permis de dĆ©couvrir les mots de passe de nombreux comptes (dans les faits, la fuite a aussi concernĆ© les indices de mot de passe associĆ©s, ce qui a rendu la tĆ¢che des hackers encore plus facile).

L’ANSSI recommande avec R44 de fixer l’algorithme de signature des jetons (quand c’est possible, ce qui n’est pas toujours le casā€¦). C’est important, car les attaquants ont plusieurs moyens faciles de contrefaire un jeton en jouant sur ces algorithmes.

Le plus simple, c’est de fabriquer son propre jeton et de ne pas le signer du tout. A la place, on indique dans le jeton que l’algorithme none a Ć©tĆ© utilisĆ©. En application stricte des normes, le jeton est tout Ć  fait valide et sera acceptĆ©.

Depuis que ce problĆØme a Ć©tĆ© dĆ©couvert, les bibliothĆØques de vĆ©rification des jetons doivent rejeter cet algorithme. La vĆ©rification se faisant du cĆ“tĆ© de l’application, il ne sera pas inutile de s’assurer que la bibliothĆØque OIDC utilisĆ©e est correcte sur ce point.

Les attaquants disposent d’un autre moyen pour profiter des bibliothĆØques mal sĆ©curisĆ©es. Certaines par exemple utilisent la mĆŖme mĆ©thode pour vĆ©rifier les signatures HMAC et asymĆ©triques. Or si dans le premier cas la clĆ© est privĆ©e (et protĆ©gĆ©e), dans le second elle est publique. Un attaquant mettant la main dessus, il pourra l’utiliser pour signer son jeton contrefait en HMAC et la bibliothĆØque validera le jeton.

On devra donc au moins indiquer Ć  la bibliothĆØque le type de signature que le serveur utilise.

Dans l’immense majoritĆ© des cas, les fournisseurs d’identitĆ© font des signatures par clĆ©s asymĆ©triques, dont ils mettent la clĆ© publique Ć  disposition par l’endpoint JWKS.

Cet endpoint assure la sĆ©curitĆ© de la vĆ©rification de signature. La clĆ© publique est rĆ©cupĆ©rĆ©e en direct depuis l’endpoint protĆ©gĆ© par HTTPS (dont on validera le certificat). On s’assure de ce fait de sa validitĆ© (l’invalidation des clĆ©s compromises est connue en temps rĆ©el). De plus, elle est publiĆ©e avec ses mĆ©tadonnĆ©es, qui sont utilisĆ©es par les bibliothĆØques de vĆ©rification (type de clĆ©, algorithme, finalitĆ©).

Il est fortement encouragĆ© de procĆ©der de la sorte. On s’Ć©vite les contraintes des certificats (renouvellement, intĆ©gration des certificats racines) tout en assurant un niveau de sĆ©curitĆ© supĆ©rieur.

Conclusion

Les recommandations de l’ANSSI sur la sĆ©curitĆ© OpenID Connect sont un outil prĆ©cieux pour bien choisir un fournisseur d’identitĆ© et pour rĆ©aliser de maniĆØre sĆ©curisĆ©e l’authentification des applications.

Elles restent cependant des recommandations dont l’application reste du ressort de chaque projet. Dans cette optique, elles manquent toutefois parfois d’Ć©lĆ©ments sur lesquels asseoir les dĆ©cisions.

Avec le recul de plus de 10 ans de mise en place de solutions de fĆ©dĆ©ration des identitĆ©s, nous espĆ©rons avoir Ć©clairĆ© le lecteur sur la mise en place concrĆØte des mesures recommandĆ©es.

Et comme tout le monde, nous attendons avec impatience des recommandations similaires sur la sĆ©curisation d’OAuth 2, le protocole d’autorisation des services web, en ces temps oĆ¹ les architectures reposant sur des API sont en vogue.

Auteur : Marc (Directeur technique)