HAProxy – Множество сайтов, множество ACL’s

Вопрос или проблема

Мы заняты настройкой HAProxy. Почти всё работает, за исключением настройки без множества сайтов с различными ACL.

Что мы хотим:

Использование HAProxy с несколькими сайтами, все на одном IP, все с одними и теми же бэкендами, но с различной блокировкой IP/защитой паролем и именем пользователя.

Что у нас работает:

Получение входящего трафика к бэкенду (с ACL для использования https вместо http).

Ситуация без haproxy/varnish:

Сейчас мы используем apache для обработки ACL (разрешение и запрет IP, а также использование защиты имени пользователя и пароля).

Мы пытались захватывать это через X-Forwarded-For внутри apache. Однако веб-серверы больше не могут общаться друг с другом. Нам пришлось удалить разрешение для подсети (балансировщик нагрузки и веб-сервер находятся в одной подсети). С этим разрешением apache не смотрит на x-forward-header и будет разрешать весь трафик. Без него веб-серверы не могут общаться друг с другом.

У кого-нибудь есть пример или идеи, как нам достичь этого?

Сейчас: интернет -> брандмауэр -> apache

Что мы хотим: интернет -> брандмауэр -> haproxy (ssl-разгрузка) -> varnish -> apache (haproxy и varnish работают на одной машине)

Есть несколько способов настроить это. Самый простой способ, вероятно, с использованием некоторых ACL.

Например:

Определение различных сайтов

acl site1 hdr_end(host) site1.com
acl site2 hdr_end(host) site2.net
acl site3 hdr_end(host) site3.org

(Я использовал hdr_end в заголовке хоста, чтобы совпадать как с любым поддоменом, так и без поддомена. Конечно, вам нужно определить, является ли это также желаемым условием в вашем случае.)

Определение разрешённых источников для сайтов

acl allowed_site1 src 1.2.3.4/32 1.2.4.5/32
acl allowed_site2 src 2.3.4.5/32 3.4.5.0/24
acl allowed_site3 src 4.5.0.0/16

Отклонение всего, что не соответствует

http-request deny if site1 !allowed_site1
http-request deny if site2 !allowed_site2
http-request deny if site3 !allowed_site3

(В основном это читается так: отклонить запрос, если запрос для указанного сайта, но не находится в списке разрешённых IP-адресов)

Ответ или решение

Настройка HAProxy для работы с несколькими сайтами, которые используют одни и те же бэкенды, но имеют различные правила доступа на основе IP-адресов и аутентификации, может быть сложной задачей. Тем не менее, с использованием необходимых средств HAProxy, мы можем достичь требуемого результата, обеспечивая разделение трафика и его обработку в соответствии с разными бизнес-требованиями.

Теория

HAProxy является мощным и гибким инструментом для балансировки нагрузки и управления трафиком. Видение вашей архитектуры — интернет → брандмауэр → HAProxy (SSL offloading) → Varnish → Apache — предполагает несколько уровней, на которых происходит обработка запросов. HAProxy в этом контексте выполняет роль первого уровня распределения на основе правил, определённых в ACL (Access Control List).

Использование HAProxy с несколькими сайтами на одном IP-адресе требует от нас внедрения указанных правил доступа, которые позволяют нам управлять потоками трафика и обеспечивать доступ только для разрешенных IP-адресов. Базовая аутентификация может быть интегрирована или сопутствующими службами, если функциональности самой HAProxy недостаточно.

Пример

Предположим, у нас есть три сайта: site1.com, site2.net и site3.org. Каждый из этих сайтов должен иметь ограничения по IP-адресам, а HTTP-соединения должны быть преобразованы в HTTPS. Вот как это можно настроить в HAProxy:

  1. Определение ACL для сайтов:

    acl site1 hdr_end(host) site1.com
    acl site2 hdr_end(host) site2.net
    acl site3 hdr_end(host) site3.org
  2. Определение разрешенных источников для сайтов:

    acl allowed_site1 src 1.2.3.4/32 1.2.4.5/32
    acl allowed_site2 src 2.3.4.5/32 3.4.5.0/24
    acl allowed_site3 src 4.5.0.0/16
  3. Ограничение доступа:

    http-request deny if site1 !allowed_site1
    http-request deny if site2 !allowed_site2
    http-request deny if site3 !allowed_site3

Применение

Теперь, когда мы определили базис конфигурации, необходимо применить её к нашей архитектуре одним из следующих способов:

  • SSL Offloading: HAProxy может выполнять SSL-терминацию, принимая HTTPS-запросы и передавая их как HTTP к Varnish. Это разгружает конечные серверы (Apache), позволяя им обрабатывать только HTTP-запросы. Настраивается с помощью указания параметров сертификата в конфигурации HAProxy.

  • Интеграция с Varnish: После SSL терминации, запросы поступают в Varnish для кэширования. Это улучшает производительность за счет снижения нагрузки на Apache.

  • Обратная интеграция с Apache: На уровне Apache можно использовать модуль mod_rpaf или эквивалент для правильного учета X-Forwarded-For заголовков, предоставляемых HAProxy. Это корректирует IP-адреса, видимые для приложений, обеспечивая их надежную работу в случае, когда происходит межсерверная коммуникация.

Заключение и дополнительные соображения

Немалую часть успеха при реализации такой архитектуры занимает тщательная настройка ACL в HAProxy и проверка каждой стадии обработки запросов. Механизм HAProxy позволяет реализовать различные схемы аутентификации через интеграцию с внешними системами (например, LDAP или OAuth, если это применимо).

Более глубокая безопасность достигается путем применения политик c использованием WAF (Web Application Firewall) и IDS/IPS-систем, которые могут быть интегрированы для дополнительной защиты перед HAProxy. Кроме того, регулярный аудит конфигураций и мониторинг системных журналов способствуют стабильности работы системы и возможностью быстрой локализации проблем.

Простое добавление новых сайтов или изменения текущих настроек ACL может быть выполнено без перезагрузки HAProxy, что делает эти изменения безопасными для применения в производственной среде. Таким образом, HAProxy предоставляет гибкость и возможность масштабирования, которые необходимы для современного уровня обслуживания и безопасности веб-приложений.

Оцените материал
Добавить комментарий

Капча загружается...