Un código de autenticación de mensaje adecuado para REST

7

Mi servicio REST actualmente usa la autenticación SCRAM para emitir tokens para llamantes y usuarios.

Los tokens emitidos por el intercambio SCRAM tienen un tiempo de caducidad después del cual se requiere un inicio de sesión repetido. También emitiremos tokens 'infinitos' que no tienen vencimiento para simplificar la integración para las personas (que usarán nuestro servicio para uso personal) y en preparación para un punto final de JSONP.

Tenemos la capacidad de revocar los privilegios de las personas que llaman (la cuenta a la que se adjunta el token) y prohibir las IP, así como imponer cuotas a cualquier tipo de solicitud en cualquier período de tiempo.

Una cosa que no he implementado, sin embargo, es MAC para solicitudes. A medida que lo he pensado más, para algunas solicitudes creo que es necesario, ya que de lo contrario se pueden robar tokens y antes de identificar esto y desactivar la cuenta de la persona que llama asociada, se podrían causar daños a nuestras cuentas de usuario.

En muchos sistemas, el MAC se genera desde el cuerpo o la cadena de consulta de la solicitud, sin embargo, esto es difícil de implementar ya que estoy usando la API web de ASP.Net y no quiero leer el cuerpo dos veces. Igualmente importante, quiero que sea sencillo para que las personas que llaman puedan acceder al servicio, y tengo que ser capaz de admitir tanto aplicaciones de escritorio / móviles como navegadores web.

Entonces, lo que estoy pensando es tener una clave MAC enviada a un usuario en el registro, y hacer que calculen una solicitud MAC en:

  • la url, posiblemente menos una cadena de consulta
  • el verbo
  • la IP de la solicitud (aunque potencialmente es una barrera en algunos dispositivos móviles y definitivamente está en javascript)
  • utc fecha y hora en que el cliente emite la solicitud.

Por supuesto, el cliente enviaría esa cadena en el encabezado de una solicitud, por supuesto, y puedo usarla para decidir si la solicitud es lo suficientemente "nueva".

Mi idea es que, si bien esto no evita la manipulación del mensaje, sí evita el uso de una solicitud modelo para usarla como plantilla para diferentes solicitudes posteriores por parte de un tercero malintencionado. Creo que solo el hombre más agresivo en el ataque central podría subvertir esto, y no creo que nuestros servicios ofrezcan ninguna información o habilidad que sea lo suficientemente valiosa como para justificar eso.

Los servicios también usarán SSL, para cosas sensibles. Y si hago esto, entonces estaré usando HMAC-SHA-256 con la clave generada usando un PRNG.

¿Esto suena lo suficiente? ¿Me he perdido algo?

No creo que sea un principiante cuando se trata de seguridad, pero cuando trabajo en ello siempre lo hago. Estoy envuelto en dudas, ¡así que aprecio tener esta comunidad a la que llamar!

    
pregunta Andras Zoltan 28.10.2012 - 12:51
fuente

2 respuestas

4

Si usa SSL para el transporte, y lo hace correctamente, entonces cualquier MAC adicional es redundante; y, cuando se trata de eso, también lo es SCRAM . Un punto de venta de SCRAM es que se supone que debe resistir situaciones en las que se utiliza SSL incorrectamente , es decir, sin la autenticación apropiada del servidor (desafortunadamente, sucede ). Pero el argumento de seguridad de SCRAM es bastante débil en tal situación, porque no impedirá que un man-in- el ataque medio ; y, sin un MitM, la contraseña simple básica dentro de SSL ya es buena. La única ventaja de SCRAM sobre una contraseña simple es que, en caso de un MitM, el atacante no aprende la contraseña de inmediato. Todavía ve todos los datos intercambiados, puede insertar sus propios comandos y obtiene suficientes datos para realizar un ataque de diccionario sin conexión , algo de lo que muy pocas contraseñas vienen ilesas.

En su propuesta para agregar un MAC, no dice de dónde proviene la clave de MAC. Esto es crítico. Un MAC tiene cualquier valor solo mientras la clave sea desconocida para el atacante. Pero si el cliente y el servidor ya comparten una clave desconocida para el atacante, ¿por qué se molestarían con una contraseña y SCRAM? Permítales usar Clave precompartida TLS , es decir, SSL / TLS con la clave compartida como base para la autenticación y el cifrado mutuos: no certificado en absoluto (por lo que no hay validación de certificado para equivocarse), operación astuta y rápida

Aún mejor, si el cliente y el servidor comparten una contraseña, no quieren usar certificados, temen los ataques del diccionario sin conexión, y no quieren que el servidor almacene las contraseñas tal como están, entonces la solución es TLS-SRP . El cliente y el servidor se autentican entre sí con respecto a una contraseña común, el servidor no almacena la contraseña sino solo un equivalente de hash de la misma, y la contraseña está a salvo de los ataques del diccionario sin conexión, incluso en caso de un intento MitM (no solo se frustra el intento, sino que el atacante ni siquiera obtiene datos suficientes para "probar las contraseñas en casa").

Los diseñadores de SCRAM probablemente recibieron información sobre SRP en algún momento, porque agregaron en la sección 9 de la especificación el siguiente párrafo:

  

Los mecanismos de autenticación que protegen contra este ataque son      disponible (por ejemplo, la clase de mecanismos EKE). RFC 2945 [RFC2945] es      Un ejemplo de tal tecnología. El WG eligió no usar EKE como      Los mecanismos como base para SCRAM.

No dan ninguna justificación de por qué rechazan los protocolos de PAKE (que denominan de forma incorrecta "EKE", que es solo el nombre del primer protocolo PAKE conocido).

    
respondido por el Thomas Pornin 31.10.2012 - 00:27
fuente
0

Para la mayoría de las configuraciones, te recomiendo que uses solo tokens HTTPS (SSL) y CSRF. Esta es la arquitectura estándar para asegurar una aplicación web / servicio web. Si usa tokens HTTPS + CSRF, no necesita un MAC.

Me gustaría rechazar la idea de "usar SSL solo para las cosas sensibles". Eso tiene algunos problemas. Recomendaría usar HTTPS en todo el sitio. Busque en este sitio información sobre las ventajas y desventajas de usar SSL en todo el sitio y cómo implementarlo.

No sé si su interfaz es solo para uso programático o si también será utilizada por humanos. Si es así, HTTPS probablemente también proporcionará la mejor facilidad de uso para los usuarios, si el lado del cliente tiene un humano sentado detrás de un navegador web.

    
respondido por el D.W. 31.10.2012 - 12:59
fuente

Lea otras preguntas en las etiquetas