Intento fallido de intentos de inicio de sesión: ¿tiempo de espera exponencial? por IP? usando una cookie de sesión? captcha?

7

Estoy empezando a pensar que esto no es tan simple como parece, y muchas respuestas "aceptadas" aquí y en el SO, tienen respuestas alternativas que los critican. Esto es lo que he reunido hasta ahora

La mayor parte de lo que he recopilado proviene de esta pregunta SO

Utilizando IP - no es precisa

  

Por ej. en países como Singapur, hay un número limitado de ISP y un conjunto más pequeño de IP disponibles para usuarios domésticos

También creo que esto no es efectivo en los ataques de fuerza bruta distribuidos

Uso de la cookie de sesión : fácil de superar, no lleva mucho tiempo borrar una cookie y no es efectivo en los ataques de fuerza bruta distribuidos

Usando el nombre de usuario - tiempo de espera exponencial creciente - puede tener workarounds

  

Si tengo una lista de 1000 nombres de usuario, intentaré user1 + password1,   usuario2 + contraseña1, usuario3 + contraseña1 ... usuario1 + contraseña2, usuario2 + contraseña2

Utilizando recapcha : está bien, pero aún debes saber que es el mismo "usuario" (que puede estar realizando un ataque distribuido, borrando sus cookies, etc.)

Supongo que supongo que no hay una solución perfecta, pero ¿existe alguna solución "buena" aprobada por alguna organización como OWASP para manejar el estrangulamiento de intentos fallidos de inicio de sesión?

    
pregunta Eran Medan 21.11.2012 - 02:42
fuente

4 respuestas

5

Una vez consideré usar un enfoque similar al de Puzzles de Merkle . Por ejemplo, podría requerir que cada intento de inicio de sesión se firme con HMAC usando una tecla de tiempo. Por ejemplo el servidor podría preparar rompecabezas de la siguiente manera: - semilla (valor aleatorio largo), - r (valor entero aleatorio dentro de algún rango arbitrario), - clave = PBKDF2 (semilla, r)

El servidor podría enviar el siguiente enigma al cliente: (semilla, hash (clave)). Para obtener una clave válida, el cliente tendría que aplicar fuerza bruta a este enigma (verifique los valores r secuencialmente, calcule PBKDF2 para una semilla dada, compare su hash con hash (clave) recibido del servidor). Cuando el cliente encuentra la clave correcta, la usa para firmar un intento de inicio de sesión.

En este enfoque, la cantidad de trabajo es asimétrica entre el cliente y el servidor (el cliente tiene que hacer más cálculos). Además, el servidor puede ajustar el "factor de trabajo" cambiando el rango a partir del valor seleccionado.

Por supuesto, este esquema no evitaría el forzamiento de la contraseña, pero aumentaría el costo de tal ataque.

Como dije, es solo una idea aproximada, no estoy seguro de cuán bueno funcionaría en la práctica.

    
respondido por el pgolen 21.11.2012 - 07:42
fuente
3

Para protegerse contra la ruptura de contraseñas de fuerza bruta, debe usar esencialmente lo que denomina " Usar el nombre de usuario: tiempo de espera exponencial creciente ". Para cada nombre de usuario, mantenga un conteo de fallas desde el último inicio de sesión exitoso y un valor de tiempo para cuando se permita otro intento de inicio de sesión. Antes de verificar la contraseña enviada, compare la hora actual con la hora de bloqueo del nombre de usuario. Si el tiempo aún no se ha producido, impida que la solicitud de inicio de sesión continúe. Puede hacer esto retrasando la solicitud, pero si se permiten demasiados de esos retrasos (que ocupan los recursos del servidor), será fácilmente sujeto a un ataque DDOS. Entonces, en lugar de eso, responda con el estado http 429 Demasiadas solicitudes cuando el bloqueo no haya expirado en el nombre de usuario. Cada vez que se permite que un inicio de sesión continúe más allá de esto, y luego la contraseña falla, el conteo de fallas del nombre de usuario se incrementa, y en base a eso, el tiempo de bloqueo se establece en la hora actual más el retraso exponencial basado en la cuenta de fallas. Un inicio de sesión exitoso restablece el conteo de fallas y el tiempo de bloqueo.

La "solución alternativa" que se muestra no es un problema en particular. Ya sea que la lista de 1000 nombres de usuarios se intente de forma secuencial o en paralelo, cada uno de los nombres de usuarios mantendrá su propio tiempo de bloqueo, y después de unas cuantas rondas para cada uno de ellos, evitará el rápido servicio de los intentos de forzamiento brutales. p>     

respondido por el mgkrebbs 22.11.2012 - 08:51
fuente
2

Por "aceleración" Supongo que quiere decir que inmediatamente mostrará una página web (con cualquier cantidad de funcionalidad) o un error 5xx, ¿verdad? (a diferencia de simplemente enviar la página de inicio de sesión más lentamente .. con un temporizador de suspensión ())

Quizás pueda utilizar un enfoque híbrido de ponderaciones positivas y negativas. Utilizo esto para administrar el correo electrónico no deseado, y tal vez algunas lecciones aprendidas puedan compartirse aquí.

Para comenzar, haga un seguimiento de todos los datos que mencionó anteriormente para los inicios de sesión exitosos y fallidos. Luego, y asigne un "nivel de confianza" que va de 10 positivo a 10 negativo a cada variable.

Luego, cuando el usuario intenta iniciar sesión, simplemente puede calcular la proporción de inicios de sesión exitosos y los inicios de sesión fallidos y ponderarlos por nivel de confianza (multiplicar). Sume el resultado y úselo para determinar el grado en que se limita la sesión.

Tenga en cuenta la huella digital del navegador y configure una cookie para iniciar sesión correctamente, y para cada intento de inicio de sesión también puede serle de utilidad en este esfuerzo. .

Estoy seguro de que los escritorios corporativos, los consumidores en general y las audiencias internacionales crearían perfiles muy distintos que ponderarían cada valor de manera diferente. Me interesaría saber más sobre tu proyecto, tus pensamientos y lo que terminas haciendo.

P.S. Cada vez que hago cualquier cálculo con una página de inicio de sesión, me aseguro de usar siempre un tiempo fijo para el cálculo (500 ms). Esto ayudará a evitar que crezcan oráculos criptográficos que históricamente han plagado tales páginas.

P.P.S Al crear la página de inicio de sesión, asegúrese de no bloquear subprocesos con las operaciones de Retardo (como sleep ()), o de lo contrario DDOS su servidor rápidamente. Alternativamente, devuelva algún error HTML o 500 al usuario afectado.

    
respondido por el random65537 21.11.2012 - 06:39
fuente
1

Estoy usando una OTP: significa que mis inicios de sesión se basan en tres claves distintas:

  • nombre de usuario
  • contraseña
  • OTP (contraseña de un solo uso) proporcionada por yubikeys.

También he agregado, para una aplicación, un contador: si X inicios de sesión fallidos se producen en un intervalo dado, esto:

  • redirige a una página de error (obligando a las personas a hacer clic en algún enlace para iniciar sesión, inútil para los robots)
  • bloquea la cuenta después de varios intentos.

El bloque puede basarse en la IP remota para evitar falsos positivos.

    
respondido por el SwissTengu 22.11.2012 - 08:11
fuente

Lea otras preguntas en las etiquetas