Skip to main content

10 prácticas recomendadas de seguridad para Spring Boot

Escrito por

Matt Raible

Spring Boot Security Best Practices small

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:

  1. Usa HTTPS en producción

  2. Prueba tus dependencias y encuentra vulnerabilidades de Spring Boot

  3. Activa la protección CSRF

  4. Usa una política de seguridad de contenido para proteger Spring Boot contra XSS

  5. Usa OpenID Connect para la autenticación

  6. Usa hash para las contraseñas

  7. Usa las versiones más recientes

  8. Almacena los secretos de forma segura

  9. Realiza pruebas de penetración en tu aplicación

  10. 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.

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

 @Override
 protected void configure(HttpSecurity http) throws Exception {
   http.requiresChannel().requiresSecure();
 }
}

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.

Panel de Snyk que muestra todos los proyectos vulnerables y el número de vulnerabilidades altas, medias y bajas en tres proyectos de GitHub Maven.

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.

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http
           .csrf()
               .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
   }
}

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.

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http.headers()
           .contentSecurityPolicy("script-src 'self' https://trustedscripts.example.com; object-src https://trustedplugins.example.com; report-uri /csp-report-endpoint/");
   }
}

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.

Diagrama del flujo de código de autorización OIDC que muestra un cliente, un servidor de autorización, el consentimiento del usuario, una devolución de llamada y el intercambio de tokens.

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:

public interface PasswordEncoder {
   String encode(String rawPassword);
   boolean matches(String rawPassword, String encodedPassword);
}

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.

@Value("${password}")
String password;

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.

Leer más

Blog

Los modelos de frontera encontraron las vulnerabilidades. Solo el atacante encontró las cadenas.

El análisis estático encontró las fallas, pero solo las pruebas de ataque en vivo demostraron cómo podían encadenarse para provocar brechas. Una comparación de Evo COS, Claude Security y Claude Code Security.

feature insights context
Blog

Los ataques autónomos ya están aquí. La defensa debe estar a su altura.

Los atacantes autónomos están reduciendo el tiempo disponible para defenderse. Descubre cómo el descubrimiento, la corrección, la validación y la prevención continuos pueden ayudar a los equipos de seguridad a seguirles el ritmo.

Blog

Por qué los agentes de programación con IA siguen generando fallas de control de acceso

Los agentes de programación con IA pueden generar lógica de autorización que compila y supera la revisión, pero expone los datos de un inquilino a otro. Descubre por qué es difícil detectar el control de acceso roto y cómo prevenirlo.