Вопрос или проблема
Мы заняты настройкой 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:
-
Определение ACL для сайтов:
acl site1 hdr_end(host) site1.com acl site2 hdr_end(host) site2.net acl site3 hdr_end(host) site3.org
-
Определение разрешенных источников для сайтов:
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
Применение
Теперь, когда мы определили базис конфигурации, необходимо применить её к нашей архитектуре одним из следующих способов:
-
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 предоставляет гибкость и возможность масштабирования, которые необходимы для современного уровня обслуживания и безопасности веб-приложений.