2011-04-11 13 views
13

Ruby on Rails ha admitido sesiones basadas en cookies firmadas for quite some time, con algunos encrypted implementations surgiendo desde entonces. Python y PHP también tienen implementaciones.Jetty/Tomcat encriptado almacenamiento de sesión basado en cookies?

¿Existe tal bestia para los contenedores de servlet Java Jetty o Tomcat?

Hemos recibido importantes mejoras de rendimiento en las sesiones basadas en RDBMS con la implementación de PHP en nuestro entorno agrupado, y me gustaría probar algo similar con una de nuestras aplicaciones Java (que actualmente utiliza Jetty 7).

Soy consciente de otras formas de lograr este objetivo (memcached, synchronized in-memory cachés) pero creo que para nuestra necesidades particulares de las limitaciones de este método de almacenamiento (sesiones de finalización antes de la salida, el almacenamiento en eficientes después de la cookie de tamaño 4K límite, confianza en una clave ultrasecreta del lado del servidor) son superados por el entorno de implementación más simple para esta aplicación en particular.

Si no existe una implementación, ¿alguien tiene alguna idea de por qué no lo haría? (Por ejemplo, las sesiones Java suelen ser más grandes que 4K y, por lo tanto, no son tan adecuadas para este método de almacenamiento)

Respuesta

9

Implementamos Session-In-Cookie y lo utilizamos con éxito en un clúster de Tomcat para permitir el intercambio de sesiones entre 20 nodos y así habilitar despliegues sin interrupción. Acabo de escribir la primera parte de una serie de dos partes sobre la implementación aquí: http://blog.shinetech.com/2012/12/18/simple-session-sharing-in-tomcat-cluster-using-the-session-in-cookie-pattern/. Esta parte trata de la implementación básica, los aspectos de seguridad se tratarán en la segunda parte.

+1

Después de casi dos años, ha respondido a mi pregunta: 1) existe, porque la ha implementado, y 2) no se ha realizado hasta ahora debido a los problemas de "respuesta comprometida" con el enfoque. – tjdett

1

No tengo conocimiento de ningún contenedor que pueda serializar una HttpSession en una cookie. Usted podría lograr este tipo de cosas implementando un Filter que podría serializar el estado de la sesión a una cookie en una respuesta a un cliente web y deserializarlo en la solicitud. Aún está sujeto a las limitaciones de cookies del lado del cliente y debe considerar cuidadosamente las implicaciones de seguridad del estado que está almacenando en el lado del cliente y cuánto confía en que el cliente presente la cookie.

+0

El problema de serialización parece ser un problema que [JDBCSessionManager] (http://docs.codehaus.org/display/JETTY/Session+Clustering+with+a+Database) y [jetty-session-memcached] (http://code.google.com/p/jetty-session-memcached/) ya trato con. La aplicación que planeo probar ya usa la implementación anterior, y los únicos problemas que he tenido se relacionan con garantizar que las clases que almacenan la sesión existan en el contenedor, no en el contexto de servlet. – tjdett

+0

En cuanto a las implicaciones de seguridad, ¿puede pensar en más allá de: * Asegúrese de que la implementación almacene la fecha de caducidad de la sesión dentro de la cookie cifrada y la aplique en el lado del servidor, para evitar la reutilización perpetua de las cookies secuestradas. * Evite utilizar esta implementación para cualquier aplicación en la que la posibilidad de "deshacer" cambios en la sesión suponga un riesgo. * ¡Mantenga la clave de cifrado MUY segura! Me gustaría saber si me falta algo. – tjdett

+0

Creo que puede confundir 2 ideas: la agrupación de sesiones en embarcadero se trata de compartir estado de sesión entre 2 o más instancias de servidor; sí, debería preocuparse por la serialización de los objetos adjuntos a la HttpSession. En este caso, jsessionid, generalmente basado en cookies, es un identificador utilizado por cualquiera de las instancias del servidor para ubicar la sesión compartida. Por lo tanto, puede equilibrar la carga entre los servidores de varias formas. Sin embargo, esto no es lo mismo que serializar el estado de sesión relevante a una cookie. En ese caso, no necesita la agrupación de sesiones en el servidor. Más ... – philwb

1

Parece que hay dos preguntas aquí:

  1. implementaciones de Java/J2EE de gestión de sesiones-efectiva sin estado.
  2. Implementaciones de sesiones seguras.

En cuanto a la primera pregunta: Sí, dependiendo del tamaño de la sesión-gráfico (profundidad de anidamiento de todas las variables de sesión/objetos) la limitación de tamaño de galletas (que es efectivamente una limitación de encabezado HTTP) es un factor significativo. Si el gráfico de sesión encaja perfectamente dentro de la limitación del encabezado HTTP (que en cierta medida es configurable en el lado del servidor web) y/o puede ser aumentado con parámetros de consulta URL basados ​​en REST (para aliviar parte de la información de estado en el servidor) ... entonces una implementación de cookie es posible. Sin embargo, esto sería programático versus manejo de contenedores.

En cuanto a la segunda pregunta: Asegurar sesiones es otra cosa. La notoria cookie común de JSESSIONID en sistemas Java/J2EE es una clave token simple para la sesión en memoria o en caché de disco en el servidor de aplicaciones. Es solo una clave de mapa. Con esa clave, cualquiera puede robar o hacerse pasar por la sesión del usuario. Este es probablemente uno de los enlaces más débiles en todo el aparato de sesión administrado por contenedor. Hay productos comerciales de sesión segura disponibles que evitan el secuestro de la sesión mediante el robo de cookies, evitan los ataques de repetición (que pueden vencer a SSL capturando la repetición de la conversación de inicio de sesión encriptada para obtener una sesión) y otros vectores de ataque. Un producto del que soy consciente puede hacer esto sin cambios en el código (a través de un filtro de seguridad). Sin embargo, no conozco ningún marco general o iniciativa de código abierto para cerrar este agujero, probablemente porque requiere un nivel de experiencia que va más allá del desarrollo general de aplicaciones.

Cuestiones relacionadas