¿Cuál es el enfoque típico para almacenar en caché los intentos de autenticación inválidos?

1

Los clientes (en realidad, piezas de software desarrolladas por algunos tíos aleatorios en todo el Internet) se autentican en un servidor web utilizando un esquema de autenticación "básico" y, para ello, pasan el nombre de usuario y la contraseña con cada solicitud. Cada vez que se pasa un nombre de usuario y una contraseña que no están vacíos, el servidor tiene que hacer un hash de la contraseña y verificar el nombre de usuario y el hash con la base de datos. Esto pone una carga extra en la base de datos.

El enfoque típico para reducir la carga de la base de datos es almacenar en caché los resultados de la autenticación en la memoria del servidor. Es fácil realizar intentos exitosos: solo almacene en caché el nombre de usuario, el hash de la contraseña y un objeto interno que represente al usuario durante, por ejemplo, 20 segundos. Sí, el usuario podrá usar la contraseña anterior por no más de 20 segundos, pero la mayoría de las veces no suena como un gran problema.

¿Qué hay de los intentos fallidos? Si los almaceno durante demasiado tiempo, los usuarios verán que ingresar una contraseña correcta "no funciona". Además, no estoy seguro de si necesito almacenar en caché exactamente los pares de nombres de usuario y las contraseñas incorrectas (de modo que al modificar una contraseña se pierda la memoria caché de inmediato) o si tengo que almacenar en caché solo el hecho de que un usuario específico no se autenticó (por lo que la modificación una contraseña provoca un acierto de caché y el usuario no puede autenticarse con ninguna contraseña hasta que caduque la entrada de caché).

¿Cuál es el enfoque típico para el almacenamiento en caché de intentos de autenticación incorrectos?

    
pregunta sharptooth 17.11.2014 - 15:55
fuente

1 respuesta

1

El enfoque genérico para un caché es mantenerlo sincronizado con la base de datos. En este momento tiene algún sistema, con RAM, que puede decidir si un nombre de usuario + contraseña es correcto o no al verificar su contenido de RAM, dejándolo pasar a la base de datos si la información no está en la RAM (o se considera demasiado antigua). de alguna manera). Si puede hacer que las actualizaciones de contraseñas se realicen de la misma manera, entonces puede asegurarse de que cada vez que se cambie una contraseña, el contenido de la RAM esté actualizado; una implementación simple se vería así:

  • El caché de RAM contiene tuplas ( usuario , contraseña , ok , age ) donde " ok "es un valor booleano (" true "para: coincidencia de usuario + contraseña," false "para una discrepancia conocida), y" age "es la fecha en la que la información se utilizó por última vez.

  • Cuando se realiza un intento de inicio de sesión para el usuario "Bob" y la contraseña "p @ ssw0rd1":

    • Si la memoria caché RAM contiene un triplete ("Bob", "p @ ssw0rd1", z , age ), actualice age a la fecha y hora actuales, y devolver z ("verdadero" en el éxito de la autenticación, "falso" en el fallo de la autenticación)
    • De lo contrario, realice la verificación con el valor de hash almacenado en la base de datos, obteniendo el resultado z ("true" o "false"); almacene ("Bob", "p @ assw0rd1", z , now ) en el caché y devuelva z .
  • Cuando el usuario "Bob" cambie su contraseña, elimine todas las tuplas ("Bob", *, *, *) de la caché.

  • El caché tiene un tamaño limitado. Si la memoria caché está llena y desea insertar una tupla nueva, elimine la más antigua (aquella para la que el campo " age " está más lejos en el pasado). Esto se denomina almacenamiento en caché LRU (como en "Últimamente utilizado recientemente").

No hay una razón específica para tratar los golpes positivos y negativos de manera diferente; O bien contiene una información interesante. Tenga en cuenta que no hay necesidad de un límite de tiempo aquí; Siempre que la memoria caché se actualice (o simplemente se vacíe) cuando hay un cambio de contraseña, no hay ningún problema en mantener las entradas de la memoria caché por un tiempo arbitrario.

Si no puede actualizar la memoria caché tras los cambios de contraseña, entonces debe establecer un tiempo de espera corto para que la información almacenada en la memoria caché no se use si es más antigua que, por ejemplo, 20 segundos (como prevé). De nuevo, los golpes positivos y negativos no necesitan ser manejados de manera diferente; de hecho, se puede argumentar que el almacenamiento en caché de los impactos negativos (desajuste de usuario + contraseña) es necesariamente seguro ya que, en el peor de los casos, mantiene a los usuarios fuera; El almacenamiento en caché de aciertos positivos puede, por otro lado, permitir la entrada de personas con una contraseña que se ha invalidado (aunque con un tiempo de espera de 20 segundos, la ventana de vulnerabilidad es bastante pequeña).

Resumen: el almacenamiento en caché de fallos de autenticación es bueno, porque es a prueba de fallos (no otorgará entrada cuando no debería). Sin embargo, tenga en cuenta que no frustrará DDoS: un atacante DDoS simplemente enviará muchas solicitudes con contraseñas aleatorias, es decir, solicitudes que nunca están en el caché en ningún caso. Los errores de autenticación del almacenamiento en caché ayudan contra DDoS involuntario , cuando un usuario ha ingresado la contraseña incorrecta pero no la comprende, y hace clic en "actualizar" repetidamente.

    
respondido por el Tom Leek 17.11.2014 - 17:14
fuente

Lea otras preguntas en las etiquetas