taglibs sec hasrole java security spring spring-security brute-force

java - hasrole - Spring Security: ¿cómo implementar la detección de fuerza bruta(BFD)?



sec:authorize thymeleaf (3)

La forma normal de detectar ataques de fuerza bruta (conjeturas de contraseña) es hacer que el esquema de autenticación registre los intentos de inicio de sesión fallidos y que una aplicación por separado intente detectar patrones sospechosos en el archivo de registro. Supongo que sería posible cerrar el bucle y hacer que el detector tome medidas para bloquear las cuentas bajo ataque, etc.

Hay un ejemplo en esta página .

Spring Security 3.02 se encarga de la seguridad de mis aplicaciones web, pero no encuentro ninguna compatibilidad inmediata para la detección de fuerza bruta.

Me gustaría implementar alguna protección BFD a nivel de aplicación. Por ejemplo, al almacenar el intento de inicio de sesión fallido por usuario en la base de datos (JPA). Las cuentas de usuario atacadas podrían obtener un período de bloqueo o una reactivación forzada de la cuenta por correo electrónico.

¿Cuál es la mejor manera de implementar esto con Spring Security? ¿Alguien tiene código de ejemplo o mejores prácticas en esto?


No es tan difícil hacer rodar tu propia BFD. Al igual que en Spring Security 3.0, simplemente puede agregar escuchas de la aplicación (gracias Stephen C por indicarme la dirección correcta).

Se llamará a este oyente cuando aparezcan fallas de autenticación:

@Component public class AuthenticationFailureListener implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> { @Autowired private UserDao userDao; public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent ev) { String username = ev.getAuthentication().getName(); User user = userDao.find("name", username); if (user != null) { // only for existing users user.reportLoginFailure(); userDao.commit(); } } }

Cada fallo de autenticación ahora informará al usuario. El usuario, por ejemplo, incrementa un contador de fallas de autenticación y se desactiva cuando se alcanza un cierto umbral.

Cuando un usuario se autentica correctamente, el siguiente oyente informará al usuario (quien, por ejemplo, puede restablecer sus contadores de fallas de autenticación):

@Component public class AuthenticationSuccessEventListener implements ApplicationListener<AuthenticationSuccessEvent>{ @Autowired private UserDao userDao; public void onApplicationEvent(AuthenticationSuccessEvent event) { String username = event.getAuthentication().getName(); User user = userDao.find("name", username); user.reportLoginOK(); userDao.commit(); } }

Los oyentes anteriores no necesitarán una configuración XML adicional y Spring los recogerá automáticamente (si están en el paquete de componentes de exploración de Spring).

Dependiendo de la configuración de su transacción, esta solución podría perder algunos conteos de inicio de sesión fallidos si se producen casi simultáneamente. Esto se puede evitar si actualiza el contador con una sola consulta de ACTUALIZACIÓN en lugar de cargar al usuario y luego guarda los cambios.

Los oyentes anteriores también pueden extenderse para detectar otros patrones BDF, por ejemplo, una única IP que está realizando un escaneo en muchos de los nombres de usuarios (aleatorios).


También debe saber que bloquear una cuenta atacada significa hacer que su servicio sea DOSABLE.

El ejemplo más conocido es: usted proporciona un servicio de subasta, Bob quiere comprar una posición y ataca la cuenta de Alice, así que en lugar de hacer apuestas, Alice intenta restaurar su cuenta mientras Bob obtiene la posición. Incluso los bloqueos temporales (5 segundos) pueden impedir que Alice use el servicio como lo necesita.