J'ai besoin d'un moyen de suivre et de limiter les sessions Web à une application Web. Une "session" est définie de manière lâche comme le seul utilisateur parcourant les pages de ladite application Web. Je pense que cela peut être traduit en:
- une session est définie comme un tuple
<clientIP,vHost>
alternativement comme<clientIP,serverIP,serverPort>
ou<cookie,vHost>
, selon la couche et les données disponibles - une session démarre après que l'utilisateur a envoyé des données d'authentification à un URI de connexion défini
- une session se termine après que l'utilisateur a atteint l'URI de déconnexion défini
- une session se termine si un délai spécifié a expiré après que le client a demandé le dernier objet
Une fois la limite de session spécifiée atteinte, l'utilisateur suivant doit être dirigé vers une page d'erreur personnalisée. J'ai également besoin d'un moyen de suivre le nombre actuel de sessions à des fins de surveillance et de pouvoir mettre sur liste blanche le serveur de surveillance (qui émet périodiquement des requêtes à la webapp) et l'exempter de la limite.
Avec quoi je peux travailler:
- RadWare AppDirector où l'application Web a sa propre batterie de serveurs définie et s'exécute en mode proxy inverse
- Apache 2.2
- SLES 11 SP2
Je préférerais ne pas impliquer de serveur proxy supplémentaire, mais je le considérerais s'il ne reste aucune autre option.
La raison derrière tout cela est que l'application Web susmentionnée est facilement surchargée et commence à refuser les demandes de manière irrégulière, énervant les utilisateurs qui perdent (généralement) des données d'entrée de formulaire dans le processus. En spécifiant une limite où une condition de surcharge est moins probable, nous espérons créer une condition de défaillance bien définie où les utilisateurs seront invités à revenir plus tard si la charge est susceptible de monter en flèche.
Edit : l'application Web est une implémentation à 3 niveaux, le premier niveau (couche de présentation, implémenté en tant que code CGI dans un Apache vHost) étant plutôt simpliste et apparemment limité à la gestion des erreurs de base et à l'équilibrage de la demande entre les serveurs d'applications. Il n'impose aucune charge significative aux serveurs Web sur lesquels il s'exécute - c'est pourquoi nous l'exécutons en mode de basculement simple (pas d'équilibrage de charge) dans la batterie AppDirector, qui est censé simplifier quelque peu les choses.
Tout ce qui dépasse ce point est fondamentalement une boîte noire pour nous - au niveau des données, nous avons une base de données MSSQL, mais il est presque impossible d'obtenir des informations significatives sur la structure de la table auprès du fournisseur. Les serveurs d'applications sont de source fermée, le fournisseur a utilisé un cadre plutôt complet pour la mise en œuvre, mais semble incapable de répondre à des questions liées au fonctionnement encore moins complexes.
la source
Réponses:
Le problème que vous essayez en fin de compte de résoudre concerne la capacité de l'application - et c'est là que vous devriez résoudre le problème. Aucun des composants que vous mentionnez n'a quoi que ce soit à voir avec la gestion de session pour une application HTTP.
Il y a quelques astuces que vous pouvez appliquer avec le module récent dans iptables ou en utilisant fail2ban dans le sens inverse de l'objectif pour lequel il a été conçu - mais ces deux nécessitent une compréhension très détaillée des outils et du domaine du problème. Vous pouvez mettre en œuvre le contrôle d'accès au niveau de ces composants , mais conduit par des informations d'état de l'application publiée sur le nombre de sessions.
En supposant, pour le moment, que l'application est une boîte noire sans possibilité de modification / instrumentation (ce qui est hautement improbable), vous pouvez obtenir ces informations de vos journaux apache en incluant le cookie de session - filtrez ou supprimez les journaux pour maintenir un liste des cookies actifs - et supprimez les entrées de la liste lorsqu'elles coïncident avec l'URL de déconnexion ou n'ont pas été vues pour le TTL.
la source
Ce n'est pas exactement ce que vous demandez, mais j'ai déjà fait ce qui suit avec les équilibreurs de charge F5:
Le site Web étant parfois soumis à une forte charge (courses de chevaux), cela a aidé.
la source
Ce problème peut être résolu à la fois en utilisant RadWare AppDirector et (pour être complet) probablement également en utilisant Apache mod_security selon votre excellente conclusion dans le commentaire ci-dessous.
Pour une solution AppDirector, je pense qu'il est possible de créer deux batteries de serveurs mappant vers le (s) même (s) serveur (s) backend. Ces exploitations peuvent appliquer différents critères et conditions d'exploitation. Une batterie serait la "valeur par défaut" et l'autre répondrait aux URI: s que vous définissez comme étant "une session". Ce dernier obtiendrait une limite au nombre de sessions qu'il accepte dans l'équilibreur de charge.
Je vais désormais remplacer votre terme "session" par "connecté" pour deux raisons:
Il est également possible d'afficher une page désolée si la batterie de serveurs «connectée» a atteint la limite de connexion choisie.
Avant de commencer, je dois clairement déclarer que je n'ai aucune expérience de fonctionnement du produit AppDirector, mais que j'administre quotidiennement un équilibreur de charge concurrent et légèrement moins avancé. Le produit que j'utilise peut faire ce scénario dès le départ. J'ai trouvé des informations dans le Guide de l'utilisateur AppDirector et la documentation en ligne disponible qui suggère que la même chose est vraie pour AppDirector. Cependant, bien que les concepts soient similaires, la terminologie est différente. Je fais simplement un acte quand à Rome en ce qui concerne le libellé, en espérant avoir les choses correctes sans être trop évidemment un crétin ignorant.
Le plus grand obstacle était d'avoir accès à un manuel, qui n'est disponible que si l'on est un client actif. Grâce à quelques recherches sur Google, il a été possible de trouver une ancienne version qui, je l'espère, n'est pas trop obsolète, j'ai également trouvé quelques articles de la base de connaissances et ce lien: Radware AppDirector - Configuration: Application de base .
Voici une ébauche de solution, telle qu'interprétée principalement par le guide de l'utilisateur:
L'entrée du client dans l'équilibreur de charge se fait via un VIP qui est utilisé pour connecter à la fois les sessions "par défaut" et les "sessions connectées". Ceci est réalisé grâce à une politique L4 selon p.99 dans le Guide de l'utilisateur:
La politique L4 peut être liée aux politiques L7 qui sont utilisées pour sélectionner une batterie de serveurs appropriée. Le processus de stratégie L7 est décrit ainsi dans le Guide de l'utilisateur p.104:
Les méthodes disponibles pour définir un comportement L7 sont décrites à la p.106, dont vous pouvez choisir une méthode appropriée pour choisir le routage vers votre batterie de serveurs "connectée" plutôt que vers la batterie de serveurs "par défaut":
Comme le montre le lien de l' application de base , on pourrait par exemple créer une stratégie L7 évaluant les modèles d'URI pour le routage vers différentes batteries. Les modèles d'URI constitués «^ / login? = True» et «^ / login» peuvent être acheminés vers votre batterie de serveurs «connectée». Le modèle composé '^ / logout' (et tous les autres URI: s) pourrait également être routé vers une batterie de serveurs "par défaut".
Une batterie de serveurs est définie par le Guide de l'utilisateur p.121 ainsi: "Une batterie de serveurs AppDirector est un groupe de serveurs en réseau qui fournissent le même service [...] Un serveur qui fournit plusieurs services peut être utilisé dans plusieurs batteries de serveurs."
Un serveur est en outre différencié en séparant la définition d'un serveur principal en deux couches, la couche objet «Physical Server» qui représente l'adresse IP d'un serveur et la couche objet «Farm Server» qui représente les services exécutés sur un ou plusieurs serveurs physiques. .
Selon le «Guide de l'utilisateur AppDirector», la limitation de session sur une batterie de serveurs peut être effectuée pour chaque objet Farm Server défini pour une batterie de serveurs (ainsi que par d'autres moyens) en plus de chaque objet Physical Server. Ceci est décrit entre autres à la p.137:
La table client et son «mode régulier» sont définis à la p.153:
Dans une capture d'écran d'une fenêtre de définition de serveur sur la page Application de base , la zone de limite de connexion au serveur apparaît juste à côté de la zone de limite de bande passante.
Donc, un peu en fonction de la configuration, mais pour les besoins de cette réponse, une «connexion» telle que définie via la table client et une «session» telle que définie par vous finissent essentiellement par être la même chose. Et une limite à cet effet peut être imposée par objet serveur dans une batterie de serveurs.
Comme AppDirector fait la différence entre les serveurs physiques et les serveurs de batterie de serveurs, il serait possible de définir deux serveurs de batterie de serveurs mappant à votre objet serveur physique Apache, l'un ayant une limite de connexion faible.
Cependant, Apache doit également répondre aux appels des deux objets serveur de batterie de serveurs, par exemple en étant appelé sur deux ports ou adresses IP distincts - un étant utilisé par chaque combo (batterie de serveurs / batterie de serveurs). La question devient alors: êtes-vous capable de définir deux points d'entrée de serveur d'applications? c'est-à-dire êtes-vous en mesure d'équiper votre application frontale Apache (/ vhost?) pour répondre sur deux ports ou adresses IP (une par batterie)? C'est à travers un peu de devinettes car je ne souhaite pas passer trop de temps avec le manuel, mais je suis sûr que vous pourriez résoudre ce problème assez élégamment en regardant l'interface graphique AppDirector et Apache.
La définition de la limite de connexion est un peu bizarre. Depuis les serveurs physiques, limite de connexion p.140:
Vous devez donc définir une limite de connexion très élevée (avec une large marge au nombre maximum possible via votre base d'utilisateurs) pour le serveur de ferme "par défaut" sans restriction, et définir la limite de connexion pour le serveur de ferme "connecté" comme aussi bas que vous devez. La définition de serveur physique devrait avoir la somme des deux comme limite de connexion, comme condition préalable à l'activation de la limite de session souhaitée.
Vous avez également cette exigence dans votre question:
C'est ce qu'on appelle une «page sans service HTTP» dans le Guide de l'utilisateur, p.134:
Pour la partie suivi je n'ai pas fait de recherche approfondie mais voici ce que je pense:
AppDirector semble avoir des MIB. Probablement une douleur pour trouver le bon OID comme il est habituellement, mais vous pouvez probablement le snmp à votre outil de choix.
Celui-ci pourrait nécessiter une réflexion créative. En supposant que AppDirector n'inclut pas de modèle pour cela dès la sortie de la boîte, que diriez-vous:
la source
Si AppDirector ne peut pas vous aider, voici une autre approche qui nécessitera un peu de codage. J'attaquerais le problème comme suit:
La représentation graphique du nombre de sessions devient aussi simple que la représentation graphique de la longueur de la chaîne iptables. Le serveur de surveillance peut simplement être toujours sur liste blanche.
la source