ACTUALIZACIÓN : he concluido mi investigación sobre este problema y he publicado una larga entrada de blog que explica mis conclusiones: La vulnerabilidad no expresada de JWTs . Explico que el gran impulso para usar JWT para la autenticación local está dejando de lado un detalle crucial: que la clave de firma debe estar protegida. También explico que, a menos que esté dispuesto a hacer todo lo posible para proteger las claves, es mejor delegar la autenticación a través de Oauth o usar los identificadores de sesión tradicionales.
(Esta publicación ha estado soportando una batalla de voto ascendente / voto descendente y ha sido tan baja como -2. Antes se me pagaba para evaluar los sistemas de seguridad, así que intente no descartar esta investigación y las anteriores. conclusiones vinculadas de manera directa.
Estoy viendo blog tras blog y libro tras libro tout JSON Web Tokens (JWTs) como un medio para las API altamente escalables que no tienen que llegar a la base de datos para autorizar cada solicitud. Sé que confirmar una firma ahorra una búsqueda en la base de datos, pero también me parece que este enfoque pone a los servidores en un riesgo mucho mayor de explotación.
Considere el escenario en el que un atacante ingresa en un servidor y adquiere acceso de lectura a todo el sistema de archivos, incluidas las bases de datos. También asuma que la intrusión no se detecta durante un tiempo.
Una solución tradicional almacenará hashes de contraseñas y hashes de ID de sesión, dejando al atacante aún sin poder explotar la aplicación a través de sus interfaces. Por otro lado, si el servidor emite JWT firmados para la autorización en sentido descendente, la clave de firma debe residir en un lugar sin daños. Si el atacante lo localiza, a partir de ese momento, el atacante puede forjar tokens JWT no vencidos para acceder a los servidores intermedios sin ser detectado. (El atacante podría detectarse al hacer búsquedas para confirmar al cliente, pero eso anularía el propósito de usar firmas JWT para la autorización escalable).
Las violaciones del servidor ocurren. En general, las cuentas pueden leer más de lo que pueden escribir, por lo que parece razonable suponer que la mayoría de las infracciones son de solo lectura. Cuando ocurren, las compañías se sienten orgullosas cuando pueden declarar que el impacto fue mínimo en virtud del almacenamiento de valores con hash en lugar de texto simple. Desafortunadamente, bajo la autorización basada en JWT, la compañía tendría que decir que sí, hacen contraseñas de hash, pero todas las cuentas estaban comprometidas de todos modos. (Las sesiones suelen ser un problema menor debido a sus duraciones más cortas).
Entiendo que hay muchos usos legítimos de las claves, que existen varios métodos para proteger las claves y que, por lo general, el robo de las claves tiene graves consecuencias. Sin embargo, en este caso, las personas proponen reemplazar un mecanismo de autorización anterior por uno más nuevo y menos seguro. Eso es lo que no tiene sentido para mí.
Y, sin embargo, muchas personas inteligentes han puesto mucho esfuerzo en los estándares e implementaciones de firma de JWT. La existencia del protocolo de introspección del token de Oauth es otra prueba para mí de que los sistemas seguros no confiarían solo en el token para la autorización. Entonces, ¿cuáles son los beneficios reales de los JWT firmados? ¿Para qué son realmente las firmas JWT?
Estos son los usos aparentemente más legítimos que conozco:
- Firmar con un secreto de todo el servidor permite minimizar el impacto de los ataques DoS, porque las solicitudes generalmente se pueden detener antes de llegar a la base de datos.
- Para validar los datos de carga útil de JWT que requieren solo un nivel de seguridad intermedio. (Me cuesta mucho imaginar esos datos).
- Para permitir que los microservicios que no son de confianza compartan de manera eficiente la información de autorización adquirida de un servicio de autenticación comúnmente confiable. Consulte la descripción de en las API de Nordic . (Pero sigo intentando apreciar el beneficio).
Pensé en el primero de estos, aunque probablemente otros también lo hayan hecho. Tengo problemas para entender los otros usos. Todavía no he visto una explicación clara y convincente de por qué alguien está firmando JWT.
¿Cuál es la verdadera primicia? Gracias por tu ayuda!
(Contexto de la pregunta: estoy tratando de decidir si abandonar la idea de obtener escalabilidad a través de la autorización basada en firmas).
P.S. He visto las firmas JWT descritas como un esquema alternativo de "autenticación". Estoy bastante seguro de que la autenticación se produce en la adquisición del token y, a partir de entonces, solo es una autorización. Por favor, corrígeme si me equivoco.