Поиск по сайту:

Как реализовать терминацию 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, чтобы еще больше улучшить свою среду!