06 spring security.docx

15
Capítulo 6: Spring Security Cómo hacer de nuestra aplicación un lugar seguro Este capítulo se centrará en la seguridad y cómo Spring a través de su proyecto Spring Security se hace cargo de ella. Javier Sevilla Sánchez Trabajo de fin de carrera de la Ingeniería Técnica en Informática de Gestión (I.T.I.G)

Upload: chato-montero

Post on 16-Dec-2015

248 views

Category:

Documents


1 download

TRANSCRIPT

Captulo 6: Spring Security

Captulo 6: Spring SecurityCmo hacer de nuestra aplicacin un lugar seguro

Este captulo se centrar en la seguridad y cmo Spring a travs de su proyecto Spring Security se hace cargo de ella.

Javier Sevilla SnchezTrabajo de fin de carrera de la Ingeniera Tcnica en Informtica de Gestin (I.T.I.G)

ContenidoQu es Spring Security?4Autenticacin en Spring Security4AuthenticationManager5Seguridad en aplicaciones Web7Autorizacin en Spring Security10Seguridad de la capa de servicio12Configuracin de seguridad a nivel global (namespace)12Seguridad a nivel de bean12Con el objeto MethodSecurityInterceptor12Seguridad a nivel de anotacin13

Qu es Spring Security?

Spring Security se ha convertido en la librera de referencia dentro del mundo Java, para dar soporte a los servicios de autenticacin y autorizacin de una aplicacin. Esto se debe principalmente a que es un proyecto proyecto enmarcado dentro de Spring y como ya hemos visto gracias a Spring podremos hacer cdigo mantenible, reutilizable, gil y robusto. El cdigo y diseo del componente es inmejorable, es sabido que dentro de la comunidad de desarrolladores Java tiene un gran uso siendo un referente. Spring Security es un framework maduro que viene de otro proyecto llamado Acegi. Como la mayora del framework de Spring, Spring Security ofrece una gran facilidad de configuracin y parametrizacin, gracias al uso de mamespace y la inyeccin de dependencia. Permite la integracin con los sistemas legacy de autenticacin ms importantes del mercado: BBDD, LDAP, CAS (para single sign-on), gestin de certificados, etc. Spring Security tiene un gran respaldo de la comunidad con lo que hay una gran cantidad de documentacin y ejemplos.Autenticacin en Spring Security

Un proceso de autenticacin consiste en identificar la entidad que realiza una accin sobre la aplicacin y garantizar que es quin dice ser. La entidad que realiza una accin sobre la aplicacin es conocida como principal, en Spring es llamada AuthenticationManager, encargado de implementar el proceso de autenticacin en las aplicaciones.Antes de describir cmo es el diseo de AutenticationManager, vamos a presentar otros componentes importantes y necesarios para poder comprender el proceso de autenticacin.

Authenticacion, este objeto guardar los datos asociados a AutenticationManager y sus roles. As este objeto es en el que sea apoya el AuthenticationManager para implementar el servicio de autenticacin.SecurityContextHolder, encargado de guardar los datos del principal y sus roles dentro del contexto de seguridad. Como hemos dicho, la informacin del principal la alberga Authentication, as que SecurityContextHolder guarda el objeto Authentication en el contexto de seguridad. As la informacin que reside en el objeto Authentication pueda ser consultada en todo momento por cualquier componente dentro de la aplicacin.Objeto UserDetailsService, Spring suele delegar responsabilidades en otros objetos, en este caso el objeto AuthenticationManger delega en el objeto UserDetails las labores de obtencin de la informacin del usuario sobre el repositorio de seguridad. As, si los usuarios estn en una base de datos, el objeto UserDetails realizar las consultas necesarias para obtener la informacin del AuthenticationManager.AuthenticationManager

