[Pregunta]: Lógica para un sistema de seguridad contra ataques de fuerza bruta en el login

Iniciado por Leguim, 12 Febrero 2021, 23:45 PM

0 Miembros y 1 Visitante están viendo este tema.

Leguim

Básicamente estoy pensando como podría hacer un sistema nuevo de seguridad que prevenga ataques de fuerza bruta en el login.

Es decir, que un usuario determinado intente constantemente con diferentes contraseñas (se espera que tenga un diccionario de contraseñas) hasta poder ingresar a la cuenta de la victima.
Me vinieron algunas ideas pero como todo está muy fresco seguro hay cosas que estoy dejando pasar.

El sistema funcionaría de la siguiente manera, cada vez que un usuario ingrese una contraseña incorrecta el sistema le incrementará a +1 una variable que podemos llamar "attempt" (no estoy seguro si en una $_SESSION o en un campo nuevo en la bd para la cuenta de usuario que aplique), al llegar a las 40 tentativas lo que ocurrirá sería bloquear el login para ese usuario. Absolutamente nadie podrá iniciar sesión en esa cuenta por lo menos durante un periodo de tiempo que aún no defino bien, quizás una 6 horas no estoy seguro.

Por supuesto puede ocurrir que la persona que desee ingresar sesión sea el propio usuario, no el atacante. Entonces se le podría enviar un mail justo en el momento de bloquear el login explicándole lo ocurrido, recomendándole el uso de una contraseña segura, por supuesto algo que se me ocurrió es poder darle la posibilidad a el dueño de la cuenta en las opciones de privacidad de querer que su cuenta quede bloqueada (el login) ante estos casos o que no quede.

En fín, en el correo que se le enviará se le dirá que además de la recomendación del uso de contraseñas seguras y esa opción nueva de privacidad, estaría un código que deberá ingresar en un determinado formulario para que se pueda desbloquear el login nuevamente sin que tenga que esperar las 6h.

Es una idea muy fresca así que espero puedan darme más ideas, o mejoras a todo esto.

Tachikomaia

Yo he usado páginas en que si erras el password 3 veces no lo puedes volver a poner durante unos minútos o algo así. No leí todo pero no he visto que dijeses algo nuevo y bueno, al contrario, 40 intentos me parece un disparate.

Leguim

Cita de: Tachikomaia en 13 Febrero 2021, 00:04 AM
Yo he usado páginas en que si erras el password 3 veces no lo puedes volver a poner durante unos minútos o algo así. No leí todo pero no he visto que dijeses algo nuevo y bueno, al contrario, 40 intentos me parece un disparate.

Tiene que ver con que si haces 3 intentos y ya te bloquea el login y después tenes que hacer todo ese trámite con el correo es algo tedioso, imaginate también una persona X que está intentando ingresar a unas 10 cuentas o más y que sólo por molestar se equivoca en cada una 3 veces, le terminó bloqueando el login a 10 cuentas. (no hay muchas personas con tanto tiempo libre pero puede pasar). Igualmente según lo que dijiste te bloquea unos minutos, no unas 6 horas como dije que podría hacer, por eso tanto el tiempo, cantidad de intentos y algunas otras variables puedo cambiar.

#!drvy

En época de Messenger, la gente podía bloquear la cuenta de otros mediante un intento masivo de contraseñas incorrectas lo cual hacia que Hotmail (y por ende Messenger) bloquease la cuenta durante X tiempo y no había forma de quitarlo ni siquiera para el usuario real salvo contactar con soporte de Microsoft xD

Está bien implementar un anti-bruteforce, siempre que el usuario real tenga la posibilidad de saltárselo en caso de que se haya activado. 40 intentos me parece un poco excesivo. Normalmente se trabaja sobre 10 como mucho. Al fin y al cabo son X contraseñas que pueden probar cada Y horas, si pones 40 cada 6, quiere decir que van a poder probar 160 contraseñas cada 24 horas. Eso hay que intentar reducirlo al máximo.

