UNIDAD 10: Seguridad en Spring
eugeniaperez.es
eugeniaperez.es
10.1 Principales vulnerabilidades
Las aplicaciones Web presentan vulnerabilidades inherentes a su arquitectura independientemente de la tecnología con las que estén construidas.
OWASP es una organización que periódicamente publica un documento de las 10 mayores vulnerabilidades o las que son más explotadas por los posibles atacantes.
Ver: http://es.wikipedia.org/wiki/OWASP_Top_10
eugeniaperez.es
10.1 Principales vulnerabilidades
La última publicación data de 2013:
Ver más en: https://www.owasp.org/images/5/5f/OWASP_Top_10_-_2013_Final_-_Espa%C3%B1ol.pdf
eugeniaperez.es
10.2 Prevención de ataques
SQL Injection: toda aplicación que realice consultas SQL a una BD puede ser susceptible a este tipo de ataques y debe ser revisada.
¡¡Las consultas deben ir siempre parametrizadas o construidas a partir de una API, y nunca mediante concatenaciones de texto!!
eugeniaperez.es
10.2 Prevención de ataques
Text
String query = "SELECT login, password FROM User WHERE login =" + user.login + "
AND password =" + user.password;
SELECT login, password FROM User WHERE login = 'eugenia' AND password = 'test';
SELECT login, password FROM User WHERE login = 'eugenia' AND password = 'test' OR 1=1;
eugeniaperez.es
10.2 Prevención de ataques
Con esto, la consulta devolvería todos los resultados de la tabla User porque esta condición siempre es cierta, ¡¡con lo que ese posible atacante tendría acceso a los datos de todos los usuarios de nuestra aplicación!!
La manera de evitar esto es utilizar PreparedStatements si estamos usando JDBC con paso de parámetros...
query.setParameter(...)
eugeniaperez.es
10.2 Prevención de ataques
Autenticación:
Spring nos permite proteger las partes que queramos en nuestra app.
Para ello utilizaremos el filtro en el web.xml:
springSecurityFilterChain
A continuación se configuran las restricciones en el application-config o root-context, al estilo de las ACLs.
eugeniaperez.es
10.2 Prevención de ataques
Autenticación:
Se incluyen los tags (normalmente ya establecido por defecto):
Y una serie de reglas basadas en la URL que permiten o deniegan el acceso a usuarios (estilo ACL...)
Algo muy útil del Fw es que te genera automáticamente la pantalla de login, logout y remember-me...
xmlns:security="http://www.springframework.org/schema/security"
Busca la primera coincidencia
eugeniaperez.es
10.2 Prevención de ataques
Autenticación:
Recuerda incluir las dependencias de seguridad necesarias:
eugeniaperez.es
10.2 Prevención de ataques
Autenticación:
La validación se puede realizar mediante usuarios/roles en XML o bien mediante jdbc, indicando un Datasource y las queries de validación:
eugeniaperez.es
10.2 Prevención de ataques
Autenticación:
Cuando utilices jdbc, recuerda crear las tablas adecuadas para las queries de validación:
eugeniaperez.es
10.2 Prevención de ataques
Autenticación:
Aspectos de mejora
eugeniaperez.es
10.2 Prevención de ataques
Autenticación:
Para la personalización de login:
Permitimos la acción de login a los usuarios:
<security:form-login login-page="/mycustomlogin"
default-target-url="/home" authentication-failure-url="/mycustomlogin?error"
username-parameter="username" password-parameter="password" />
<security:logout logout-success-url="/mycustomlogin?logout" />
<security:intercept-url pattern="/mycustomlogin" access="permitAll" />
eugeniaperez.es
10.2 Prevención de ataques
Autenticación:
Creamos la página personalizada con el formulario de login.
Incluimos la acción específica de login en el controlador:
@RequestMapping(value = "/mycustomlogin", method = RequestMethod.GET)
public String customLogin (Locale locale, Model model) {
logger.info("Showing login The client locale is {}.", locale);
return "customLogin";
}
eugeniaperez.es
10.2 Prevención de ataques
Autenticación:
También podemos personalizar otras páginas, como la de acceso denegado (Error 403):
Y finlmente crea la página de error (en /resources/403.html)
<error-page>
<error-code>403</error-code>
<location>/resources/403.html</location>
</error-page>
Añade estas líneas en el
web.xml
eugeniaperez.es
10.2 Prevención de ataques
A tener en cuenta, en general con Spring...
Introducir seguridad en nuestra aplicaciones es muy simple, pero no te exime de que, sobre todo cuando las aplicaciones se van complicando, usan el MVC y otras tantas librerías/frameworks, se solapen unas con otras...
Intenta usar la consola y la depuración en la medida de lo posible, y fíjate en la primera de las stack trace que se genera cuando salta una excepción.
Errores poco descriptivos
Solapamiento de dependencias
eugeniaperez.es
10.2 Prevención de ataques
Descarga el proyecto springmvc.security del repositorio de Bitbucket:
Usuario:
Psswd:
URL: https://eugenia_perez@bitbucket.org/eugenia_perez/springmvc.security.git