Pregunta

(Esto es en principio una pregunta independiente del idioma, aunque en mi caso estoy usando ASP.NET 3.5)

Estoy utilizando el estándar de ASP.NET iniciar sesión de control y le gustaría poner en práctica la siguiente lógica de inicio de sesión fallido intento de estrangulamiento.

  • OnLoginError evento y mantener, en Sesión , un recuento de intentos de acceso fallidos
  • Cuando esta cuenta se vuelve a [algún valor configurable] bloquear cualquier nuevo intento de inicio de sesión de la dirección IP de origen o para que el usuario / a aquellos usuarios durante 1 hora

¿Suena esto como un enfoque sensato? Me estoy perdiendo un medio obvio por el cual dichos controles que se pueden omitir?

Nota: sesión de ASP.NET se asocia con el navegador del usuario mediante una cookie

Editar

Esto es para un sitio de administración que sólo se va a utilizar en el Reino Unido y la India

¿Fue útil?

Solución

Jeff Atwood menciona otro enfoque: En lugar de bloquear una cuenta después de un número de intentos, aumentar el tiempo hasta se permite un nuevo intento de inicio de sesión:

1st failed login    no delay
2nd failed login    2 sec delay
3rd failed login    4 sec delay
4th failed login    8 sec delay
5th failed login    16 sec delay

Esto reduciría el riesgo de que esta medida de protección se puede abusar de ataques de denegación de servicio.

http://www.codinghorror.com/blog/archives/001206. html

Otros consejos

La última cosa que quiere hacer es almacenar todos los intentos fallidos de ingresar en una base de datos, que va a trabajar lo suficientemente bien, pero también hace que sea extremadamente trivial para ataques DDoS para traer su servidor de base de datos hacia abajo.

Usted probablemente está utilizando algún tipo de caché de servidor en su servidor web, memcached o similar. Esos son sistemas perfectos para usar para hacer el seguimiento de intentos fallidos por la dirección IP y / o nombre de usuario. Si se supera un determinado umbral de intentos de acceso fallidos a continuación, puede decidir desactivar la cuenta en la base de datos, pero usted va a ahorrar un montón de lecturas y escrituras a su almacenamiento persistió durante los contadores de inicio de sesión fallidos que no necesita persistir.

Si usted está tratando de evitar que la gente de autenticación de fuerza bruta, un sistema de estrangulación como Gumbo sugirió probablemente funciona mejor. Esto hará que los ataques de fuerza bruta poco interesante para el atacante, mientras que se minimiza el impacto para los usuarios legítimos en circunstancias normales o incluso un ataque mientras está pasando. Yo te sugeriría que simplemente contando los intentos fallidos por IP en memcached o similares, y si alguna vez se convierte en el blanco de un ataque de fuerza bruta muy distribuido, siempre se puede elegir también a empezar a llevar un registro de los intentos por nombre de usuario, suponiendo que los atacantes son en realidad tratando el mismo nombre de usuario a menudo. Mientras el intento no está muy distribuido, como en aún viniendo de una cantidad numerable de direcciones IP, la inicial en IP código debe mantener atacantes a cabo muy adecuadamente.

La clave para prevenir problemas con los visitantes de países con un número limitado de direcciones IP es no hacer sus umbrales demasiado estricto; Si usted no recibe múltiples intentos en un par de segundos, es probable que no tiene mucho de qué preocuparse re. fuerza bruta guión. Si usted está más preocupado por la gente tratando de desentrañar las contraseñas de otros usuarios de forma manual, puede establecer límites más amplios para los posteriores intentos de acceso fallidos por nombre de usuario.

Otra sugerencia, que no responde a su pregunta, pero es algo relacionado, es hacer cumplir un cierto nivel de seguridad de las contraseñas de sus usuarios finales. Yo no iría por la borda con requiriendo un caso mixto, al menos x caracteres, no de diccionario, etc, etc contraseña, ya que no quiere a la gente a errores tanto cuando ni siquiera han registrado, pero simplemente impedir que la gente usando su nombre de usuario como su contraseña debe recorrer un largo camino para proteger su servicio y los usuarios contra los más sofisticados - adivinar por qué los llaman fuerza bruta;) - de los ataques

.

La respuesta aceptada, que inserta los retrasos cada vez mayores en sucesivos intentos de conexión, puede llevar a cabo muy mal en ASP.NET dependiendo de cómo se implementa. ASP.NET utiliza un grupo de subprocesos a las solicitudes de servicio. Una vez que este grupo de subprocesos se agota, las solicitudes entrantes se pondrán en cola hasta que un hilo esté disponible.

Si inserta la demora usando Thread.Sleep (n), se le atar a un grupo de subproceso de ASP.NET para la duración de la demora. Este hilo ya no estará disponible para ejecutar otras solicitudes. En este escenario un simple estilo de ataque DOS sería mantener presentando el formulario de acceso. Eventualmente, todos los hilos disponibles para ejecutar las solicitudes estarán durmiendo (y para aumentar los períodos de tiempo).

La única manera que puedo pensar para aplicar correctamente este mecanismo de retardo es el uso de un controlador HTTP asincrónico. Ver Tutorial: Crear un controlador HTTP asincrónico . La aplicación es probable que tenga que:

  1. autenticación Intento durante BeginProcessRequest y determinar el retardo en caso de fallo
  2. Vuelta IAsyncResult una exposición de una WaitHandle que se activará después del retardo
  3. Asegúrese de que el WaitHandle se ha activado (o bloque hasta que haya sido) en EndProcessRequest

Esto podría afectar a sus usuarios genuinos también. Por ej. en países como Singapur hay un número limitado de proveedores de Internet y un conjunto más pequeño de IPs que están disponibles para los usuarios domésticos.

Alternativamente, usted podría insertar un código de imagen después de x intentos fallidos para frustrar niños de la escritura.

Creo que usted necesita para mantener el conteo fuera de la sesión - si no el ataque es trivial para borrar las cookies antes de cada intento de inicio de sesión

.

De lo contrario un recuento y de bloqueo es razonable - a pesar de una solución más fácil sería tener una duplicación-tiempo de espera entre cada fallo de inicio de sesión. es decir, 2 segundos después de la primera intento de inicio de sesión, 4 segundos después de la próxima, 8 etc.

Se implementa el tiempo de espera al negarse los inicios de sesión en el período de tiempo de espera - incluso si el usuario da la contraseña correcta -. Acaba de responder con texto legible por humanos diciendo que la cuenta está bloqueada de salida

también monitorear para misma ip / usuario diferente y mismo usuario / IP diferente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top