Este interfaz slo define un mtodo:Authentication authenticate (Authentication authenticaction) throws AuthenticationException;El parmetro de entrada tendr los datos bsicos de autenticacin. Con este dato se prodecer a obtener toda la informacin de credenciales asociadas con el principal y se comprobar si dichas credenciales son correctas. En el caso de que las credenciales no sean correctas el proceso de autenticacin lanzar una AuthenticationException. Si la autenticacin es correcta se obtendrn las autoridades asociadas al usuario y sern guardadas en el objeto Authentication, el cual ser devuelto por el mtodo. ste objeto ser guardado por el componente SecurityContextHolder en el contexto de seguridad.Como hemos dicho, AuthenticationManager delega responsabilidades, teniendo un conjunto de componentes ProviderManager los cuales son los encargados de implementar el proceso de autenticacin. Los objetos ProviderManer estn ms cercanos a la tecnologa usada para impementar el repositorio de seguridad de la aplicacin. As si disponemos de un LDAP, tendremos el objetoLdapAuthenticationProvider, si accedemos a una base de datos tendremos un DaoAuthenticationProvider, etc, etc.

En el siguiente diagrama se muestra la colaboracin entre componentes para implementar el proceso de autenticacin de la aplicacin, en este caso se muestra para un delegado que buscar en una base de datos gracias al DaoAuthenticationProvider.

Spring tiene un gran nmero de Providers as, podremos dar soporte a multitud de sistemas. As podremos adaptar nuestras aplicaciones a distintas particularidades, presentes y futuras.Una de las grandes ventajas que tiene Spring Security es la inclusin de namespace especficos que da sopote a la configuracin de los distintos componentes que forman parte de la solucin de autenticacin y autorizacin de aplicaciones. Antes, era necesario definir un conjunto de beans muy extenso y exista la posibilidad de error en la gestin de las dependencias de los distintos beans. Gracias a la incorporacin de namespace, al desarrollar se abstrae de muchas particularidades internas de la solucin, proporcionando un fichero XML de configuracin ms sencillo.--TODO--- CODIGO NAMESPACE

---FIN TODO----Como vemos en el ejemplo el nico parmetro de configuracin necesario es el gestor de autenticacin donde est el esquema de base de datos donde reside el repositorio de seguridad.

Este fichero permitir la configuracin de todos los elementos necesarios para realizar la autenticacin y autorizacin de una aplicacin web sobre HTTP.

Seguridad en aplicaciones Web

Lo primero es definir es el ServletFilter DelegatingFilterProxy. Este filtro lo que hace es un proxy entre los Servlets y el contexto de Spring. As, este filtro permite que todos los componentes que forman parte de la arquitectura de Spring Security puedan ser definidos mediante los ficheros XML.Spring Security, como ya hemos dicho, se puede configurar mediante el uso de namespace, que es un fichero XML que cumple un determinado esquema, facilitando la configuracin.Dentro del fichero de configuracin incluiremos el siguiente cdigo:---TODO----

---FIN TODO----

Dentro de la configuracin se puede ver como se pueden securizar URL. La etiqueta contiene el patrn de URL que se quiere securizar y una lista de roles que son necesarios para poder acceder al recurso, en el caso que se indiquen varios roles, con que se tenga uno de los roles ser suficiente para disponer de permiso para dicha URL.Dentro de este fichero de configuracin se puede configurar las siguientes grandes funcionalidades:Remember-me, as el usuarios puede guardar las credenciales en el navegador y as no tener que volver a introducirlas en el siguiente proceso de autenticacin. Usa un soporte de cookies con aplicacin de algoritmos hash para guardar la informacin.Seleccin de canal de seguridad, si usamos el atributo requires-channel dentro de la etiqueta, se puede exigir que determinadas URL sean seguras dentro de la aplicacin. Spring Security hace las oportunas redirecciones que sean necesarias para el cambio de canal.Gestin de la sesin, control de timeouts de sesin, y control de la sesin concurrente. El control de los timeouts de sesin sirve para indicar cuando esta invalidada. El control de sesin concurrente es para controlar el nmero de sesiones que estn activas para un mismo usuario. Esto supone una proteccin contra el ataque de fijacin de sesin. ---TODO--- http://en.wikipedia.org/wiki/Session_fixation ---END TODO---Soporte para OpenId. ---TODO BUSCAR OPENID---Spring Security mantiene una cadena de filtros que cada uno de ellos da cabida a una funcionalidad dentro de los procesos de autenticacin y autorizacin entre cada peticin y respuesta. Es posible modificar la cadena de filtros.Dentro de estos filtros destacan:FilterSecurityInterceeptor, el cual es encargado de manejar la seguridad de los recursos HTTP manejando los elementos definidos en el namespace.ExceptionTranslationFilter, encargado de manejar excepciones lanzadas por los interceptores de seguridad y proveer la respuesta HTTP correspondiente.SecurityContextPersistenceFilter, responsable de guardar el contexto de seguridad entre peticiones. Bsicamente el contexto de seguridad es guardado a nivel de sesin.

