¿Hay alguna característica específicamente en Spring 3.0 MVC que ayudaría a implementar la detección de un ataque de fuerza bruta en la página de autenticación/inicio de sesión de una aplicación web?¿La mejor forma de que una aplicación web Spring MVC detecte un ataque de fuerza bruta?
Respuesta
Sorprendentemente, no pude encontrar nada en los documentos de referencia para Spring MVC o Spring Security.
Sí, sin embargo, encontré this 3 year old tutorial que describe cómo se puede hacer usando Splunk.
La práctica comprobada hace tiempo es introducir un retraso aleatorio pero considerable si la autenticación ha fallado.
De esta forma, los usuarios legítimos iniciarán sesión de inmediato, pero un atacante gastará 500ms-1 por intento, lo que hace que toda la idea de la fuerza bruta sea poco práctica (llevará una eternidad).
El inicio de sesión fallido ocasional por usuarios legítimos les causará solo un pequeño retraso y pasará desapercibido.
Si necesita para ser notificado sobre los inicios de sesión fallidos repetidos, es necesario implementar una serie de impresión del informe de inicios de sesión fallidos consecuentes por usuario, por orden de ese límite desc número 100.
P. S. Here es una publicación que explica cómo recibir notificaciones en el intento de inicio de sesión. Siguiendo el mismo enfoque, uno puede introducir un retraso, creo.
Buena idea. Incluso se puede incrementar el tiempo de demora exponencialmente, como creo que algunos sistemas operativos lo hacen. –
La respuesta corta es no, por lo que sé, Spring 3.0 MVC no tiene nada que lo ayude a detectar un ataque de fuerza bruta. No creo que Spring 3.0 tenga nada tampoco para ese asunto.
Sin embargo, debe poder implementar algo usted mismo extendiendo algunos de los UserDetailsServices.
A veces es aconsejable registrar todos los intentos de inicio de sesión, exitosos o no. Si está registrando todas las fallas (como en una base de datos), debería poder determinar si alguien/algo está intentando un ataque de fuerza bruta en su sitio.
Debería considerar los intentos de acceso a la aceleración como @road to yamburg.
También considere agregar captcha a su página de inicio de sesión, reCAPTCHA de Google es muy fácil de integrar en cualquier aplicación. Here es la documentación para usarlo con Java/JSP
Es posible por algunas configuraciones y codificación en Spring security.
Por cierto, no sugiero retrasar un poco las pruebas de inicio de sesión sospechosas no válidas. Puede retrasar un poco para responder a un intento de inicio de sesión sospechoso, pero este retraso le cuesta suspender un hilo por un tiempo en su aplicación. Esto puede proporcionar un ataque DoS o DDoS en su sistema si hay una gran cantidad de inicios de sesión no válidos simultáneamente a su aplicación.
El mejor enfoque es hacer una respuesta rápida a un inicio de sesión inválido sospechoso pero al mismo tiempo suspender la cuenta de usuario por la cual el usuario intenta iniciar sesión. De esta manera, la evitación de ataque de fuerza bruta no conduce a la provisión de ataques de Dos o DDoS.
Sin embargo, la suspensión de la cuenta del usuario también proporcionaría una forma para el ataque DoS, ya que puede llevar a la falla en la entrega del servicio al usuario real. Pero, los escenarios de seguridad correctos serían útiles en estos casos. Por ejemplo, si se detecta un ataque de fuerza bruta, es posible que:
- mostrar algo de Captcha,
- suspender la cuenta, e-mail o SMS al propietario de la cuenta para el cambio de contraseña
- o, suspender la cuenta de un período de tiempo, mientras que notificar al propietario de la cuenta para el cambio de contraseña,
- ...
Todo esto depende de sus escenarios de dominio y de servicios. Como ejemplo, puede implementar su propio UserDetailsService y detectar ataques de fuerza bruta en esta implementación. Para implementar el último escenario de Spring Security, el siguiente código declara un administrador de autenticación al que se le pasa un UserDetailsService personalizado, que es JdbcDaoImpl aquí (tenga en cuenta que los nombres y las consultas de los paquetes deben modificarse para su propio paquete y modelo de datos) .
<authentication-manager alias="authenticationManager" xmlns="http://www.springframework.org/schema/security">
<authentication-provider user-service-ref="CustomUserDetailsService" />
</authentication-manager>
<!--
This bean is to provide jdbc-user-service.
Also, it provides a way to avoid BFD along with AuthenticationFailureListener
-->
<bean id="CustomUserDetailsService" class="com.example.CustomUserDetailsService">
<property name="dataSource" ref="dataSource" />
<property name="usersByUsernameQuery" value="SELECT user_client.user_name, user_client.password, user.is_active
FROM user_client INNER JOIN user ON user_client.fk_user = user.ID
WHERE user_client.user_name=? "/>
<property name="authoritiesByUsernameQuery" value="SELECT user_client.user_name, CONCAT('ROLE_',user_client.client_id)
FROM user_client WHERE user_client.user_name=? "/>
</bean>
El CustomUserDetailsService detecta si hay un ataque de fuerza bruta sucediendo o no, junto con AuthenticationFailureListener que discuto pronto. FailedLoginCacheManager es un contenedor de ehcache que mantiene los inicios de sesión fallidos (nombres de usuario) con sus cantidades relativas fallidas. El caché se establece con un timeToIdleSeconds adecuado para que la suspensión de la cuenta sea temporal.
public class CustomUserDetailsService extends JdbcDaoImpl {
@Autowired
private FailedLoginCacheManager cacheManager;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if (cacheManager.isBruteForceAttackLogin(username)) {
//throw some security exception
...
}
return super.loadUserByUsername(username);
}
}
Además, un ApplicationListener se implementa para detectar intentos de acceso fallidos y conservarlos dentro de la ehcache.
@Component public class AuthenticationFailureListener implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> {
@Autowired
private FailedLoginCacheManager cacheManager;
@Override
public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) {
UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) event.getSource();
String userName = token.getPrincipal().toString();
cacheManager.updateLoginFailureStatus(userName);
}}
No hay necesidad de discutir más sobre el servicio FailedLoginCacheManager sino dos métodos principales que se discuten aquí se podrían implementar como los métodos siguientes:
public void updateLoginFailureStatus(String userName) {
Cache cache = manager.getCache(CACHE_NAME);
Element element = cache.get(userName);
if (isValid(element)) {
int failureCount = (Integer)element.getObjectValue();
cache.remove(userName);
cache.put(new Element(userName, ++failureCount));
} else {
cache.put(new Element(userName, 1));
}
}
public boolean isBruteForceAttackLogin(String username) {
Cache cache = manager.getCache(CACHE_NAME);
Element element = cache.get(username);
if (isValid(element)) {
int failureCount = (Integer)element.getObjectValue();
return failureCount >= 3;
} else {
return false;
}
}
- 1. ¿Cómo son Crypt y Salt más seguros que MD5 contra un ataque de fuerza bruta?
- 2. Sesiones de fuerza bruta
- 3. Puzzle que desafía el enfoque de la fuerza bruta?
- 4. Ataques de inicio de sesión de fuerza bruta en Django
- 5. Proyecto Euler # 8: ¿Hay un algoritmo más eficiente que el cálculo de la fuerza bruta?
- 6. Complejidad del tiempo de un MD5sum incrustado de fuerza bruta
- 7. ¿La mejor manera de aplicar fuerza bruta a su propia frase de contraseña GPG/PGP?
- 8. ¿Hay alguna forma de que PHP detecte una imagen dañada?
- 9. Rieles como Vistas para una aplicación web Spring MVC
- 10. ¿Cuál es la mejor forma de que una aplicación cliente encuentre un servidor en una red local en C#?
- 11. La mejor forma de implementar la aplicación web Zend
- 12. ¿Cómo puedo agrupar una aplicación Spring mvc?
- 13. Al encontrar los píxeles que hacen que una imagen sea única dentro de una lista, ¿puede mejorar la fuerza bruta?
- 14. ¿Cómo puedo prevenir los ataques de fuerza bruta?
- 15. muelle de aplicación de ejemplo MVC Web
- 16. Buscando un algoritmo que no sea "fuerza bruta" para eliminar las áreas que se cruzan de una colección de Rectos
- 17. Configurar un proxy HTTP en una aplicación web de Spring
- 18. Embedded Jetty y Spring Web MVC
- 19. Reduzca la frecuencia de implementaciones en una aplicación web Java utilizando Spring-MVC
- 20. ¿Cuál es la mejor forma de insertar configuraciones en Javascript en una aplicación MVC?
- 21. ¿El mejor recurso para aprender Spring MVC?
- 22. ¿Qué hace que una aplicación web sea una aplicación amigable?
- 23. aumentando la demora de inicio de sesión para detener la fuerza bruta, ¿buena idea?
- 24. Implementación de la aplicación web Asp.net MVC
- 25. Multiprocesamiento eficiente de la maximización masiva de fuerza bruta en Python 3
- 26. cuadro combinado en MVC Spring Web
- 27. ¿Cuál es la mejor manera de migrar una aplicación web desordenada existente a MVC elegante?
- 28. ¿Hay alguna manera de que una aplicación Java detecte si la pantalla está bloqueada?
- 29. Cómo almacenar la sesión en Spring MVC
- 30. La mejor forma de manejar excepciones en una aplicación con servicios web
esto depende de su entorno. Cuando controlas el entorno del servidor y registras todos los intentos de inicio de sesión, puedes usar fail2ban. O simplemente escribe algo similar como fail2ban dentro de tu proveedor de autenticación o solicita filtro – BlueWizard