© m2i GROUP – 2012
SOMMAIRE
Spring Security
RAPPELS SUR LES PROBLEMATIQUES DE SECURITE 3
LES REPONSES APPORTEES PAR SPRING SECURITY 7
SECURISATION DES URLS 11
SECURISATION DES JSP 24
SECURISATIONS DES METHODES 27
CHAINE DE FILTRES SPRING SECURITY 33
© Khalid HADDOUTI 2
© m2i GROUP – 2012
RAPPELS SUR LES PROBLÉMATIQUES DE SÉCURITÉ
Présentation (1/2)
+ Principal
Informations permettant d’identifier un utilisateur ou un système
technique réalisant un accès.
+ Authentification
Etablir si l’identité d’un profil est conforme.
+ Authorisation
Décide si une entité authentifiée à les droits nécessaires pour
effectuer une tâche précise.
+ Elément sécurisé
La ressource à sécuriser
URL
Méthode d’une classe
© Khalid HADDOUTI 4
RAPPELS SUR LES PROBLÉMATIQUES DE SÉCURITÉ
Présentation (2/2)
+ Authentification
Mécanismes d’authentifications : Basic, Digest, X500
Les technologies de stockages sont nombreuses
Base de données, LDAP, mémoire (développement).
+ Autorisation
S’appuie sur les informations données pendant la phase
d’authentification.
Une entité est associée à un ou plusieurs rôles.
Souvent, une entité est incluse au sein d’un groupe, ce dernier associé
à un rôle.
La décision est donnée en s’appuyant sur le type de rôle
ADMIN – peut accéder à la console d’administration.
MEMBER – peut poster des commentaires dans un blog.
GUEST – peut uniquement lire les articles d’un blog.
© Khalid HADDOUTI 5
RAPPELS SUR LES PROBLÉMATIQUES DE SÉCURITÉ
+ Problème sur l’authentification
Risque de contournement de l’authentification.
Chiffrement des flux.
Risque de vols de session.
+ Problèmes sur le contrôle d’accès
Accès à des données ou ressources non autorisées.
Politique de sécurité inexistante.
+ Validation sur les données saisies
Vulnérabilité de type « Cross-Site Scripting » (XSS).
Injection de code SQL.
Injection de code Javascript.
© Khalid HADDOUTI 6
© m2i GROUP – 2012
LES RÉPONSES APPORTÉES PAR SPRING SECURITY
Les caractéristiques (1/3)
+ Portable
Les serveur d’application possèdent des mécanismes de
sécurisations différents.
Une application web sécurisée est déployable sans configuration
externe.
+ Souple
Supporte un grand nombre de mécanisme d’authentification
SSO, Form, X509, Cookies, etc…
Fournit des options de stockage des données d’authentification et
d’autorisation
LDAP, SGBD, fichier de propriétés, etc…
+ Extensible
Comment les « Principal » est défini.
Comment les autorisations sont délivrées.
© Khalid HADDOUTI 8
LES RÉPONSES APPORTÉES PAR SPRING SECURITY
Les caractéristiques (2/3)
+ Les aspects sur la sécurité sont découplés du code métier
Utilisation de la technologie AOP et des filtres Servlets
+ Les phases d’authentification et d’autorisation sont deux
processus distincts
Modifier la méthode d’authentification n’a pas d’impact sur la
procédure d’autorisation.
+ Spring Security offre un niveau d’abstraction vis-à-vis des
mécanismes sous jacents de sécurité
Création d’un contexte de sécurité (Security Context) après
authentification.
Procédure d’autorisation unique
Consulter les attributs de la ressource sécurisée.
Récupérer les informations du contexte.
Accepter/Refuser l’accès à la ressource demandée.
© Khalid HADDOUTI 9
LES RÉPONSES APPORTÉES PAR SPRING SECURITY
Les caractéristiques (3/3)
+ Le schéma d’ensemble
© Khalid HADDOUTI 10
© m2i GROUP – 2012
SÉCURISATION DES URLS
L’espace de nom « security »
+ Déclarer dans le fichier XML le namespace « security »
<beans xmlns="[Link]
xmlns:xsi="[Link]
xmlns:p="[Link]
xmlns:security="[Link]
xmlns:context="[Link]
xmlns:mvc="[Link]
xsi:schemaLocation="[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
© Khalid HADDOUTI 12
SÉCURISATION DES URLS
Configuration web
+ Configuration du seul filtre Servlet Spring dans
« [Link] »
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>[Link]</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Le nom « springSecurityFilterChain » est obligatoire.
Fait référence à un bean Spring existant.
+ Chargement du contexte Spring dans « [Link] »
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/[Link], classpath:/[Link]
</param-value>
</context-param>
© Khalid HADDOUTI 13
SÉCURISATION DES URLS
Protection d’une URL
+ Configuration pour intercepter une URL
<security:http auto-config="true">
<security:intercept-url pattern="/home/*" access="ROLE_IS_AUTHENTICATED"/>
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="robert" password="azerty" authorities="ROLE_IS_AUTHENTICATED"/>
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
L’attribut « auto-config=true » créé automatiquement :
Un formulaire d’authentification.
Des services d’authentification de type Basic.
Une URL de déconnexion (par défaut « /j_spring_security_logout »).
© Khalid HADDOUTI 14
SÉCURISATION DES URLS
Protection de plusieurs URL
+ L’évaluation des patterns d’URL est effectué dans l’ordre
de déclaration
<security:http auto-config="true" path-type="regex">
<security:intercept-url pattern="/compte/edit" access="ADMIN"/>
<security:intercept-url pattern="/compte/monCompte" access="USER"/>
<security:intercept-url pattern="/compte/*" access="IS_AUTHENTICATED_FULLY"/>
</security:http>
Les règles les plus spécifiques sont déclarées en premier.
Les règles les plus globales en dernier.
© Khalid HADDOUTI 15
SÉCURISATION DES URLS
Configuration par SpEL (1/3)
+ Le langage SpEL permet la définition de règles plus
complexes
<security:http auto-config="true" use-expressions="true">
[…]
</security:http>
Activer le support SpEL par l’attribut « use-expressions ».
+ Exemples
<security:intercept-url pattern="/home/" access="hasRole('ADMIN')"/>
Vérifie que le « Principal » possède le rôle « ADMIN ».
<security:intercept-url pattern="/home/" access="hasAnyRole('ROLE1',’ROLE2’,…)"/>
Vérifie que le « Principal » possède au moins un des rôles.
<security:intercept-url pattern="/home/" access="isAnonymous()"/>
Accès autorisé pour les utilisateurs non authentifiés.
<security:intercept-url pattern="/home/" access="isAuthenticated()"/>
Accès autorisé aux utilisateurs authentifiés.
© Khalid HADDOUTI 16
SÉCURISATION DES URLS
Configuration par SpEL (2/3)
+ SpEL permet de combiner plusieurs expressions par des
opérateurs logiques
<security:intercept-url pattern="/home/"
access="isAuthenticated() and hasIpAdsress('[Link]')"/>
ET logique
+ Il n’est pas possible de mélanger la syntaxe avec SpEL et
sans SpEL
<security:intercept-url pattern="/home/edit" access="hasRole('ADMIN')"/>
<security:intercept-url pattern="/home/moncompte" access="USER"/>
Ce formalisme est interdit.
© Khalid HADDOUTI 17
SÉCURISATION DES URLS
Configuration par SpEL (3/3)
+ Synthèse des expressions Spring Security
Expression Description
hasRole([role]) Renvoi « true » si le « Principal » possède le rôle indiqué
hasAnyRole([role1,role2]) Renvoi « true » si le principal possède au moins un des rôles indiqués.
principal Accès direct à l’objet « Principal » associé au profil en court.
authentication Accès direct à l’objet « Authentification » extrait du contexte
(« SecurityContext »).
permitAll Evalué systématiquement à « true »
denyAll Evalué systématiquement à « false »
isAnonymous() Renvoi « true » si le « Principal » est de type anonyme.
isRememberMe() Renvoi « true » si le « Principal » est de type « Remember-me ».
isAuthenticated() Renvoi « true » si l’utilisateur est authentifié.
isFullyAuthenticated() Renvoi « true » si l’utilisateur n’est pas de type anonyme ni « remember-me ».
© Khalid HADDOUTI 18
SÉCURISATION DES URLS
Personnalisation de la page d’authentification
+ Configuration du contexte
<security:http auto-config="true" use-expressions="false">
<security:form-login login-processing-url="/j_spring_security_check "
login-page="/login"
authentication-failure-url="/login?login_error=t" />
</security:http>
+ Formulaire d’authentification
<form action="<c:out value='/j_spring_security_check'/>" method="post">
<input type="text" name="j_username">
<br/>
<input type="text" name="j_password">
<br/>
<input type="submit" name="submit" value="LOGIN"/>
</form>
Les noms des champs sont ceux attendus par Spring Security.
Les noms sont reconfigurables.
© Khalid HADDOUTI 19
SÉCURISATION DES URLS
Configuration de l’authentification (1/4)
+ Spring Security propose un certain nombre
d’implémentations
In-Memory – les informations sont chargées depuis un fichier de
propriétés et conservées en mémoire.
JDBC – lecture des données depuis une base de données.
LDAP – bind/recherche sur un serveur d’annuaire.
CAS (Central Authentication System) – Application SSO.
© Khalid HADDOUTI 20
SÉCURISATION DES URLS
Configuration de l’authentification (2/4)
+ Authentification à partir de données contenus dans un
fichier de propriétés (In-memory provider)
<security:http>…</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:password-encoder hash="md5"/>
<security:user-service properties="/WEB-INF/[Link]"/>
</security:authentication-provider>
</security:authentication-manager>
+ Le fichier de propriété
admin=secret,ROLE_ADMIN,ROLE_MEMBER
guest=guest,ROLE_GUEST,ROLE_MEMBER
+ Adapté pour l’environnement de développement et de test
© Khalid HADDOUTI 21
SÉCURISATION DES URLS
Configuration de l’authentification (3/4)
+ Authentification auprès d’une base de données via JDBC
<security:http>…</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:jdbc-user-service data-source-ref="jdbcDatasource"/>
</security:authentication-provider>
</security:authentication-manager>
<bean id="jdbcDatasource" class="[Link]">
<property name="driverClassName" value="[Link]" />
<property name="url" value="jdbc:mysql://localhost:3306/secure" />
</bean>
Spring Security s’appuie sur Spring JDBC pour réaliser les
connexions.
La datasource peut être obtenue depuis un lookup JNDI.
© Khalid HADDOUTI 22
SÉCURISATION DES URLS
Configuration de l’authentification (4/4)
+ Personnalisation des requêtes JDBC
<security:authentication-manager>
<security:authentication-provider>
<security:jdbc-user-service data-source-ref="jdbcDatasource"
users-by-username-query="select username, password, true from m2i where username=?"/>
</security:authentication-provider>
</security:authentication-manager>
authorities-by-username-query – rôles associés à
l’utilisateur.
group-authorities-by-username-query – groupes dont fait partie
l’utilisateur.
© Khalid HADDOUTI 23
© m2i GROUP – 2012
SÉCURISATION DES JSP
La librairie de Tag Spring Security (1/2)
+ Spring Security propose sa libraire de tag
Accès aux données relatives à la sécurité.
Appliquer des contraintes de sécurité sur certaines parties de la
JSP.
+ Déclaration de la libraire de tag
<%@ taglib prefix="sec" uri="[Link] %>
+ Afficher les données de l’instance « Authentification »
<sec:authentication property="[Link]"/>
+ Récupération des données depuis Java
Authentication auth = [Link]().getAuthentication();
Respecter le principe MVC.
Ajouter les données dans le modèle.
© Khalid HADDOUTI 25
SÉCURISATION DES JSP
La librairie de Tag Spring Security (2/2)
+ Masquer une partie du code JSP en fonction du rôle
<sec:authorize access="hasRole('ROLE_MANAGER')">
...Informations confidentielles...
Cliquer <a href="/admin/deleteAll">ici</a> pour supprimer tous les profils.
</sec:authorize>
+ Gérer les autorisations par « intercept-url »
<sec:authorize url="/admin/deleteAll">
...Informations confidentielles...
Cliquer <a href="/admin/deleteAll">ici</a> pour supprimer tous les profils.
</sec:authorize>
<security:http>
<security:intercept-url pattern="/admin/*"
access="hasAnyRole('ROLE_MANAGER', 'ROLE_ADMIN')"/>
</security:http>
© Khalid HADDOUTI 26
© m2i GROUP – 2012
SÉCURISATION DES MÉTHODES
Présentation
+ Spring Security s’appui sur l’AOP pour sécuriser les
méthodes des classes
Configuration XML utilisant l’espace de nom de Spring Security
Par annotations utilisant ceux fournies par Spring Security ou par
la JSR-250
+ « global-method-security » active la sécurité sur
l’ensemble des beans du context Spring
Valable pour les annotations et pour la déclaration XML
© Khalid HADDOUTI 28
SÉCURISATION DES MÉTHODES
Par XML
+ « protect-pointcut » sécurise l’appel de plusieurs
méthodes
<security:global-method-security>
<security:protect-pointcut expression="(* com.m2i..*Service.*(..))"
access="ADMIN"/>
</security:global-method-security>
Une seule déclaration pour protéger un ensemble de méthodes
© Khalid HADDOUTI 29
SÉCURISATION DES MÉTHODES
Par annotations Spring Security
+ Activer la sécurité par les annotations
<security:global-method-security secured-annotations="enabled"/>
Active les annotations Spring Security
+ « @Secured » applique la sécurité sur les méthodes
public interface IPersonService {
@Secured("IS_AUTHENTICATED")
public Person getPersonByLastName(String lastName);
@Secured("ADMIN")
public List<Person> getAllPersons();
L’instance « AccessDecisionManager » est responsable de la
prise de décision.
© Khalid HADDOUTI 30
SÉCURISATION DES MÉTHODES
Par annotations JSR-250
+ Activer la sécurité par les annotations JSR-250
<security:global-method-security jsr250-annotations="enabled"/>
+ « @RolesAllowed » pour annoter les méthodes à
sécuriser
public interface IPersonService {
@RolesAllowed("IS_AUTHENTICATED")
public Person getPersonByLastName(String lastName);
@RolesAllowed("ADMIN")
public List<Person> getAllPersons();
© Khalid HADDOUTI 31
SÉCURISATION DES MÉTHODES
Method Security Expressions
+ Spring Security 3.0 fournit de nouvelles annotations
acceptant des expressions
<security:global-method-security pre-post-annotations="enabled"/>
Activation des annotations Spring Security
« @PreAuthorize » et « @PostAuthorize ».
« @PreFilter » et « @PostFilter ».
+ Autoriser l’exécution d’une méthode dont le nom du
contact est identique à celui de l’utilisateur
@PreAuthorize("#[Link] == [Link]")
public void edit(Contact contact);
© Khalid HADDOUTI 32
© m2i GROUP – 2012
CHAINE DE FILTRES DE SPRING SECURITY
Présentation (1/2)
+ La chaine de filtre Spring est déclaré dans « [Link] »
Le nom « springSecurityFilterChain » est prédéfini.
+ « springSecurityFilterChain » délègue les tâches à une
chaine de filtres beans Spring
Module d’authentification
Gestionnaire d’autorisation.
Gestion de la déconnexion.
Maintient de « SecurityContext » dans la session http.
© Khalid HADDOUTI 34
CHAINE DE FILTRES DE SPRING SECURITY
Présentation (2/2)
+ Schéma de principe
© Khalid HADDOUTI 35
CHAINE DE FILTRES DE SPRING SECURITY
Cas d’utilisation (1/2)
+ Phase d’authentification
© Khalid HADDOUTI 36
CHAINE DE FILTRES DE SPRING SECURITY
Cas d’utilisation (2/2)
+ Accès à une ressource sans les autorisations nécessaires
© Khalid HADDOUTI 37
CHAINE DE FILTRES DE SPRING SECURITY
Modification de la chaine
+ Un des filtres de la chaine peut être remplacé par un filtre
spécifique
<security:http>
<security:custom-filter ref="monFiltre" position="FORM_LOGIN_FILTER"/>
</security:http>
<bean id="monFiltre" class="[Link]"/>
+ Un filtre peut être ajouté dans la chaine
<security:http>
<security:custom-filter ref="monFiltre" after="FORM_LOGIN_FILTER"/>
</security:http>
<bean id="monFiltre" class="[Link]"/>
L’attribut « before » ajoute un filtre avant celui indiqué.
© Khalid HADDOUTI 38
CHAINE DE FILTRES DE SPRING SECURITY
Remarques
+ La modification de la chaine n’est pas nécessaire à moins
de vouloir changer le comportement de Spring Security
Attention aux conséquences en termes de sécurité.
Une grande complexité provoque des failles.
+ Dans un cadre d’utilisation avec d’autres frameworks
basés également sur des filtres, placer ceux de Spring
Security en premier
© Khalid HADDOUTI 39
SPRING SECURITY
Travaux Pratiques
+ Exercice 1
Protéger une application Web.
© Khalid HADDOUTI 40
SPRING SECURITY
© Khalid HADDOUTI
© m2i GROUP – 2012