Como vemos en la figura, existen numerosos interceptores en la cadena. Toda la cadena de filtros es creada y aislada del programador mediante el uso de namespace. Sin embargo, es posible modificar y extender la cadena de filtros.

Autorizacin en Spring Security

El siguiente diagrama de clases define la arquitectura del mdulo de autorizacin en Spring Security:

En el centro del diagrama tenemos la clase abstracta AbstractSecurityInterceptor, sta representa las capacidades de autorizacin bsicas. Se pueden securizar peticiones HTTP gracias a FilterSecurityInterceptor e invocaciones a mtodos gracias a MethodSecurityInterceptor y AspectJSecurityInterceptor.Este interceptor delega en el interfaz AccesDecisionManager la decisin de la autorizacin final. Este interfaz implementa un mtodo decide que bsicamente lo que hace es recibir un objeto Authentication representando al principal que accede a la peticin, un objeto seguro (url o mtodo) y una lista de aributos con metadatos de seguridad (la lista de roles para los que se les puede dar acceso).El siguiente diseo es el definido para el componente AccesDecisionManager:

El diagrama representa el sistema de autorizacin de Spring Security. Este sistema est basado en un sistema de votos. Spring Security tiene tres implementaciones de AccessDecissionManager:AffirmativeBased, en el caso de recibir un nico voto positivo, se le da acceso al recurso. Se permite controlar el comportamiento en el caso que todos los votos son de abstencin.ConsensusBased, en este caso ser necesario que haya ms votos positivos que negativos para dar acceso al recurso protegido. Tambin se puede controlar el comportamiento si todos los votos son abstencin.UnanimousBased, en este caso ser necesario que todos los votos sean positivos para dar acceso al recurso. Se permite controlar el comportamiento en el caso que todos los votos son de abstencin.Los objetos AccessDecissionManager hacen uso de AccessDecissionVoter, actualmente Spring proporciona dos clases de este objeto:RoleVoter, comprueba cada rol que protege el recurso comprobndolo con el principal que realiza la peticin. Si se tiene uno de los roles devolver un AffirmativeBased AccessDecissionManger, as con uno bastar para dar acceso.AuthenticatedVoter, Este componente permite diferenciar entre acceso annimo, completamente autenticado o autenticado mediante remember-me. As podr acceder a pginas que necesitan tener un comportamiento diferente para usuarios autenticados de los que no.Todos los componentes del mdulo de autorizacin de Spring Security permiten ser extendidos para proveer mecanismos de autorizacin especficos o ms profundos.Seguridad de la capa de servicio

Spring Security permite securizar invocaciones a mtodos, comnmente llamado seguridad a nivel de capa de servicio. Esto permitir que tengamos mecanismos de autorizacin de invocaciones de componentes de la capa de servicio aportando mayor seguridad.Spring otorga cuatro configuraciones para la seguridad en la capa de servicio, configuracin a nivel global mediante namespace, mediante el componente MethdoSecurityInterceptor, basada en anotaciones o a nivel de bean.

En Spring podemos observar cuatro maneras de securizar las ejecuciones de mtodos dentro de Spring Security, Configuracin de seguridad a nivel global usando namespace, a nivel de bean, usando el componente MethodSecurityInterceptor y basada en anotaciones.

Configuracin de seguridad a nivel global (namespace)

Spring Security permite una configuracin de seguridad a nivel global, esta opcin es una securizacin centralizada de todos los mtodos de la capa de servicio. Adicionalmente, presenta una expresin AspectJ de definicin del pointcut, el cual permite aplicar de manera flexible seguridad a varios objetos. En el ejemplo expuesto se estn securizando todos los mtodos del paquete ---TODO--- com.mycompany ---END TODO--- que acaben por service e independientemente del nmero de parmetros que tenga el mtodo.

Seguridad a nivel de bean

Con el objeto MethodSecurityInterceptor

Seguridad a nivel de anotacin