¿Cómo implementas adecuadamente las defensas contra el fuerza bruta? ¿Es mejor almacenar cuántas veces alguien intentó iniciar sesión y bloquearlas después de X intentos? ¿Y cómo se podría identificar a "alguien"? ¿Con la sesión? ¿Una IP?
¿Cómo implementas adecuadamente las defensas contra el fuerza bruta? ¿Es mejor almacenar cuántas veces alguien intentó iniciar sesión y bloquearlas después de X intentos? ¿Y cómo se podría identificar a "alguien"? ¿Con la sesión? ¿Una IP?
El bloqueo de cuenta es una opción, donde la cuenta se bloquea permanentemente o por un período de tiempo después de x inicios de sesión fallidos. Los problemas aquí son los riesgos de denegación de servicio si un atacante intenta adivinar contraseñas y también la carga administrativa de restablecer las cuentas (suponiendo que no esté disponible un restablecimiento automático)
Otra opción es introducir CAPTCHA en el proceso de inicio de sesión. Esto tiene la intención de limitar los ataques automatizados y detener la denegación de servicio de los bloqueos de cuentas. Los problemas con él pueden ser los requisitos de accesibilidad y el craqueo automatizado de CAPTCHA. Por lo que he visto, algunos CAPTCHA son más fáciles de romper para el software que otros.
Una tercera opción es introducir un retraso progresivo en el proceso de inicio de sesión, por lo que para cada inicio de sesión incorrecto, el proceso se vuelve cada vez más lento. Esto tiene un efecto limitado en los usuarios reales, pero hace que la fuerza bruta automatizada sea mucho más difícil.
En términos de la segunda parte de tu pregunta sobre la identificación del "alguien" que realiza el ataque, depende de lo que estén haciendo. Si solo están atacando a un solo usuario, entonces el nombre de usuario es el identificador y las acciones están vinculadas a esa cuenta. Si son de fuerza bruta en una amplia gama de usuarios, la fuente de IP (tal vez combinada con el agente del navegador) es una opción. No es perfecto (p. Ej., Uso de botnets, suplantación de agentes), pero es probable que sea la única información que tendrías que seguir.
La respuesta a negar la fuerza bruta es negar un gran número de intentos, donde el espacio clave y la aceptación del riesgo definen un gran espacio.
Cada situación va a tener diferentes soluciones.
Espacio de carne
Computers
Todas las soluciones también tienen concesiones como todo lo demás en la vida.
Como sugiero, te refieres al inicio de sesión / contraseña de fuerza bruta en la aplicación web.
Nadie hace fuerza bruta manualmente. Entonces, si hay dudas de que este es un humano que intenta autenticarse, muestre Captcha, por ejemplo, desde el intento de inicio de sesión fallido en 3-d. Además, puede poner un tiempo de espera entre intentos de inicio de sesión, pero esto no funcionará para ataques distribuidos de diferentes IP. A continuación, hay dos tipos de fuerza bruta: ciego, solo intento de inicio de sesión / contraseña aleatorios y ataque contra algún usuario. Para el último ataque es efectivo implementar una función como el bloqueo de la cuenta por algún tiempo y notificar al usuario por correo electrónico. Para los ciegos, la mitigación de la fuerza bruta puede ser más difícil de implementar, especialmente si el sitio es popular. En este caso, puede hacer un seguimiento de la información del usuario como IP / País / Navegador / etc, y descubrir una combinación de esto, puede hacer suposiciones sobre si este es un usuario válido. Como complemento a esto, puede jugar con cookies de larga duración: una vez que el usuario haya iniciado sesión correctamente, guarde la cookie y luego verifique si la tiene.
Sin la solución de tipo de aplicación web es posible implementar soluciones a nivel de servidor como mod_evasive de Apache. O incluso escriba su propio módulo de servidor web, específicamente para tales fines.
Claro, hay muchas otras formas de fortalecer la mitigación de ataques de fuerza bruta, pero a menudo resultan ser ruidosas, bastante inútiles y desagradables. Intenta seguir con KISS.
Lo importante es cómo identifica al 'alguien'?
No puede hacerlo por dirección IP: muchos usuarios pueden parecer que tienen la misma dirección de cliente (esto se hará aún más frecuente con el problema continuo de la falta de direcciones de IPV4).
Puede parecer que un usuario se conecta desde varias direcciones de clientes, por ejemplo, utilizando los proxies de carga equilibrada de AOL, o menos legítimamente, a través de tor.
Cualquier otra cosa son datos proporcionados por el cliente, por lo que potencialmente pueden modificar las cookies que establezca, la cadena de agente de usuario, etc.
El único enfoque práctico es aplicar la puntuación heurística a la solicitud para tratar de compararla con los intentos anteriores, pero aún será imposible diferenciar entre ataques sofisticados y usuarios legítimos.
Establezca un umbral de puntuación en el que considere que el cliente está tratando de forzar la fuerza bruta de su sitio, por ejemplo, -20.
Requerir una sesión válida actual a la que hace referencia una cookie de sesión (que no está configurada en la página que solicita un nombre de usuario / contraseña) es un comienzo: si la cookie no presenta los detalles de autenticación, entonces redirija a una página separada que deja caer la cookie e inicializa la sesión con una puntuación de -10, y una puntuación de (por ejemplo) -2 para la dirección IP del cliente. Podría usar un mecanismo de puntuación dinámico cuando comience a ver a varios usuarios válidos desde la misma dirección. Del mismo modo, puede mantener una puntuación dinámica por usuario-agente y por el nombre de usuario.
Cuando se presenta cookie + auth para un usuario inexistente, agregue una puntuación de -5 a la sesión, -1 a la dirección del cliente, -5 al nombre de usuario.
Cuando las cookies + autenticación se presentan con una contraseña no válida, agregue una puntuación de -3 a la sesión, -1 a la dirección del cliente, -4 al nombre de usuario.
Cuando cookie + auth + password valida agregue +4 de la puntuación para la dirección del cliente, +3 al nombre de usuario, +2 al agente de usuario.
NB: también debe establecer una caída para permitir que se recupere cualquier puntaje de la dirección del cliente / usuario-agente / nombre de usuario, digamos + 2 / hora
Debe pensar qué sucede cuando la puntuación supera el umbral. ¿Ha proporcionado un mecanismo para que alguien bloquee el acceso a su sitio?
Si ha bloqueado el acceso con un puntaje alto para un nombre de usuario en particular, envíe un correo electrónico con una URL de reinicio al usuario registrado para esa cuenta para que pueda restablecer el puntaje para su nombre de usuario y reducir el puntaje para su cuenta. usuario-agente / dirección.
Almacene los ips largos de inicios de sesión anteriores e intentos de inicio de sesión.
Después de N intentos fallidos, ponlos contra captcha.
Bloquee las direcciones rápidamente que no tienen inicios de sesión exitosos en su historial, pero sí varios intentos.
Bloquee las direcciones rápidas que tienen direcciones de origen simultáneas o intentos de velocidad / staminarapid inhumanos.
Además, ninguna de estas respuestas tiene en cuenta el método de forzamiento brutal en el que un atacante usa una contraseña y la prueba contra todas las cuentas, una reversión del proceso habitual y una contra la que generalmente no está protegida.
El control sería, por supuesto, tener un proceso de monitoreo para múltiples intentos contra diferentes cuentas con la misma contraseña, pero nuevamente es muy difícil de bloquear, incluso si provienen de una sola dirección, ¿cómo bloquea esa IP? Los usuarios válidos también pueden utilizarlo, o ¿simplemente abandonas los inicios de sesión con esa contraseña, con el riesgo de bloquear a un usuario válido con esa contraseña?
Y, por supuesto, si un atacante ejecuta este tipo de cosas desde una red distribuida, o durante un largo período de tiempo, ¿cómo correlaciona los incidentes en un perfil de ataque?
Los mecanismos generales de la industria incluyen bloqueo
Primero, tiene sentido comprender qué escenarios / ataques pretende manejar:
(¿Lo ves? No es tan simple ...) Y hay diferentes soluciones para cada parte de estos ...
Si se trata de un sitio web comercial, utilice el certificado más la autenticación de contraseña. Sin un certificado válido, nunca llegan al punto de intentar adivinar la contraseña. También puede usar algo como RSA SecurID en lugar del certificado.
Lea otras preguntas en las etiquetas web-application authentication appsec countermeasure