Tutoriel sécurité déclarative JEE avec JAAS

/////Tutoriel sécurité déclarative JEE avec JAAS

securite-java-objis.jpg
Sécurisez vos applications Web Java sans la moindre ligne de code Java: bénéficiez de l’implémentation par votre serveur d’application de la sopécification JAAS. Choisissez un royaume d’Authentification (Realm). Choisissez votre stratégie d’Authentification. Découvrez pas à pas les étapes d’une authentification par formulaire avec informations de connexion dans une base de données.

Prérequis

 Installation Tomcat

 Intégration de Tomcat dans Eclipse

Objectifs

 Sécuriser une application de façon déclarative – sans ligne de code

 Comprendre la mise en œuvre de JAAS par un développeur Java EE

Programme

 Partie 1 : Création du projet web dynamique ‘securitestruts’

 Partie 2 : Questions sur la sécurité J2EE

 Partie 3 : Création de la base de données

 Partie 4 : création et déclaration de la DataSource

 Partie 5 : Création du Realm

  Partie 6 : mise en place de la protection

Durée

 1h30

Contexte : sécuriser application JEE

Vous souhaitez mettre en oeuvre la spécification ‘JAAS’ (Java Authentication and Authorisation Service) pour sécuriser une application web développée en Java.

Avec JAAS, en répondant à 4 questions clés (QUOI ? QUI ? COMMENT ? OU ?), vous allez pouvoir sécuriser votre application (ici conteneur web) sans la moindre ligne de code, uniquement par configuration.

secu-jaas.png

— 3 des questions (QUOI ? QUI ? COMMENT ?) trouvent leur réponses dans le fichier web.xml de configuration de l’application web déployée.

— 1 question (OU ?) trouve sa réponse dans une configuration qui sera spécifique au serveur d’application cible. Ici (spécifique TOMCAT) , c’est dans le fichier de configuration conf/context.xml du serveur que nous indiquerons le royaume de sécurité (Realm) , à c’est à dire le lieu ou se trouvent les login/pwd et rôle des utilisateur authentifier/autoriser.

REMARQUE 1 : Ici il s’agit d’une application Struts , mais cela pourrait très bien être une application développée avec un autre framework type JSF, Wicket…ou encore une application web Jee développée en Servlet/Jsp.

REMARQUE 2 : si l’application n’est pas une application Struts, aller directement en partie 3 pour mettre en oeuvre la méthodologie JAAS :

Dans la suite de ce TP, vous allez mettre en oeuvre une sécurisation basée sur un ‘Realm Database’ : c’est à dire avec des login/pwd stockées en base de données :

1) créer une base de données afin d’y stocker utilisateurs, mots de passe et roles

2) créer et déclarer une ‘DataSource JNDI’ pour votre application web. Nous donnons ainsi un nom à notre source de données.

3) créer un ‘Royaume de sécurité’ (Realm JDBC) dans le fichier context.xml de tomcat

4) mettre en oeuvre la protection des pages JSP et autres répertoires/ressources de l’application

Partie 1 : création projet ‘demostrutssecurite’

Une bonne pratique de développement struts est de commencer tout projet struts par le séquelle d’application struts-blank livré avec Struts.

INFO : Le tutoriel spring1 N°2 Déploiement struts-blank dans eclipse détaille cette opération.

Le point de départ de ce tutoriel est donc un projet eclipse avec tomcat intégré et struts-blank déployé.

tutoriel_struts1_premiere_appli.png

TELECHARGEZ LE PROJET ECLIPSE A CETTE ETAPE

projet eclipse premiere application initial

Partie 2 : Questions sur la sécurité J2EE

Qu’est ce que JAAS ?

— > Spécification Java pour gérer authentification et autorisation d’une applications web Java

Quelle différence entre Authentification et Autorisation

— > Authentification : vérif login et pwd OK, –> Autorisation –> Vérif que l’utilisateur a le bon role métier pour accéder.

Qu’est ce qu’un Realm ? Donner un exemple de Realm

— > Realm = royaume d’autentification = lieu de stockage des infos logi/pwd/role. Exemlple : dans un fichier (UserDataBAseRealm), dans une base de données non JNDI (JDBCRealm) dans une base de données DataSourceJNDI (JNDIRealm), Dans un annuaire LDAP (LDAPRealm)

Où déclare t’on un Realm ?

— > Coté serveur

— > Cela dépend du serveur

— > Dans Tomcat , on peut le faire dans 2 endroits : server.xml (mauvaise pratique car fichier très sensible) ou context.xml (bonne pratique. On y retrouve essentiellement 2 types de ressources : database + Realm Database)

— A quoi sert la balise ‘security-constraint’ ? Ou se trouve t’elle ?

— > dans web.xml

Précisez ce qu’est une authentification de type FORM dans J2EE

— > Exemple de réponse à la question COMMENT (dans web.xml, balise ‘auth-method’): on soumet un formulaire ‘normalisé’ à l’utilisateur : le champ ‘j_username’ pour login, le champ ‘j_password’ pour mdp , et l’action est ‘j_security_check’

Quelles différences entre authentifications BASIC, FORM, CLIENT-CERT

— > Exemple de réponse à la question COMMENT :

— -> BASIC : popup

— -> FORM : Formulaire

— -> CLIENT-CERT : certificats échangé entre client et serveur

Partie 3 : Création de la base de données

Nous avons choisit que les utilisateurs et leurs mots de passe seront stockés dans une base de données. La structure minimale de cette base est imposée par Tomcat . Cette structure peut être enrichie par des champs propres à l’application ( il n’est donc pas nécessaire d’avoir une base de données dédiée au stockage des utilisateurs).