Desde luego, no lo implementes ni por sesión ni por cookies. Impleméntalo a nivel de base de datos. De nada te sirve que el atacante borre las cookies (en el que también se borra la sesión) y se salte el límite.


De todos modos, lo que se hace hoy en día es autentificación en 2 pasos. Ahí aunque la contraseña se vea comprometida, solo el usuario con código 2FA puede acceder.

https://es.wikipedia.org/wiki/Autenticaci%C3%B3n_de_m%C3%BAltiples_factores

Saludos

Leguim

Hola!

Estuve leyendo lo que mandaste, está interesante pero creo que me va a venir mejor en mi sistema, el bloquear el login.

Estas entonces son las características (en base a sus sugerencias):
------------------------------------------------
- El usuario tiene que poder saltarlo en caso de activación.
- 10 intentos fallidos y se bloqueará el login.
- La variable "attempt" pasará a ser un nuevo dato en la base de datos correspondiente para cada usuario.
- Cada vez que el usuario inicie sesión ese contador "attempt" se le reinicializará en 0.
- En opciones de privacidad podrá modificar este "bloqueo de login" (sería recomendable dejarlo desactivado para aquellos que tengan una contraseña muy segura) pero por defecto estará activado el bloqueo de login.
------------------------------------------------

Creo que quedó interesante si bien son pilares básicos, a el sistema seguramente le tenga que poner alguna que otra cosita con la que me vaya a encontrar mientras programo pero me gustó.

Gracias por los aportes.

messenger la tenes adentro  :xD

[u]nsigned


No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!

Danielㅤ

Hola, 10 intentos máximos me parece bien, pero si bloqueas una cuenta por intentos reiterativos, también tenés que bloquear a la persona que estuvo intentando entrar, bloquear su IP e insertarle una cookie temporal para que no pueda seguir intentando entrar en otras cuentas.

Citarpor supuesto algo que se me ocurrió es poder darle la posibilidad a el dueño de la cuenta en las opciones de privacidad de querer que su cuenta quede bloqueada (el login) ante estos casos o que no quede.

Eso no deberías dejarle al usuario que elija porque eso sería un sistema de seguridad general de ti sitio para todos los usuarios y no una opción/configuración, y si decides hacerlo, entonces cuando el usuario cree su cuenta va a tener ese sistema de seguridad activado por defecto.

Lo de usar una cookie de sesión como contador no es buena idea porque el usuario puede borrar esa cookie y tu contador se reestableceria en 0, cierra la sesión antes de completar los 10 intentos y vuelve de nuevo a seguir probando, tenés que manejarte por base de datos como dijo el compañero dry.

Otra idea que podes implementar, es si un usuario utiliza un ataque de brute-force, detectarlo y en el x intento tu sistema hacerle creer que pudo ingresar a la cuenta -aunque realmente no sea así-, eso haría que el ataque automático del atacante, se pare, entonces tú sistema estaría engañando al suyo.


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!

Drakaris

Buenas! Como dice nsigned, esta muy bien el contador de intentos de login fallidos, pero también, a parte de eso, pondría un Captcha, que lo que haría, es que un robot, no pueda enviar el formulario, porque necesita rellenar un campo cuyo texto que tiene que copiar es un Imagén. Puedes crear el tuyo propio o mediante la API de Google

https://developers.google.com/recaptcha/docs/display
Lo increible, no es lo que ves, sino como es

Leguim

Cita de: Drakaris en 13 Marzo 2021, 15:44 PM
Buenas! Como dice nsigned, esta muy bien el contador de intentos de login fallidos, pero también, a parte de eso, pondría un Captcha, que lo que haría, es que un robot, no pueda enviar el formulario, porque necesita rellenar un campo cuyo texto que tiene que copiar es un Imagén. Puedes crear el tuyo propio o mediante la API de Google

https://developers.google.com/recaptcha/docs/display

Hola!
Sí, ya lo uso también en todos los formularios de la aplicación. Pero igual quería meterle este sistema que me pareció interesante para poder programarlo desde cero.