Necesito una forma de rastrear y limitar las sesiones web a una aplicación web. Una "sesión" se define libremente como el usuario único que navega por las páginas de dicha aplicación web. Creo que se puede traducir a:
- una sesión se define como una tupla o
<clientIP,vHost>
como , dependiendo de la capa y los datos disponibles<clientIP,serverIP,serverPort>
<cookie,vHost>
- una sesión comienza después de que el usuario haya enviado datos de autenticación a un URI de inicio de sesión definido
- una sesión finaliza después de que el usuario haya alcanzado el URI de cierre de sesión definido
- una sesión finaliza si un tiempo de espera especificado ha expirado después de que el cliente haya solicitado el último objeto
Una vez alcanzado el límite de sesión especificado, el siguiente usuario debe ser dirigido a una página de error personalizada. También necesito una forma de rastrear el número actual de sesiones para fines de monitoreo y la capacidad de incluir en la lista blanca el servidor de monitoreo (que está emitiendo consultas a la aplicación web periódicamente) y eximirlo del límite.
Con qué puedo trabajar:
- RadWare AppDirector donde la aplicación web tiene una granja definida y se ejecuta en modo proxy inverso
- Apache 2.2
- SLES 11 SP2
Preferiría no involucrar un servidor proxy adicional, aunque lo consideraría si no quedan otras opciones.
La razón detrás de todo esto es que la aplicación web mencionada anteriormente se sobrecarga fácilmente y comienza a rechazar solicitudes de forma errática, molestando a los usuarios que trabajan (por lo general) pierden datos de ingreso de formularios en el proceso. Al especificar un límite en el que es menos probable una condición de sobrecarga, esperamos crear una condición de falla bien definida en la que a los usuarios se les diga que regresen más tarde si es probable que la carga aumente.
Editar : la aplicación web es una implementación de 3 niveles con el primer nivel (capa de presentación, implementado como código CGI en un Apache vHost) que es bastante simplista y aparentemente limitado al manejo de errores básicos y al equilibrio de carga de solicitudes entre los servidores de aplicaciones. No impone ninguna carga significativa en los servidores web en los que se ejecuta, es por eso que lo estamos ejecutando en modo de conmutación por error simple (sin equilibrio de carga) en la granja AppDirector, que se supone que simplifica las cosas.
Todo lo que está más allá de este punto es básicamente un cuadro negro para nosotros: en el nivel de datos tenemos una base de datos MSSQL, pero es casi imposible obtener información significativa sobre la estructura de la tabla del proveedor. Los servidores de aplicaciones son de código cerrado, el proveedor ha utilizado un marco bastante completo para la implementación, pero parece incapaz de responder incluso preguntas menos complejas relacionadas con la operación.
fuente
Respuestas:
El problema que en última instancia está tratando de resolver es con la capacidad de la aplicación, y ahí es donde debería resolver el problema. Ninguno de los componentes que menciona tiene algo que ver con la administración de sesiones para una aplicación HTTP.
Hay algunos trucos que puede aplicar con el módulo reciente en iptables o usando fail2ban de manera opuesta al propósito para el que fue diseñado, pero ambos requieren una comprensión muy detallada de las herramientas y el dominio del problema. Puede implementar el control de acceso a nivel de estos componentes pero impulsado por la información de estado publicada de la aplicación sobre el número de sesiones.
Suponiendo, por el momento, que la aplicación es un recuadro negro sin posibilidad de modificación / instrumentación (lo cual es muy improbable), puede obtener esta información de sus registros de apache incluyendo el cookie de sesión - filtrar o seguir los registros para mantener un lista de cookies activas, y elimine las entradas de la lista cuando coincidan con la URL de cierre de sesión o no se hayan visto para el TTL.
fuente
Esto no es exactamente lo que está pidiendo, pero ya he hecho lo siguiente con los equilibradores de carga F5:
Como el sitio web a veces estaba bajo una gran carga (carreras de caballos), ayudó.
fuente
Este problema se puede resolver usando RadWare AppDirector y (para completar) probablemente también usando Apache mod_security según su excelente hallazgo en el comentario a continuación.
Para una solución AppDirector, creo que es posible crear dos granjas asignadas a los mismos servidores de fondo. Estas granjas pueden tener diferentes criterios y condiciones de operación aplicadas a ellas. Una granja sería la "predeterminada" y la otra respondería a los URI: s que usted define como "una sesión". Este último obtendría un límite en la cantidad de sesiones que acepta en el equilibrador de carga.
De ahora en adelante, voy a sustituir su término de "sesión" por "conectado" por dos razones:
También es posible mostrar una página de disculpas si la granja "iniciada" ha alcanzado el límite de conexión elegido.
Antes de llegar al cómo, debo decir claramente que no tengo experiencia operativa con el producto AppDirector, pero administro diariamente un equilibrador de carga competitivo y un poco menos avanzado. El producto que uso puede hacer este escenario de inmediato. He encontrado información a través de la Guía del usuario de AppDirector y qué documentación en línea está disponible, lo que sugiere que lo mismo es cierto para AppDirector. Sin embargo, si bien los conceptos son similares, la terminología es diferente. Simplemente estoy haciendo un acto cuando estoy en Roma con respecto a la redacción, con la esperanza de hacerlo bien sin ser obviamente un imbécil despistado.
El mayor obstáculo fue obtener acceso a un manual, que no está disponible a menos que uno sea un cliente activo. A través de algunas búsquedas en Google fue posible encontrar una versión anterior que espero no esté demasiado desactualizada, también encontré un par de artículos de la base de conocimiento y este enlace: Radware AppDirector - Configuración: Aplicación básica .
Aquí hay un borrador de solución, interpretado principalmente a través de la Guía del usuario:
La entrada del cliente al equilibrador de carga se realiza a través de un VIP que se utiliza para conectar las sesiones "predeterminadas" y las "sesiones conectadas". Esto se logra a través de una política L4 según p.99 en la Guía del usuario:
La política L4 se puede vincular a las políticas L7 que se utilizan para seleccionar una granja adecuada. El proceso de la política L7 se describe así en la Guía del usuario p.104:
Los métodos disponibles para definir un comportamiento L7 se describen en la p.106, de los cuales puede elegir un método adecuado para elegir el enrutamiento a su granja "iniciada" en lugar de la granja "predeterminada":
Como se ve en el enlace de la Aplicación básica , se podría crear, por ejemplo, una política L7 que evalúe los patrones de URI para el enrutamiento a diferentes granjas. Los patrones de URI creados '^ / login? = True' y '^ / loginin' se pueden enrutar a su granja de servidores "iniciada sesión". El patrón inventado '^ / logout' (y todos los demás URI: s) podrían enrutarse de manera similar a una granja "predeterminada".
La Guía del usuario, p. 121, define una granja de servidores de la siguiente manera: "Una granja de AppDirector es un grupo de servidores en red que proporcionan el mismo servicio. Un servidor que proporciona múltiples servicios puede utilizarse en varias granjas".
Un servidor se diferencia aún más mediante la separación de la definición de un servidor de fondo en dos capas, la capa de objeto 'Servidor físico' que representa la dirección IP de un servidor y la capa de objeto 'Servidor agrícola' que representa los servicios que se ejecutan en uno o más Servidores físicos .
La limitación de sesión en una granja de servidores se puede realizar de acuerdo con la 'Guía del usuario de AppDirector' por cada objeto del servidor de granja definido para una granja (así como a través de otros medios) además de por objeto del servidor físico. Esto se describe entre otros lugares en la p.137:
La tabla de clientes y su 'modo regular' se definen en la p.153:
En una captura de pantalla de una ventana de definición de servidor en la página de Aplicación Básica , el cuadro de límite de conexión del servidor se ve justo al lado del cuadro de límite de ancho de banda.
Por lo tanto, depende un poco de la configuración, pero a los fines de esta respuesta, una 'conexión' definida a través de la Tabla del cliente y una 'sesión' definida por usted esencialmente terminan siendo lo mismo. Y se puede imponer un límite a ese efecto por objeto de servidor en una granja.
Como AppDirector distingue entre servidores físicos y servidores de granja, sería posible definir dos servidores de granja de mapeo a su objeto de servidor físico Apache, uno con un límite de conexión bajo.
Sin embargo, Apache también necesita responder llamadas de ambos objetos del servidor de la granja de servidores, por ejemplo, a través de dos puertos o direcciones IP separados, uno usado por cada combo (granja / servidor de granja). La pregunta es: ¿puede definir dos puntos de entrada del servidor de aplicaciones? es decir, ¿puede equipar su aplicación front-end Apache (/ vhost?) para responder en dos puertos o direcciones IP (una por granja)? Esto es a través de un poco de trabajo de conjetura, ya que no deseo pasar demasiado tiempo con el manual, pero estoy seguro de que podría resolverlo de manera bastante elegante cuando realmente mire la GUI de AppDirector y el Apache.
Establecer el límite de conexión tiene un pequeño capricho. Desde servidores físicos, límite de conexión p.140:
Por lo tanto, deberá definir un Límite de conexión muy alto (con un amplio margen hasta el número máximo posible a través de su base de usuarios) para el servidor de granja "predeterminado" sin restricciones, y establecer el Límite de conexión para el servidor de granja "conectado" como bajo como tienes que hacerlo. La definición del servidor físico necesitaría tener la suma de los dos como su límite de conexión, como condición previa para activar el límite de sesión deseado.
También tiene este requisito en su pregunta:
Esto se denomina 'No hay página de servicio HTTP' en la Guía del usuario, p.134:
Para la parte de monitoreo no he hecho una investigación exhaustiva, pero esto es lo que pienso:
AppDirector parece tener MIB. Probablemente sea una molestia encontrar el OID correcto, como suele ser, pero probablemente pueda usarlo con la herramienta que elija.
Este podría requerir un poco de pensamiento creativo. Suponiendo que AppDirector no incluya una plantilla para esto de inmediato, ¿qué tal si:
fuente
Si AppDirector no puede ayudarlo, aquí hay otro enfoque que requerirá un poco de codificación. Abordaría el problema de la siguiente manera:
Graficar el número de sesiones se vuelve tan simple como graficar la longitud de la cadena de iptables. El servidor de monitoreo simplemente puede estar siempre en la lista blanca.
fuente