mercredi 29 février 2012

Spring Security

Les actes malveillants ciblant les systèmes d'information ne cesse de croître et la sécurité est désormais la fonctionnalité transversale à mettre en place en priorité pour toute application.

Spring Security offre une architecture très satisfaisante pour la mise en place d'une politique de sécurité, son atout premier étant sa portabilité.
L'authentification (par Base de données, Ldap, Jaas ou autre) ainsi que la récupération des autorisations de l'utilisateur se font de manière déclarative et donc de manière aisée et très intuitive.

La sécurité s'effectue alors à différents niveaux de l'application et surtout de manière non-intrusive.
  • Au niveau des Urls pour les applications WEB.
  • Au niveau des appels de méthodes
  • Au niveau des beans etc...

D'autres avantages très intéressants sont offerts par Spring:

  • L'authentification automatique par cookie
  • La vérification d'une connexion unique
  • Une authentification unique pour une ensemble d'application (single Sign-On) etc...


Spring Security plus en détail :

·        Installation
o   Les librairies : Core, CoreTiger, Taglis, ACL
o   Filtre de servlet DelegatingFiterProxy qui redirige l’ensemble des servlets vers Spring Security (En interne ce filtre délègue les requêtes à un springSecurityFilterChain) (web.xml)
o   Chargement d’un context Spring par un ContextLoaderListener (web.xml)

·        Configuration de base
o   Utilisation du schéma XML de SpringSecurity

·        Gestion de l’authentification
o   Spring Securiry utilise un context de sécurité positionné lors de l’authentification de l’utilisateur. Ce context contient l’utilisateur et les rôles qui  lui sont attribués.
o   Spring Security positionne un ProviderManager (implémentation de AuthenticationManager)
o   Le ProviderManager utilise une liste de composants AuthenticationProvider qui gèrent la vérification de l’identité de l’utilisateur. Avec les balises <auhentication-provider  /> ou <ldap-authentication-provider  />
Liste des implémentation AuthenticationProvider fourni par Spring (composant ajouté par configuration xml) :
·         LdapAuthenticationProvider (authentification par binding ou par comparaison de mot de passe)
·         JaasAuthenticationProvider (Authentification au moyen d’un fichier de config Jaas)
·         CasAuthenticationProvider (Central Authentication Server : solution Single Sign On)
·         DaoAuthenticationProvider

o   Le s composants AuthenticationProvider délèguent généralement la récupération des informations de l’utilisateur à un UserDetailsService. Avec la balise <user-service /> ou <jdbc-user-service />
Implémentation de UserDetailsService :
§  InMemoryDaoImpl
§  JdbcDaoImpl
§  LdapUserDetailsService
o   Authentification avec Hachage des mots de passe avec la balise <password-encoder hash=’sha’/> + utilisation d’un grain de sel (ajout d’une chaine au mot de passe avant lehachage) pour éviter les attaques par dictionnaire avec la balise <salt-source. Grain de sel fixe (propriété system-wide de salt-source) ou variable (récupérée du compte de l’utilisateur par exemple : propriété user-property de salt-source) ou itération de plusieurs hachage avec Jasypt qui propose une implémentation de PasswordEncoder.
o    
·        Sécurité d’une application Web
o   Interception des Urls avec la balise <intercept-url pattern=’’ access= ‘’ requires-chanel=’https’/>
o   Récupération du context de sécurité : SecurityContextHolder.getContext().getAuthentication().
o   Authentification avec formulaire <form-login  /> <form-logout />
o   Authentification automatique pour une période de temps (par cookie ou base de données) avec la balise <remember-me  />. Présence d’un UserDetailsService dans la config SpringSecurity nécessaire :
§  Système de cookie simple
§  Système de cookie avec jeton persistant (nouveau cookie à chaque connexion).
o   Connexion anonyme : avec la balise <http><anonyous />
o   Limitation des connexions simultanées : avec la balise <http><concurrent-session-control max-session=’1’ />


·        Sécurisation de l’invocation des méthodes
o   Sécurisation avec les annotations @RolesAllowed et @Secured
§  Activation de l’annotation @RolesAllowed par <globa-method-security jsr250-annotations=’enabled’/>
§  Activation de l’annotation @Secured par <globa-method-security secured-annotations=’enabled’/>
o   Sécuriser une ensemble de beans avec par définition de coupes utilisant la synthaxe AspectJ avec la balise <global-method-security><protect-pointcut expression= ‘’ access=’’ />.
o   Sécuriser un bean avec la balise <beans><bean><intercept-methods><protect method=’’ access=’’ />


·        Le système de décision d’autorisation


·        Sécurisation des vues