Мне нужен способ отслеживать и ограничивать веб-сессии веб-приложением. «Сеанс» определяется как отдельный пользователь, просматривающий страницы указанного веб-приложения. Я думаю, что это может быть переведено на:
- сеанс определяется как кортеж в качестве
<clientIP,vHost>
альтернативы<clientIP,serverIP,serverPort>
или<cookie,vHost>
, в зависимости от уровня и доступных данных - сеанс начинается после того, как пользователь отправил данные аутентификации на определенный URI входа
- сеанс заканчивается после того, как пользователь нажал на определенный URI выхода из системы
- сеанс заканчивается, если указанный тайм-аут истек после того, как клиент запросил последний объект
После того, как указанный предел сеанса будет достигнут, следующий пользователь должен быть направлен на пользовательскую страницу ошибки. Мне также нужен способ отслеживания текущего количества сеансов для целей мониторинга и возможность внесения в белый список сервера мониторинга (который периодически отправляет запросы в веб-приложение) и освобождения его от ограничения.
С чем я могу работать:
- RadWare AppDirector, где веб-приложение имеет собственную ферму и работает в режиме обратного прокси
- Apache 2.2
- SLES 11 SP2
Я бы предпочел не привлекать дополнительный прокси-сервер, хотя рассмотрел бы его, если бы не осталось других вариантов.
Обоснование всего этого заключается в том, что вышеупомянутое веб-приложение легко перегружается и начинает беспорядочно отклонять запросы, раздражая работающих пользователей, которые (как правило) теряют данные ввода формы в процессе. Устанавливая предел, при котором условие перегрузки является менее вероятным, мы надеемся создать четко определенное условие отказа, при котором пользователям будет предложено вернуться позже, если нагрузка может резко возрасти.
Редактировать : веб-приложение представляет собой трехуровневую реализацию, причем первый уровень (уровень представления, реализованный в виде кода CGI в Apache vHost) довольно прост и явно ограничен базовой обработкой ошибок и балансировкой нагрузки запросов между серверами приложений. Он не создает какой-либо значительной нагрузки на веб-серверы, на которых он работает - поэтому мы запускаем его в простом режиме отработки отказа (без балансировки нагрузки) в ферме AppDirector, что должно несколько упростить ситуацию.
Все, что находится за пределами этого пункта, является для нас в основном черным ящиком - на уровне данных у нас есть база данных MSSQL, но практически невозможно получить какую-либо значимую информацию о структуре таблицы от поставщика. Серверы приложений с закрытым исходным кодом, поставщик использовал довольно комплексную структуру для реализации, но, похоже, не может ответить даже на менее сложные вопросы, связанные с работой.
источник
Ответы:
Проблема, которую вы в конечном итоге пытаетесь решить, связана с возможностями приложения - и именно здесь вы должны решить проблему. Ни один из упомянутых вами компонентов не имеет ничего общего с управлением сеансами для приложения HTTP.
Есть некоторые приемы, которые вы можете применить с последним модулем в iptables или использовать fail2ban в противоположность цели, для которой он был разработан - но оба они требуют очень детального понимания инструментов и предметной области. Вы можете реализовать управление доступом на уровне этих компонентов, но на основе опубликованной информации о состоянии из приложения о количестве сеансов.
Предполагая, что на данный момент приложение является черным ящиком без возможности модификации / инструментария (что крайне маловероятно), вы можете получить эту информацию из ваших журналов apache, включив cookie-фильтр сеанса или отфильтровывая журналы, чтобы поддерживать список активных файлов cookie - и удаляйте записи из списка, если они совпадают с URL-адресом выхода из системы или не были просмотрены для TTL.
источник
Это не совсем то, что вы просите, но я уже сделал следующее с балансировщиком нагрузки F5:
Поскольку сайт иногда находился под большой нагрузкой (скачки), это помогло.
источник
Эта проблема решаема как с помощью RadWare AppDirector, так и (для полноты), вероятно, также с помощью Apache mod_security согласно вашему превосходному выводу в комментарии ниже.
Я считаю, что для решения AppDirector можно создать две фермы, сопоставленные с одним и тем же внутренним сервером. Эти фермы могут иметь различные критерии и условия эксплуатации, применяемые к ним. Одна ферма будет «по умолчанию», а другая будет отвечать на URI, которые вы определяете как «сеанс». Последний получит ограничение на количество сеансов, которые он принимает в балансировщике нагрузки.
Теперь я собираюсь заменить ваш термин "сеанс" на "вход в систему" по двум причинам:
Также можно показать страницу с сожалением, если ферма «вошла в систему» достигла выбранного лимита подключения.
Прежде чем перейти к тому, как, я должен четко заявить, что у меня нет опыта работы с продуктом AppDirector, но я ежедневно администрирую конкурирующий и немного менее продвинутый балансировщик нагрузки. Продукт, который я использую, может реализовать этот сценарий сразу. Я нашел информацию в Руководстве пользователя AppDirector и о том, какая онлайн-документация доступна, что предполагает, что то же самое относится и к AppDirector. Однако, хотя понятия похожи, терминология другая. Я просто делаю акт «когда в Риме» в отношении формулировок, в надежде сделать это совершенно правильно, не будучи слишком очевидным идиотом.
Самым большим препятствием было получение доступа к руководству, которое недоступно, если только вы не являетесь активным клиентом. Посредством некоторого поиска в Google удалось найти старую версию, которая, я надеюсь, не слишком устарела, я также нашел пару статей в базе знаний и эту ссылку: Radware AppDirector - Configuration: Basic Application .
Вот черновик решения, интерпретируемый в основном через Руководство пользователя:
Вход клиента в балансировщик нагрузки осуществляется через VIP, который используется для подключения сеансов «по умолчанию» и «сеансов, вошедших в систему». Это достигается с помощью политики L4 согласно п.99 в руководстве пользователя:
Политику L4 можно привязать к политикам L7, которые используются для выбора подходящей фермы. Процесс политики L7 описан таким образом в Руководстве пользователя стр.104:
Методы, доступные для определения поведения L7, описаны на стр.106, из которых вы можете выбрать подходящий метод для выбора маршрутизации к вашей «зарегистрированной» ферме, а не к «стандартной» ферме:
Как видно из ссылки на Основное приложение , можно, например, создать политику L7, оценивающую шаблоны URI для маршрутизации в разные фермы. Сформированные шаблоны URI '^ / login? = True' и '^ / loggedin' могут быть перенаправлены на вашу ферму «вошли в систему». Составленный шаблон '^ / logout' (и все другие URI) также может быть перенаправлен на ферму «по умолчанию».
Ферма определяется в Руководстве пользователя, с.121, таким образом: «Ферма AppDirector - это группа сетевых серверов, которые предоставляют одну и ту же услугу [...] Сервер, который предоставляет несколько услуг, может использоваться в нескольких фермах».
Сервер дополнительно дифференцируется путем разделения определения внутреннего сервера на два уровня: объектный уровень «Физический сервер», который представляет IP-адрес сервера, и объектный уровень «Сервер фермы», который представляет службы, работающие на одном или нескольких физических серверах. ,
В соответствии с «Руководством пользователя AppDirector» ограничение сеанса в ферме может быть выполнено для каждого объекта «Сервер фермы», определенного для фермы (а также с помощью других средств), в дополнение к объекту «Физический сервер». Это описано среди других мест на стр.137:
Таблица клиента и ее «обычный режим» определены на стр. 153:
На снимке экрана с окном определения сервера на странице « Основное приложение» поле ограничения подключения к серверу отображается прямо рядом с полем ограничения полосы пропускания.
Таким образом, немного в зависимости от конфигурации, но для целей этого ответа «соединение», как определено через таблицу клиента, и «сеанс», как вы определено, по сути, в конечном итоге является одним и тем же. И ограничение на этот эффект может быть наложено на один объект сервера в ферме.
Поскольку AppDirector различает физические серверы и серверы фермы, можно определить два сервера фермы, сопоставляемых с вашим объектом физического сервера Apache, один из которых имеет низкий предел подключения.
Однако Apache также должен отвечать на вызовы от обоих объектов сервера фермы, например, через вызовы на двух отдельных портах или IP-адресах - один используется каждой комбинацией (сервер фермы / фермы). Тогда возникает вопрос, можете ли вы определить две точки входа на сервер приложений? т.е. можете ли вы оборудовать ваше внешнее приложение Apache (/ vhost?) для ответа по двум портам или IP-адресам (по одному на ферму)? Это всего лишь небольшая работа с догадками, так как я не хочу тратить слишком много времени на руководство, но я уверен, что вы могли бы решить это довольно элегантно, глядя на графический интерфейс AppDirector и Apache.
Установка ограничения соединения имеет небольшую причуду. С физических серверов, предел подключения стр.140:
Поэтому вам нужно будет определить очень высокий лимит подключений (с широким полем для максимально возможного числа через вашу пользовательскую базу) для неограниченного сервера фермы «по умолчанию» и установить предел подключений для сервера фермы, «вошедшего в систему» как так низко, как ты должен. Определение физического сервера должно иметь сумму двух в качестве своего предела соединения в качестве предварительного условия для активации желаемого предела сеанса.
У вас также есть это требование в вашем вопросе:
Это называется «Нет страницы службы HTTP» в Руководстве пользователя, с.134:
Что касается мониторинга, я не провел столь тщательного исследования, но вот что я думаю:
AppDirector, кажется, имеет MIB. Вероятно, трудно найти правильный OID, как обычно, но вы, вероятно, можете найти его по своему выбору.
Это может потребовать творческого мышления. Предполагая, что AppDirector не включает шаблон для этого прямо из коробки, как насчет:
источник
Если AppDirector не может вам помочь, вот другой подход, который потребует немного кодирования. Я бы решил эту проблему следующим образом:
График количества сеансов становится таким же простым, как и график длины цепочки iptables. Сервер мониторинга просто может быть всегда в белом списке.
источник