Как реализовать терминацию SSL с помощью HAProxy в Ubuntu 14.04
Введение
HAProxy, что означает High Availability Proxy, — это популярное программное обеспечение с открытым исходным кодом для балансировки нагрузки TCP/HTTP и решение для прокси, которое можно запускать в Linux, Solaris и FreeBSD. Чаще всего его используют для повышения производительности и надежности серверной среды за счет распределения рабочей нагрузки между несколькими серверами (например, веб-сервером, приложением, базой данных). Он используется во многих высококлассных средах, в том числе: GitHub, Imgur, Instagram и Twitter.
В этом руководстве мы рассмотрим, как использовать HAProxy для терминации SSL, шифрования трафика и балансировки нагрузки на ваши веб-серверы. Мы также покажем вам, как использовать HAProxy для перенаправления HTTP-трафика на HTTPS.
Встроенная поддержка SSL была реализована в HAProxy 1.5.x, стабильная версия которого была выпущена в июне 2014 года.
Предпосылки
Для выполнения этого руководства вам необходимо иметь или получить следующее:
- Как минимум один веб-сервер с частной сетью, прослушивающий HTTP (порт 80)
- Корневой доступ к дополнительному VPS, на котором мы установим HAProxy. Инструкции по настройке корневого доступа можно найти здесь (шаги 3 и 4): Первоначальная настройка сервера с Ubuntu 14.04.
- Сертификат SSL и пара закрытых ключей с \общим именем, совпадающим с вашим доменным именем или IP-адресом
Если у вас еще нет сертификата SSL и пары закрытых ключей, получите их, прежде чем продолжить. Вот несколько руководств, содержащих шаги по созданию SSL-сертификатов:
- Создайте сертификат StartSSL (private.key и ssl.crt)
- Создайте самозаверяющий SSL-сертификат в Ubuntu 14.04 (шаг 2 – apache.key и apache.crt)
Создание комбинированного файла сертификата/ключа PEM SSL
Чтобы реализовать завершение SSL с помощью HAProxy, мы должны убедиться, что ваш сертификат SSL и пара ключей имеют правильный формат PEM. В большинстве случаев вы можете просто объединить свой SSL-сертификат (файл .crt или .cer, предоставленный центром сертификации) и соответствующий закрытый ключ (файл .key, созданный вами). Предполагая, что файл вашего сертификата называется example.com.crt
, а файл вашего закрытого ключа называется example.com.key
, вот пример того, как объединить файлы:
cat example.com.crt example.com.key > example.com.pem
sudo cp example.com.pem /etc/ssl/private/
Это создает комбинированный файл PEM с именем example.com.pem
и копирует его в /etc/ssl/private
. Как всегда, обязательно защитите все копии файла закрытого ключа, включая файл PEM (который содержит закрытый ключ).
В некоторых случаях может потребоваться скопировать корневой сертификат ЦС и промежуточные сертификаты ЦС в файл PEM.
Наша стартовая среда
Вот среда, с которой мы начинаем:
Если ваша среда отличается от примера, например, если вы уже используете SSL на веб-сервере или у вас есть отдельный сервер базы данных, вы сможете адаптировать это руководство для работы с вашей средой.
Если вы не знакомы с основными концепциями или терминологией балансировки нагрузки, такими как балансировка нагрузки уровня 7, серверные части или списки управления доступом, вот статья, объясняющая основы: Введение в концепции HAProxy и балансировки нагрузки.
Наша цель
К концу этого урока мы хотим, чтобы среда выглядела так:
То есть ваши пользователи будут получать доступ к вашему веб-сайту, подключившись к вашему серверу HAProxy через HTTPS, который расшифрует сеанс SSL и перенаправит незашифрованные запросы на ваши веб-серверы (т.е. серверы в www-backend) через их частные сетевые интерфейсы на порту 80. Затем ваши веб-серверы отправят свои ответы на ваш сервер HAProxy, который зашифрует ответы и отправит их обратно пользователю, сделавшему первоначальный запрос.
Вы можете настроить свой www-backend на любое количество веб-серверов, если они обслуживают идентичный контент. Другими словами, вы можете настроить это с помощью одного сервера, а затем масштабировать его позже, добавляя столько серверов, сколько хотите. Помните, что по мере увеличения вашего трафика ваш сервер HAProxy может стать узким местом в производительности, если ему не хватает системных ресурсов для обработки вашего пользовательского трафика.
Примечание. В этом руководстве не рассказывается, как обеспечить, чтобы ваши веб-серверы/серверы приложений обслуживали один и тот же контент, потому что это часто зависит от приложения или веб-сервера.
Установите HAProxy 1.6.x
Создайте новый VPS с частной сетью. В этом руководстве мы будем называть его haproxy-www, но вы можете называть его как хотите.
В нашем VPS haproxy-www добавьте выделенный PPA в apt-get:
sudo add-apt-repository ppa:vbernat/haproxy-1.6
Затем обновите свой apt-кеш:
sudo apt-get update
Затем установите HAProxy 1.6 с помощью apt-get с помощью следующей команды:
sudo apt-get install haproxy
Теперь, когда HAProxy 1.6 установлен, давайте настроим его!
Конфигурация HAProxy
Файл конфигурации HAProxy находится по адресу /etc/haproxy/haproxy.cfg
и разделен на два основных раздела:
- Глобальный: задает параметры для всего процесса.
- Прокси: состоит из разделов defaults, listen, frontend и backend.
Опять же, если вы не знакомы с HAProxy или с основными концепциями и терминологией балансировки нагрузки, перейдите по этой ссылке: Введение в HAProxy и концепции балансировки нагрузки.
Конфигурация HAProxy: глобальная
Вся настройка HAProxy должна выполняться на вашем HAProxy VPS, haproxy-www.
Откройте haproxy.cfg в редакторе:
sudo vi /etc/haproxy/haproxy.cfg
Вы увидите, что уже определены два раздела: global и defaults.
Первое, что вам нужно сделать, это установить maxconn в разумное число. Этот параметр влияет на количество одновременных подключений, разрешенных HAProxy, что может повлиять на QoS и предотвратить сбой ваших веб-серверов из-за попытки обслужить слишком много запросов. Вам нужно будет поиграть с ним, чтобы найти то, что работает для вашей среды. Добавьте следующую строку (со значением, которое вы считаете разумным) в раздел global конфигурации.
maxconn 2048
Добавьте эту строку, чтобы настроить максимальный размер генерируемых временных ключей DHE:
tune.ssl.default-dh-param 2048
Затем в разделе defaults добавьте следующие строки под строкой mode http
:
option forwardfor
option http-server-close
Параметр forwardfor позволяет HAProxy добавлять заголовки X-Forwarded-For к каждому запросу, а параметр http-server-close уменьшает задержку между HAProxy и вашими пользователями, закрывая соединения, но поддержание активности.
Конфигурация HAProxy: статистика
Использование статистики HAProxy может быть полезно для определения того, как HAProxy обрабатывает входящий трафик. Если вы хотите включить страницу статистики HAProxy, добавьте следующие строки в раздел defaults (замените имя пользователя и пароль безопасными значениями):
stats enable
stats uri /stats
stats realm Haproxy\ Statistics
stats auth user:password
Это позволит вам просмотреть страницу статистики HAProxy, перейдя в свой домен по адресу /stats
(например, https://example.com/stats).
Пока не закрывайте файл конфигурации! Далее мы добавим конфигурацию прокси.
Конфигурация HAProxy: Прокси
Конфигурация внешнего интерфейса
Первое, что мы хотим добавить, — это интерфейс для обработки входящих HTTP-соединений. В конце файла добавим интерфейс с именем www-http. Обязательно замените haproxy_www_public_IP
на общедоступный IP-адрес вашего haproxy-www VPS:
frontend www-http
bind haproxy_www_public_IP:80
reqadd X-Forwarded-Proto:\ http
default_backend www-backend
Вот объяснение того, что означает каждая строка в приведенном выше фрагменте конфигурации внешнего интерфейса:
- Внешний интерфейс www-http:указывает внешний интерфейс с именем \www-http
- bind haproxy_www_public_IP:80: замените
haproxy_www_public_IP
общедоступным IP-адресом haproxy-www. Это сообщает HAProxy, что этот интерфейс будет обрабатывать входящий сетевой трафик на этот IP-адрес и порт 80 (HTTP) - reqadd X-Forwarded-Proto:\ http:добавляет заголовок http в конец HTTP-запроса.
- default_backend www-backend: указывает, что любой трафик, который получает этот внешний интерфейс, будет перенаправляться на www-backend, который мы определим на следующем шаге
Далее мы добавим внешний интерфейс для обработки входящих соединений HTTPS. В конце файла добавим интерфейс с именем www-https. Обязательно замените haproxy_www_public_IP
на общедоступный IP-адрес вашего haproxy-www VPS:
frontend www-https
bind haproxy_www_public_IP:443 ssl crt /etc/ssl/private/example.com.pem
reqadd X-Forwarded-Proto:\ https
default_backend www-backend
- Внешний интерфейс www-https: указывает внешний интерфейс с именем \www-https
- связать haproxy_www_public_IP:443 ssl crt …: заменить
haproxy_www_public_IP
на общедоступный IP-адрес haproxy-www, аexample.com.pem
— на ваш SSL-сертификат и пару ключей в сочетании формат pem. Это сообщает HAProxy, что этот интерфейс будет обрабатывать входящий сетевой трафик через этот IP-адрес и порт 443 (HTTPS). - reqadd X-Forwarded-Proto:\ https: добавляет заголовок https в конец запроса HTTPS.
- default_backend www-backend: указывает, что любой трафик, который получает этот внешний интерфейс, будет перенаправляться на www-backend, который мы определим на следующем шаге
Конфигурация серверной части
После того, как вы закончите настройку внешних интерфейсов, продолжите добавление вашего внутреннего интерфейса, добавив следующие строки. Обязательно замените выделенные слова соответствующими частными IP-адресами ваших веб-серверов:
backend www-backend
redirect scheme https if !{ ssl_fc }
server www-1 www_1_private_IP:80 check
server www-2 www_2_private_IP:80 check
Вот объяснение того, что означает каждая строка в приведенном выше фрагменте конфигурации бэкэнда:
- backend www-backend: указывает серверную часть с именем www-backend
- схема перенаправления https if !{ ssl_fc }: эта строка перенаправляет HTTP-запросы на HTTPS, что делает ваш сайт только HTTPS. Если вы хотите разрешить и HTTP, и HTTPS, удалите эту строку.
- server www-1 …: указывает внутренний сервер с именем www-1, частный IP-адрес (который вы должны заменить) и порт, который он прослушивает, 80 . Параметр check заставляет балансировщик нагрузки периодически выполнять проверку работоспособности на этом сервере
- сервер www-2 …: аналогично предыдущей строке. Добавьте подобные строки с соответствующими именами и IP-адресами, чтобы добавить больше серверов в балансировщик нагрузки.
Теперь сохраните и закройте haproxy.cfg
. Теперь HAProxy готов к запуску, но давайте сначала включим ведение журнала.
Включить ведение журнала HAProxy
Включить ведение журнала в HAProxy очень просто. Сначала отредактируйте файл rsyslog.conf:
sudo vi /etc/rsyslog.conf
Затем найдите следующие две строки и раскомментируйте их, чтобы включить прием системного журнала UDP. Когда вы закончите, это должно выглядеть следующим образом:
$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1
Теперь перезапустите rsyslog, чтобы включить новую конфигурацию:
sudo service rsyslog restart
Ведение журнала HAProxy теперь включено! Файл журнала будет создан в /var/log/haproxy.log
после запуска HAProxy.
Запустить HAProxy
На haproxy-www запустите HAProxy, чтобы изменения конфигурации вступили в силу:
sudo service haproxy restart
Теперь HAProxy выполняет завершение SSL и балансировку нагрузки на ваши веб-серверы! Ваш сервер с балансировкой нагрузки теперь доступен для вашего пользователя через общедоступный IP-адрес или доменное имя вашего балансировщика нагрузки, haproxy-www! Есть несколько вещей, которые вы захотите проверить, чтобы убедиться, что все настроено правильно.
Что нужно проверить
- Если вы еще этого не сделали, обновите серверы имен, чтобы ваш домен указывал на общедоступный IP-адрес вашего сервера haproxy-www
- Если вы хотите, чтобы ваши серверы использовали только HTTPS, убедитесь, что ваши веб-серверы (например, www-1, www-2 и т. д.) прослушивают только свои частные IP-адреса через порт 80. В противном случае пользователи смогут получить доступ к вашим веб-серверам через HTTP (незашифрованный) со своих общедоступных IP-адресов.
- Посетите haproxy-www через HTTPS и убедитесь, что он работает.
- Посетите haproxy-www через HTTP и убедитесь, что он перенаправляет на HTTPS (если вы не настроили его для разрешения как HTTP, так и HTTPS)
Примечание. Если вы используете приложение, которому необходимо знать собственный URL-адрес, например WordPress, вам необходимо изменить настройку URL-адреса с \http на https. Чтобы следовать примеру WordPress, вы должны перейти к общим настройкам WordPress, а затем изменить адрес WordPress (URL) и адрес сайта (URL) с \http на \https.
Заключение
Теперь у вас есть решение для балансировки нагрузки, которое обрабатывает SSL-соединения и может использоваться для горизонтального масштабирования вашей серверной среды. Не стесняйтесь комбинировать то, что вы узнали из этого руководства, с другими руководствами по HAProxy, чтобы еще больше улучшить свою среду!