Firmando cookies de sesión

5

El Play Framework para Scala tiene soporte para cookies de sesión firmadas. En el archivo de configuración de la aplicación hay un "secreto de aplicación" que se establece como un número aleatorio seguro cuando se inicializa el código fuente de la aplicación. Este secreto se comparte entre varias copias de la aplicación que se ejecuta en una granja de servidores web para que todas las firmas de cookies puedan verificarse en cualquier servidor.

Cuando se crea una sesión en Play, la sesión se firma automáticamente con el secreto de la aplicación y HMAC-SHA1.

Me preocupa que el mismo secreto de aplicación se use durante la vida de la aplicación. ¿Es válida esta preocupación?

Estaba tratando de encontrar una mejor manera de firmar las cookies, pero conozco el adagio de inventar tus propias técnicas criptográficas.

¿Hay alguna forma aceptada de que todos los servidores compartan un secreto cambiante?

Pensé en lo siguiente (tenga en cuenta que todas las cookies de sesión solo están en la memoria y caducan cuando se cierra el navegador):

  1. Incruste la fecha de firma (UTC) en cada cookie.
  2. La clave de firma se genera aleatoriamente en la primera firma del día (después de la medianoche) y se almacena en la base de datos para que todos los servidores la compartan.
  3. Cuando un servidor necesita firmar una cookie, comprueba su propia clave de firma y la fecha en que se generó y compara esa fecha con la fecha actual.
    • Si la fecha de firma es la misma que la fecha actual, la clave se utiliza para firmar la cookie.
    • Si la fecha de firma es anterior a la fecha actual, el servidor verifica la base de datos en busca de una nueva clave de firma con la fecha actual.
      • Si existe una clave con la fecha actual en la base de datos, se usa para firmar la nueva cookie. Las claves de firma antiguas se conservan (durante un cierto número de días) para verificar las cookies más antiguas.
      • Si no hay una clave para la fecha actual, se genera una nueva (¿cómo manejo múltiples servidores haciendo esto al mismo tiempo en una base de datos NoSQL?).

Como un algoritmo alternativo, puedo generar un nuevo secreto cada día usando HMAC (secreto de la aplicación, fecha actual). Con esto, no necesito almacenar las claves secretas diarias en la base de datos, ya que todos los servidores pueden generar la misma secuencia diaria de claves. No estoy seguro de si esto es más seguro (o menos) que almacenar la clave diaria en la base de datos. Necesito proteger el secreto de la aplicación, pero no más de lo que necesito proteger la base de datos. Se recomienda que el secreto de la aplicación no se almacene en el control de origen, sino que se cargue desde una variable de entorno establecida en cada servidor de producción.

    
pregunta Ralph 27.12.2013 - 15:14
fuente

1 respuesta

6

Insistir en la renovación frecuente de claves es una tradición antigua pero no es obligatorio. En épocas más antiguas, cuando la criptografía era algo para ejércitos y espías, las llaves tenían que ser renovadas porque los espías eran espiados y los soldados eran hechos prisioneros en el curso de sus operaciones diarias; por lo tanto, no era razonable creer que un valor secreto conocido por los agentes de campo podría permanecer en secreto indefinidamente. Así surgió el hábito de renovaciones regulares (y frecuentes) de claves. Esto no se asigna bien a los servidores de Internet, por las siguientes razones:

  • Las intrusiones reales en sus servidores son eventos raros. La situación normal es que no se produce ninguna. Aún desea utilizar mecanismos de detección, pero puede esperar que, en promedio, no se produzcan intrusiones durante meses a la vez.

  • Cuando ocurre una intrusión, el atacante ejecuta su daño principal inmediatamente . Este es un mundo informático; En los 10 segundos posteriores a la intrusión, el atacante instaló su rootkit, descargó todos los datos que le interesaban, modificó algunos registros y se fue. Una renovación diaria de las claves lo "echará" (es decir, hará obsoletas todas las cookies falsas que el atacante podría usar con la clave robada) solo mucho después de que se haya hecho el daño. El dogma de renovación clave se ha consagrado en un momento en que el procesamiento promedio de los datos era cuestión de días o semanas, no de segundos. La escala de tiempo ha cambiado mucho desde estos días.

Por lo tanto, diría que una clave MAC de larga duración no es un problema crucial. Por supuesto, debe tener en cuenta todos los detalles sobre cómo se genera, almacena y comparte esa clave entre sus servidores; es un elemento secreto importante con un alto valor para el atacante. Sin embargo, la renovación es en su mayoría inútil y puede ser peligrosa, ya que afecta la forma en que se almacena y comparte la clave. Con una clave fija y estática, puede almacenar la clave como un archivo protegido por el sistema operativo en cada servidor y compartirlo con un procedimiento manual único en condiciones controladas (por ejemplo, antes los servidores se ponen en línea en realidad ). Si desea renovar las claves automáticamente a diario, entonces necesitará un almacenamiento compartido o un protocolo de red, lo que incrementa inherentemente la exposición de ese valor secreto. Por ejemplo, si usa algún esquema de base de datos para generar y compartir la clave del día, entonces la clave puede convertirse en una presa fácil de un ataque de inyección de SQL, mientras que un archivo simple se hubiera mantenido confidencial.

Por estas razones, le recomiendo que se abstenga de renovar la clave. Hace que el problema sea mucho más complejo de analizar, con una mayor exposición, para una ganancia que, en el mejor de los casos, es altamente cuestionable.

(Nota: esta "firma" se denomina más correctamente como MAC . El término "firma" es, en criptografía , reservado para algoritmos de la persuasión asimétrica, por ejemplo, RSA, mientras que HMAC es parte de "criptografía simétrica", lo que significa que la misma clave se usa para generar el valor MAC y verificarlo.)

    
respondido por el Tom Leek 27.12.2013 - 16:00
fuente

Lea otras preguntas en las etiquetas