Sécurisation d’une application Web
L’objectif de la sécurisation d’une application Web est de donner accès à certaines ressources qu’aux utilisateurs ayant le profil adéquat. Cela suppose d’authentifier l’utilisateur et de vérifier s’il est autorisé à accéder aux ressources demandées. Le plan de développement de la sécurisation d’une application peut se résumer aux étapes suivantes : ● définir la méthode d’authentification ; ● définir le domaine de sécurité ; ● déclarer les contraintes de sécurité pour les ressources qui doivent être protégées ; ● définir les profils d’utilisateurs qui ont le droit d’accéder aux ressources. Ces étapes ne sont pas liées. Par exemple, nous pouvons changer la méthode d’authentification sans toucher aux autres contraintes. Différents exemples vont illustrer quelquesunes des configurations possibles. Tous ces exemples sont basés sur la même application Web qui comporte trois espaces de navigation dont certains sont uniquement accessibles à des utilisateurs authentifiés. 1. Mise en place de HTTPS Les données qui transitent entre le navigateur et le serveur transitent en clair. TSL (Transport Secure Layer), anciennement baptisé SSL (Secure Sockets Layer), permet le chiffrement de ces données. Ce protocole a été développé à l’origine par Netscape, l’IETF (Internet Engineering Task Force) ayant depuis, racheté le brevet. Le port d’écoute par défaut de HTTPS est le port 443. Ce numéro de port n’a pas besoin d’être précisé dans l’URL. Lorsque l’URL contient le protocole HTTPS, automatiquement le navigateur se connecte sur le port 443. Ce protocole permet d’atteindre les objectifs suivants : ● authentification du serveur : le serveur possède un certificat numérique ; ● confidentialité des données échangées entre le navigateur et le serveur ; ● intégrité des données échangées ; ● possibilité de mettre en place une authentification forte par authentification mutuelle entre le client et le serveur. Pour mettre en place le protocole HTTPS sur JBoss, il faut : ● Installer un certificat numérique qui identifie le serveur et qui contient la clé de chiffrement. Ce certificat est normalement émis par un tiers de confiance, l’autorité de certification (Verisign, par exemple). Nous verrons comment créer notre propre certificat. ● Configurer le fichier server.xml du conteneur Web pour ajouter un connecteur sécurisé.
Création du certificat numérique
Un outil de gestion des certificats : keytool est inclus dans les outils du JDK. Cet utilitaire est dans le répertoire bin du répertoire d’installation du JDK. Pour créer votre certificat, tapez la commande suivante (sur une seule ligne) : keytool -keyalg RSA -genkey -alias eni -keystore /server/default/conf/eni.keystore ATTENTION : certaines commandes de l’outil keytool ont changé de nom avec JSE 6 : ● -export, a été renommée en exportcert ; ● -genkey, a été renommée en genkeypair ; ● -import, a été renommée en importcert. Cette commande permet de préciser : ● l’algorithme de chiffrement utilisé, par l’option -keyalg, ici RSA ; ● l’alias utilisé pour retrouver la clé, par l’option -alias, ici eni ; ● le fichier où seront enregistrées les clés, le trousseau de clés, par l’option -keystore, ici, serveur.keystore. Si cette option n’est pas précisée, un fichier .keystore est créé, sans nom devant l’extension (fichier caché sous LINUX). L’utilitaire vous demande alors le mot de passe qui sera utilisé, ici nous avons entré « editions ». Vous devez ensuite confirmer le mot de passe. Ensuite, vous devez entrer un certain nombre de renseignements nom, prénom, ville, etc. $jboss-4.2.2.GA\server\default\conf>keytool -genkey -keyalg RSA -alias eni -keystore serveur.keystore Tapez le mot de passe du Keystore :editions Ressaisissez le nouveau mot de passe :editions Quels sont vos prénom et nom ? [Unknown] : localhost Quel est le nom de votre unité organisationnelle ? [Unknown] : eni Quelle est le nom de votre organisation ? –
Quel est le nom de votre ville de résidence ?
[Unknown] : Paris Quel est le nom de votre état ou province ? [Unknown] : France Quel est le code de pays à deux lettres pour cette unité ? [Unknown] : FR Est-ce CN=Franck SIMON, OU=editions eni, O=eni, L=Paris, ST=France, C=FR ? [non] : oui Spécifiez le mot de passe de la clé pour (appuyez sur Entrée s’il s’agit du mot de passe du Keystore) : Le premier mot de passe entré correspond au mot de passe du trousseau de clés (le fichier serveur.keystore), le dernier mot de passe correspond à celui de la clé, ici le même que le trousseau de clés. Le fichier keystore a été généré dans le répertoire conf de la configuration de serveur par défaut. Vérifiez que le fichier serveur.keystore soit bien créé. Notez que les renseignements sur le prénom et nom correspondent à la partie CN (Common Name) du certificat. Certains navigateurs vérifient que la valeur du CN corresponde à une partie du nom de domaine, sur laquelle est faite la requête. S’il n’y a pas correspondance, le navigateur peut alors afficher une message d’avertissement. Ici, nous mettrons donc localhost, dans le monde réel cela pourrait être votre nom de domaine. Le certificat généré ici est un certificat autosigné. Pour faire signer le certificat par une autorité de certification, des manipulations supplémentaires sont nécessaires, référezvous à la documentation de l’utilitaire keytool. b. Configuration du fichier server.xml Le fichier server.xml se trouve dans le répertoire : \server\default\deploy\jbossweb.deployer Avant de manipuler ce fichier, faitesen une copie. Ajoutez l’élément suivant, en veillant à le positionner dans la balise . Les attributs utilisés sont : ● port : port d’écoute du connecteur, ici 8443. Il faudra donc préciser le port dans l’URL : https://localhost:8443/secu. Si vous indiquez le port 443, vous n’avez pas besoin de le préciser dans l’URL ; ● protocol : il s’agit du protocole HTTP 1.1 ; ● SSLEnabled : positionné à true ; ● address : adresse d’écoute de JBoss ; ● maxThreads : nombre maximum de threads exécutés en même temps sur ce connecteur ; ● scheme : préfixe https pour l’URL ; ● secure : positionné à true ; ● clientAuth : positionné à false pour que le navigateur n’ait pas à envoyer une chaîne certifiée, sauf pour l’authentification en CLIENTCERT ; ● sslProtocol : positionné à TSL ; ● keystoreFile : nom du fichier contenant le certificat, avec son chemin ; ● keystorePass : mot de passe du certificat ; ● keyAlias : nécessaire si plusieurs clés sont présentes dans le trousseau. Il contient alors l’alias vers la clé utilisée. Redémarrez le serveur, et testez l’URL suivante : https://localhost:8443/. Par défaut, le port d’écoute en mode HTTPS est le port 443, si le serveur est configuré sur le port HTTPS par défaut, vous n’avez pas à préciser le port, l’URL devient alors : https://localhost/. Attention de bien préciser le protocole https pour activer la communication sécurisée.