Ich brauche eine Möglichkeit, Web-Sitzungen zu verfolgen und auf eine Web-App zu beschränken. Eine "Sitzung" ist lose definiert als der einzelne Benutzer, der die Seiten dieser Web-App durchsucht. Ich denke, es kann übersetzt werden in:
- Eine Sitzung wird als Tupel definiert,
<clientIP,vHost>
alternativ als<clientIP,serverIP,serverPort>
oder<cookie,vHost>
, abhängig von der Ebene und den verfügbaren Daten - Eine Sitzung wird gestartet, nachdem der Benutzer Authentifizierungsdaten an einen definierten Anmelde-URI gesendet hat
- Eine Sitzung wird beendet, nachdem der Benutzer den definierten Abmelde-URI erreicht hat
- Eine Sitzung wird beendet, wenn ein bestimmtes Zeitlimit abgelaufen ist, nachdem der Client das letzte Objekt angefordert hat
Nachdem das angegebene Sitzungslimit erreicht wurde, sollte der nächste Benutzer zu einer benutzerdefinierten Fehlerseite weitergeleitet werden. Ich brauche auch eine Möglichkeit, die aktuelle Anzahl von Sitzungen zu Überwachungszwecken zu verfolgen und den Überwachungsserver (der regelmäßig Abfragen an die Webanwendung ausgibt) auf die Whitelist zu setzen und ihn vom Limit auszunehmen.
Womit ich arbeiten kann:
- RadWare AppDirector, in dem für die Webanwendung eine eigene Farm definiert ist und die im Reverse-Proxy-Modus ausgeführt wird
- Apache 2.2
- SLES 11 SP2
Ich würde es vorziehen, keinen zusätzlichen Proxyserver einzubeziehen, würde es aber in Betracht ziehen, wenn keine anderen Optionen übrig bleiben.
Der Grund dafür ist, dass die oben genannte Web-App leicht überlastet wird und Anfragen unregelmäßig ablehnt, was arbeitende Benutzer verärgert, die (normalerweise) Formulareingabedaten verlieren. Durch die Angabe eines Grenzwerts, bei dem eine Überlastbedingung weniger wahrscheinlich ist, möchten wir eine genau definierte Fehlerbedingung schaffen, bei der Benutzer aufgefordert werden, später zurückzukehren, wenn die Last wahrscheinlich ansteigt.
Bearbeiten : Die Webanwendung ist eine dreistufige Implementierung, wobei die erste Ebene (Präsentationsschicht, implementiert als CGI-Code in einem Apache vHost) eher simpel ist und sich anscheinend auf die grundlegende Fehlerbehandlung und den Lastausgleich zwischen den Anwendungsservern beschränkt. Die Webserver, auf denen es ausgeführt wird, werden nicht wesentlich belastet. Aus diesem Grund wird es in der AppDirector-Farm im Failover-Modus (kein Lastausgleich) ausgeführt, was die Dinge etwas vereinfachen soll.
Alles, was über diesen Punkt hinausgeht, ist für uns im Grunde genommen eine Black Box - auf der Datenebene haben wir eine MSSQL-Datenbank, aber es ist nahezu unmöglich, vom Anbieter aussagekräftige Informationen über die Tabellenstruktur zu erhalten. Die Anwendungsserver sind Closed-Source-Server, der Anbieter hat ein ziemlich umfassendes Framework für die Implementierung verwendet, scheint jedoch nicht in der Lage zu sein, noch weniger komplexe betriebsbezogene Fragen zu beantworten.
quelle
Antworten:
Das Problem, das Sie letztendlich zu lösen versuchen, liegt in der Kapazität der Anwendung - und hier sollten Sie das Problem lösen. Keine der von Ihnen genannten Komponenten hat etwas mit der Sitzungsverwaltung für eine HTTP-Anwendung zu tun .
Es gibt einige Tricks, die Sie mit dem aktuellen Modul in iptables oder der Verwendung von fail2ban in umgekehrter Weise zu dem Zweck anwenden können, für den es entwickelt wurde. Beide erfordern jedoch ein sehr detailliertes Verständnis der Tools und der Problemdomäne. Sie könnten Zugriffskontrolle auf der Ebene dieser Komponenten implementieren , sondern getrieben von veröffentlichten Statusinformationen aus der Anwendung auf der Anzahl der Sitzungen.
Unter der Annahme, dass es sich bei der Anwendung vorerst um eine Black Box ohne Änderungs- / Instrumentierungsspielraum handelt (was höchst unwahrscheinlich ist), können Sie diese Informationen aus Ihren Apache-Protokollen abrufen, indem Sie den Sitzungs-Cookie-Filter hinzufügen oder die Protokolle beenden, um a zu verwalten Liste der aktiven Cookies - und entfernen Sie Einträge aus der Liste, wenn sie mit der Abmelde-URL übereinstimmen oder für die TTL nicht angezeigt wurden.
quelle
Dies ist nicht genau das, wonach Sie fragen, aber ich habe bereits Folgendes mit F5-Load-Balancern gemacht:
Da die Website manchmal stark ausgelastet war (Pferderennen), hat es geholfen.
quelle
Dieses Problem kann sowohl mit dem RadWare AppDirector als auch (der Vollständigkeit halber) wahrscheinlich auch mit Apache mod_security gelöst werden, wie in dem Kommentar unten angegeben.
Für eine AppDirector-Lösung ist es meines Erachtens möglich, zwei Farmen zu erstellen, die denselben Backend-Servern zugeordnet sind. Auf diese Betriebe können unterschiedliche Kriterien und Betriebsbedingungen angewendet werden. Eine Farm wäre die "Standardeinstellung" und die andere würde auf URI: s antworten, die Sie als "Sitzung" definieren. Letzteres würde die Anzahl der Sitzungen, die im Load Balancer akzeptiert werden, begrenzen.
Ich werde von nun an aus zwei Gründen Ihren Begriff "Sitzung" durch "angemeldet" ersetzen:
Es ist auch möglich, eine traurige Seite anzuzeigen, wenn die "angemeldete" Farm das ausgewählte Verbindungslimit erreicht hat.
Bevor ich zum Wie komme, muss ich klar sagen, dass ich keine Betriebserfahrung mit dem AppDirector-Produkt habe, aber täglich einen konkurrierenden und etwas weniger fortgeschrittenen Load Balancer verwalte. Das Produkt, das ich verwende, kann dieses Szenario sofort ausführen. Ich habe Informationen im AppDirector-Benutzerhandbuch gefunden und festgestellt, welche Online-Dokumentation verfügbar ist, was darauf hindeutet, dass dies auch für den AppDirector gilt. Obwohl die Konzepte ähnlich sind, unterscheidet sich die Terminologie. Ich mache einfach einen When-in-Rome-Akt in Bezug auf die Formulierung, in der Hoffnung, es ziemlich richtig zu machen, ohne zu offensichtlich ein ahnungsloser Idiot zu sein.
Die größte Hürde bestand darin, Zugang zu einem Handbuch zu erhalten, das nur zur Verfügung gestellt wird, wenn man ein aktiver Kunde ist. Durch ein bisschen googeln war es möglich, eine alte Version zu finden, von der ich hoffe, dass sie nicht zu veraltet ist. Ich habe auch ein paar Knowledgebase-Artikel und diesen Link gefunden: Radware AppDirector - Konfiguration: Basisanwendung .
Hier ist ein Lösungsentwurf, der hauptsächlich im Benutzerhandbuch interpretiert wird:
Die Client-Eingabe für den Load Balancer erfolgt über einen VIP, mit dem sowohl die "Standard" -Sitzungen als auch die "angemeldeten Sitzungen" verbunden werden. Dies wird durch eine L4-Richtlinie gemäß S.99 im Benutzerhandbuch erreicht:
Die L4-Richtlinie kann an L7-Richtlinien gebunden werden, mit denen eine geeignete Farm ausgewählt wird. Der L7-Richtlinienprozess wird folgendermaßen im Benutzerhandbuch S.104 beschrieben:
Die verfügbaren Methoden zum Definieren eines L7-Verhaltens werden auf S. 106 beschrieben. Sie können eine geeignete Methode auswählen, um das Routing zu Ihrer "angemeldeten" Farm anstelle der "Standard" -Farm auszuwählen:
Wie im Link Basisanwendung zu sehen ist, könnte beispielsweise eine L7-Richtlinie erstellt werden, die URI-Muster für das Routing zu verschiedenen Farmen bewertet. Die zusammengestellten URI-Muster '^ / login? = True' und '^ / logged' können an Ihre "angemeldete" Farm weitergeleitet werden. Das zusammengesetzte Muster '^ / logout' (und alle anderen URI: s) könnte ebenfalls an eine "Standard" -Farm weitergeleitet werden.
Eine Farm wird im Benutzerhandbuch S.121 folgendermaßen definiert: "Eine AppDirector-Farm ist eine Gruppe von Netzwerkservern, die denselben Dienst bereitstellen. [...] Ein Server, der mehrere Dienste bereitstellt, kann in mehreren Farmen verwendet werden."
Ein Server wird weiter unterschieden, indem die Definition eines Back-End-Servers in zwei Schichten unterteilt wird, die Objektschicht "Physischer Server", die die IP-Adresse eines Servers darstellt, und die Objektschicht "Farmserver", die Dienste darstellt, die auf einem oder mehreren physischen Servern ausgeführt werden .
Die Sitzungsbeschränkung in einer Farm kann gemäß dem 'AppDirector-Benutzerhandbuch' für jedes für eine Farm definierte Farm Server-Objekt (sowie auf andere Weise) zusätzlich zu jedem Physical Server-Objekt durchgeführt werden. Dies wird unter anderem auf S.137 beschrieben:
Die Client-Tabelle und ihr 'regulärer Modus' sind auf S.153 definiert:
In einem Screenshot eines Fensters Serverdefinition auf der Basic - Anwendung Seite, wird die Server - Verbindungslimit Feld direkt neben dem Bandbreitengrenze Feld gesehen.
Ein bisschen abhängig von der Konfiguration, aber für die Zwecke dieser Antwort ist eine 'Verbindung', wie sie in der Client-Tabelle definiert ist, und eine 'Sitzung', wie sie von Ihnen definiert wurde, im Wesentlichen dasselbe. Eine entsprechende Begrenzung kann pro Serverobjekt in einer Farm festgelegt werden.
Da der AppDirector zwischen physischen Servern und Farmservern unterscheidet, können zwei Farmserver definiert werden, die Ihrem physischen Apache-Serverobjekt zugeordnet sind, von denen einer ein niedriges Verbindungslimit aufweist.
Apache muss jedoch auch Anrufe von beiden Farmserverobjekten entgegennehmen, z. B. indem er an zwei separaten Ports oder IP-Adressen aufgerufen wird - einer wird von jeder Kombination (Farm / Farmserver) verwendet. Dann stellt sich die Frage, ob Sie zwei Einstiegspunkte für Anwendungsserver definieren können. dh können Sie Ihre Apache-Front-End-Anwendung (/ vhost?) so ausrüsten, dass sie an zwei Ports oder IP-Adressen (einer pro Farm) antwortet? Dies geschieht durch ein wenig Rätselraten, da ich nicht zu viel Zeit mit dem Handbuch verbringen möchte, aber ich bin sicher, dass Sie dies ziemlich elegant lösen können, wenn Sie sich die AppDirector-GUI und den Apache ansehen.
Das Einstellen des Verbindungslimits ist etwas eigenartig. Von physischen Servern, Verbindungslimit S.140:
Sie müssten daher ein sehr hohes Verbindungslimit (mit einem großen Spielraum bis zur maximal möglichen Anzahl durch Ihre Benutzerbasis) für den uneingeschränkten "Standard" -Farmserver definieren und das Verbindungslimit für den "angemeldeten" Farmserver als festlegen niedrig wie du musst. Die physische Serverdefinition muss die Summe der beiden als Verbindungslimit haben, als Voraussetzung für die Aktivierung des gewünschten Sitzungslimits.
Sie haben auch diese Anforderung in Ihrer Frage:
Dies wird im Benutzerhandbuch, S.134, als "Keine HTTP-Dienstseite" bezeichnet:
Für den Überwachungsteil habe ich nicht so gründlich recherchiert, aber hier ist was ich denke:
AppDirector scheint MIBs zu haben. Wahrscheinlich ist es schwierig, die richtige OID zu finden, wie es normalerweise der Fall ist, aber Sie können sie wahrscheinlich an das Werkzeug Ihrer Wahl senden.
Dieser könnte kreatives Denken erfordern. Angenommen, der AppDirector enthält keine sofort einsatzbereite Vorlage. Wie wäre es mit:
quelle
Wenn AppDirector Ihnen nicht helfen kann, ist hier ein anderer Ansatz, der ein wenig Codierung erfordert. Ich würde das Problem wie folgt angehen:
Die grafische Darstellung der Anzahl der Sitzungen wird so einfach wie die grafische Darstellung der Länge der iptables-Kette. Der Überwachungsserver kann einfach immer auf die Whitelist gesetzt werden.
quelle