10 prácticas recomendadas de seguridad para Spring Boot
Matt Raible
16 de agosto de 2018
0 minutos de lectura¿Trabajas con Spring Boot y no sabes por dónde empezar con la seguridad? ¡Ya no tienes que preocuparte! Esta guía propone prácticas recomendadas para que los desarrolladores y encargados del mantenimiento mejoren la seguridad de Spring Boot.
Spring Boot es uno de los frameworks más utilizados en el ecosistema de Java porque simplifica enormemente el desarrollo de aplicaciones Spring. Por eso, sería conveniente que intentaras mejorar la postura de seguridad general de tus aplicaciones Spring Boot. Y estamos aquí para ayudarte a lograrlo.
Esta publicación se escribió originalmente en formato de artículo de blog y con más detalle junto con Matt Raible, Java Champion y Developer Advocate en Okta. Ambos trabajamos en empresas del sector de la seguridad, nos encanta Java y queremos ayudar a los desarrolladores a crear aplicaciones más seguras. Así que, ¿qué mejor que crear una guía atractiva sobre seguridad en Spring Boot?
Sin más preámbulos, pasemos a nuestra lista de prácticas recomendadas de seguridad para Spring Boot. Ten en cuenta que la publicación original, con más detalles, está disponible en el blog de Okta.
¿Qué es la seguridad de Spring Boot?
La seguridad de Spring Boot puede significar distintas cosas. En general, consiste en agregar el framework Spring Security a tu aplicación web Spring Boot mediante la dependencia de inicio de seguridad de Spring Boot. Spring Security es un framework de autenticación y control de acceso que se puede incluir fácilmente en una aplicación Spring Boot. Por otro lado, la seguridad de Spring Boot abarca más que solo incluir el framework Spring Security. Esta guía se centra en el tema más amplio de la seguridad de Spring Boot y en cómo proteger tu aplicación creada con Spring Boot.
Prácticas recomendadas de seguridad para Spring Boot
La siguiente lista seleccionada va más allá de presentar Spring Security para la autenticación y autorización en tu aplicación Spring Boot. Se centra en una estrategia de seguridad más amplia para Spring Boot y abarca los siguientes temas:
Usa HTTPS en producción
Prueba tus dependencias y encuentra vulnerabilidades de Spring Boot
Activa la protección CSRF
Usa una política de seguridad de contenido para proteger Spring Boot contra XSS
Usa OpenID Connect para la autenticación
Usa hash para las contraseñas
Usa las versiones más recientes
Almacena los secretos de forma segura
Realiza pruebas de penetración en tu aplicación
Pídele a tu equipo de seguridad que revise el código
1. Usa HTTPS en producción
Antes, los certificados TLS/SSL eran costosos y se consideraba que HTTPS era lento. Las máquinas se han vuelto mucho más rápidas, lo que resolvió el problema de rendimiento, y Let’s Encrypt ofrece certificados TLS gratuitos. Estos dos avances cambiaron las reglas del juego y contribuyeron a que TLS se generalizara.
Para forzar el uso de HTTPS en tu aplicación Spring Boot, puedes extender WebSecurityConfigurerAdapter y exigir una conexión segura.
Los proveedores de servicios en la nube pueden simplificar mucho la gestión de los certificados TLS. Amazon Certificate Manager es muy parecido a Let’s Encrypt, con la diferencia de que está integrado de forma predeterminada en todos los productos y servicios de AWS. Te permite aprovisionar certificados SSL 100 % gratuitos y se encarga de la renovación automática, entre otras cosas, sin que tengas que hacer prácticamente nada ni configurar nada. Heroku también cuenta con Automated Certificate Management.
2. Prueba tus dependencias y encuentra vulnerabilidades de Spring Boot
Es muy probable que no sepas cuántas dependencias directas usa tu aplicación. Es casi seguro que tampoco sepas cuántas dependencias transitivas usa. Esto ocurre con frecuencia, aunque las dependencias constituyen la mayor parte de tu aplicación y pueden contener vulnerabilidades de seguridad de Spring Boot. Los atacantes se dirigen cada vez más a las dependencias de código abierto, ya que su reutilización ofrece muchas víctimas potenciales a los hackers maliciosos. Es importante asegurarse de que no haya vulnerabilidades conocidas en todo el árbol de dependencias de tu aplicación.
Snyk prueba los artefactos de compilación de tu aplicación y señala las dependencias que tienen vulnerabilidades de seguridad conocidas de Spring Boot. Te ofrece un panel con una lista de las vulnerabilidades presentes en los paquetes que usas en tu aplicación.

