0% ont trouvé ce document utile (0 vote)
41 vues41 pages

13 - Spring Security

Transféré par

Ilyas
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
41 vues41 pages

13 - Spring Security

Transféré par

Ilyas
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

© 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

Vous aimerez peut-être aussi