Le schéma minimal se compose de deux tables : la première stocke les utilisateurs et leur mot de passe, la seconde associe des rôles à ces utilisateurs. Voici les commandes de création des tables (vous pouvez nommer les tables et les colonnes comme bon vous semble) :

tutoriel-struts-1-securite-creation-tables-jaas-database

Avec votre serveur de base de données (ici WAMP), créez une base de données nommée ’formation’

 Dans cette base de données exécutez le script securitejassdb.sql ci-contre. Il contient des 2 instructions ci-dessus.

 A travers l’interface phpMyAdmin, mettez en évidence la création des tables :

tutoriel-struts-1-securite-jaas-3

REMARQUE : Il est conseillé de mettre le nom d’utilisateur en clé primaire ou d’avoir un index unique dessus.

Une fois la base en place, il est nécessaire de créer l’entrée JNDI qui permettra d’y accéder.

Partie 4 : création et déclaration de la DataSource

Etape 1 : Driver JDBC

 Copiez le driver de la base de données dans le répertoire lib de tomcat 6.

tutoriel_struts_objis_acces_db_2.png

Etape 2 : web.xml

 Ajoutez les lignes suivantes (sauf la ligne web-app, qui sert de repère) dans tout en bas de votre fichier web.xml.

tutoriel_struts_objis_acces_db_3.png

Vous déclarez que votre code fait référence à une source de données JNDI (DataSource JNDI) qui a pour nom JNDI « jdbc/formation ».

ajout_web_xml

Etape 3 : context.xml

 éditez le fichier context.xml de tomcat intégré à eclipse.

tutoriel_struts_objis_acces_db_16.png

 Ajoutez entre les balises Context de début et de fin du fichier le code suivant :

tutoriel_struts_objis_acces_db_4.png

REMARQUE : adapter à la configuration de votre tomcat, par exemple pour Tomcat 7 et MySQL

context

Ce code configure et met à disposition une ressource JNDI nommée jdbc/formation à de toutes les applications déployées dans tomcat et possédant les informations de connexion.

Cette ressource JNDI est une base de données (ça tombe bien pour notre appli) configurée avec un pool de connexion DBCP (celui de Tomcat). Cette technique permet d’améliorer les performances de l’application, la création / fermeture d’une connexion JDBC étant couteuse.

Partie 5 : Création du Realm

Un Realm est un dispositif servant à identifier les utilisateurs. Il permet de faire l’association login/mot de passe afin de déterminer si l’utilisateur est correctement authentifié ou non.

Pour chaque utilisateur, le Realm connait la liste des rôles associés. Les rôles sont les responsabilités attribuées à un utilisateur donné. La protection des ressources se fait par rôle, c’est-à-dire que l’on indique le rôle dont doit disposer un utilisateur pour accéder à la ressource. L’alimentation du Realm (ajout d’utilisateurs et des rôles correspondants) est à la charge du développeur.

La configuration minimale d’un Realm s’appuyant sur une DataSource est la suivante (code à placer dans le fichier context.xml, à la suite de la déclaration de la ressource Base de données):

tutoriel-securite-struts-jaas-5

REMARQUE : voir documentation serveur pour adapter à la configuration de votre tomcat, par exemple pour Tomcat 7

context_avec_realm

Partie 6 : mise en place de la protection

Définition des pages à protéger

tutoriel-struts-1-securite-jaas-8

— security-constraint

— login-config

— role-authent

Mise en place du formulaire

La mise en place du formulaire est relativement simple. Tout d’abord, bien sûr, il faut le créer. Il doit répondre à des critères au niveau des noms de champs et de l’action :

— Le champ correspondant au login doit s’appeler j_username ;

— Le champ du mot de passe doit s’appeler j_password ;

— L’action du formulaire doit être j_security_check.

login

Le formulaire résultant a donc l’aspect suivant :

tutoriel-securite-struts-jaas-6

Une fois le formulaire prêt, vous devez aussi créer une page d’erreur qui sera référencée dans le fichier de configuration.

erreur

Notez que la page de login et la page d’erreur peuvent toutes deux se trouver dans le répertoire protégé, cela ne pose pas de problème.

tutoriel-securite-struts-jaas-7

Si vous tentez désormais (après avoir relancé Tomcat) d’accéder à une des ressources protégées (ici tout éléments dans répertoire ‘admin’) sans être identifié, vous devez passer par la page de login avant d’atteindre réellement la ressource.

Partie 7 : Déploiement

 Déployez l’application

Conclusion

Dans ce tutoriel, vous avez mis en œuvre une stratégie permettant de sécuriser l’accès à votre application JEE. Cette stratégie est basée sur l’API JAAS et le savoir-faire du conteneur web d’un serveur d’applications JEE ou d’un moteur de servlets.

Config

 Les fichiers de config

config-secu-war-tomcat

securite-java-objis.jpg

Pour aller plus loin : Questions clés

 Quel équivalent Annotations de la configuration JAAS XML ?

 Comment sécuriser les méthodes d’un EJB avec JAAS ?

 Qu’est ce qu’un LoginModule ?

 Quels sont les limites de JAAS ?

 Quel lien entre JAAS et Spring Security ?

 Quel est l’impact du changement de serveur d’application (ex : Jboss au lieu de Tomcat ?)

Trouvez des réponses à ces questions et à de nombreuses autres questions lors de la formation Sécurité Java d’Objis .

2018-01-27T16:12:17+01:00

Contactez nous

241 rue DUGUESCLIN, 69003 Lyon

Web : Objis : spécialiste formation Java