Además, te sugerirá versiones a las que puedes actualizar o te proporcionará parches para corregir los problemas de seguridad mediante un pull request dirigido a tu repositorio de código fuente. Snyk también protege tu entorno y se asegura de que cualquier pull request futuro que se genere en tu repositorio se pruebe automáticamente (mediante webhooks) para comprobar que no introduzca nuevas vulnerabilidades conocidas de seguridad de Spring Boot.
Snyk está disponible mediante una interfaz web y una CLI, así que puedes integrarlo fácilmente en tu entorno de CI y configurarlo para que interrumpa la compilación cuando haya vulnerabilidades cuya gravedad supere el umbral que estableciste.
Comienza con Capture the Flag
Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.
3. Activa la protección CSRF
La falsificación de solicitudes entre sitios es un ataque que obliga a un usuario a realizar acciones no deseadas en una aplicación en la que ya inició sesión.
Spring Security cuenta con una excelente protección CSRF que está activada de forma predeterminada. Si usas la etiqueta <form:form> de Spring MVC o Thymeleaf junto con @EnableWebSecurity, el token CSRF se agregará automáticamente como un campo de entrada oculto. Para que esto forme parte de tu estrategia de seguridad de Spring Boot, debes agregar la dependencia de inicio de Spring Security.
Si usas un framework de JavaScript como Angular o React, tendrás que configurar CookieCsrfTokenRepository para que JavaScript pueda leer la cookie.
Spring Security agrega automáticamente una marca secure a la cookie XSRF-TOKEN cuando la solicitud se realiza mediante HTTPS. Spring Security no usa la marca SameSite=strict en las cookies CSRF, pero sí lo hace cuando se usan Spring Session o la gestión de sesiones de WebFlux.
4. Usa una política de seguridad de contenido para proteger Spring Boot contra XSS
La política de seguridad de contenido (CSP) es una capa adicional de seguridad que ayuda a mitigar los ataques de XSS (secuencias de comandos entre sitios) e inyección de datos. Para activarla, debes configurar tu aplicación para que devuelva un encabezado Content-Security-Policy. También puedes usar una etiqueta <meta http-equiv="Content-Security-Policy"> en tu página HTML.
Spring Security proporciona varios encabezados de seguridad de forma predeterminada. Spring Security no agrega una CSP de forma predeterminada. Puedes activar el encabezado CSP en tu aplicación Spring Boot con la siguiente configuración.
5. Usa OpenID Connect para la autenticación
OpenID Connect (OIDC) es una extensión de OAuth 2.0 que proporciona información del usuario. Agrega un token de ID además de un token de acceso, así como un endpoint /userinfo del que puedes obtener información adicional. También incorpora una función de descubrimiento de endpoints y el registro dinámico de clientes.
El siguiente diagrama muestra cómo funciona OIDC para la autenticación.

6. Usa hash para las contraseñas
Almacenar contraseñas en texto sin formato es una de las peores cosas que puedes hacer para proteger tu aplicación. Por suerte, Spring Security no permite contraseñas en texto sin formato de forma predeterminada. También incluye un módulo de criptografía que puedes usar para el cifrado simétrico, la generación de claves y el hash de contraseñas (también llamado codificación de contraseñas).
PasswordEncoder es la interfaz principal para aplicar hash a las contraseñas en Spring Security y tiene este aspecto:
Spring Security ofrece varias implementaciones; las más populares son BCryptPasswordEncoder y Pbkdf2PasswordEncoder.
7. Usa las versiones más recientes
Hay varias razones para actualizar periódicamente las dependencias de tu aplicación. La seguridad es una de las razones más importantes para hacerlo. La página de inicio start.spring.io usa las versiones más recientes de los paquetes y dependencias de Spring siempre que es posible.
Las actualizaciones de infraestructura suelen ser menos disruptivas que las actualizaciones de dependencias, ya que los autores de bibliotecas tienen distintos niveles de sensibilidad respecto de la compatibilidad con versiones anteriores y los cambios de comportamiento entre versiones. Dicho esto, tienes tres opciones cuando encuentras una vulnerabilidad de seguridad en tu configuración: actualizar, aplicar un parche o ignorarla. Las actualizaciones son la opción más segura para la salud general de tu aplicación, pero a menudo no siempre son viables. En esos casos, los parches pueden eliminar las vulnerabilidades de tu paquete y, a menudo, puedes obtenerlos de un especialista en seguridad como Snyk. Por supuesto, ignorar una vulnerabilidad también es una opción, pero no es recomendable. Quizás conozcas una vulnerabilidad, pero no creas que pueda explotarse directamente. Ten en cuenta que tal vez no forme parte del flujo de tu aplicación hoy, pero en algún momento un desarrollador podría agregar código que use una ruta vulnerable.
8. Almacena los secretos de forma segura
Como parte de tu estrategia de seguridad de Spring Boot, también debemos pensar en tus datos. La información confidencial, como contraseñas y tokens de acceso, debe manejarse con cuidado. No puedes dejarla expuesta, transmitirla en texto sin formato ni almacenarla de manera predecible en el almacenamiento local. Como la historia de GitHub ha demostrado una y otra vez, los desarrolladores no piensan lo suficiente en cómo almacenan sus secretos.
Una buena práctica es almacenar los secretos en una bóveda que permita guardar credenciales, controlar el acceso a ellas e incluso generarlas para los servicios que pueda usar tu aplicación. Vault by HashiCorp facilita el almacenamiento de secretos y ofrece varios servicios adicionales. También puedes integrarlo con mecanismos de autenticación comunes, como LDAP, para obtener tokens.
Si te interesa, dedica algo de tiempo a explorar Spring Vault, que agrega una capa de abstracción sobre HashiCorp Vault y proporciona acceso basado en anotaciones de Spring para que los clientes puedan consultar, almacenar y revocar secretos sin tener que lidiar con la infraestructura. El siguiente fragmento de código muestra lo fácil que es extraer una contraseña de Spring Vault mediante una anotación.
9. Realiza pruebas de penetración en tu aplicación
La herramienta de seguridad OWASP ZAP es un proxy que realiza pruebas de penetración en tu aplicación en producción mientras se ejecuta. Es un proyecto gratuito y de código abierto muy popular (con más de 4 mil estrellas) alojado en GitHub.
OWASP ZAP usa dos métodos para encontrar vulnerabilidades: Spider y Active Scan. La herramienta Spider parte de un conjunto inicial de URL, las visita y analiza cada respuesta para identificar hipervínculos y agregarlos a una lista. Luego visita las nuevas URL encontradas y repite el proceso de forma recursiva, creando un mapa de las URL de tu aplicación web. La herramienta Active Scan prueba automáticamente los objetivos que seleccionaste para detectar una lista de posibles vulnerabilidades. Te proporciona un informe que muestra dónde se puede explotar tu aplicación web e incluye detalles sobre la vulnerabilidad.
10. Pídele a tu equipo de seguridad que revise el código
Las revisiones de código son esenciales para cualquier equipo de desarrollo de software de alto rendimiento. En Okta, todo el código de producción y los proyectos oficiales de código abierto deben ser analizados por nuestro equipo de seguridad especializado. Quizás no tengas expertos en seguridad en tu empresa, pero si trabajas con datos confidenciales, ¡tal vez deberías tenerlos!
Asegúrate de descargar la guía de seguridad de Spring Boot y colocarla en algún lugar visible para recordar algunas de las prácticas recomendadas que debes seguir si eres desarrollador y usas Spring Boot en tus aplicaciones.
Preguntas frecuentes
¿Cómo agrego seguridad a Spring Boot?
Para agregar Spring Security a tu aplicación Spring Boot, comienza por agregar la dependencia de inicio de seguridad.
¿Cómo desactivo Spring Security en Spring Boot?
De forma predeterminada, Spring Security se activa cuando incluyes el paquete spring-boot-starter-security. Puedes desactivarlo fácilmente excluyendo SecurityAutoConfiguration en el archivo application.properties.
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration
Comienza con Capture the Flag
Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.



