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

Как защитить HAProxy с помощью Let’s Encrypt в Ubuntu 14.04


Введение

Let’s Encrypt — это новый центр сертификации (ЦС), который предоставляет простой способ получения и установки бесплатных сертификатов TLS/SSL, тем самым обеспечивая шифрование HTTPS на веб-серверах. Это упрощает процесс, предоставляя программный клиент Certbot, который пытается автоматизировать большинство необходимых шагов. В настоящее время весь процесс получения и установки сертификата полностью автоматизирован только на веб-серверах Apache. Однако с помощью Certbot можно легко получить бесплатный SSL-сертификат, который можно установить вручную, независимо от выбранного вами программного обеспечения веб-сервера.

В этом руководстве мы покажем вам, как использовать Certbot для получения бесплатного сертификата SSL и использовать его с HAProxy в Ubuntu 14.04. Мы также покажем вам, как автоматически обновить ваш SSL-сертификат.

Предпосылки

Прежде чем следовать этому руководству, вам понадобится несколько вещей.

У вас должен быть сервер Ubuntu 14.04 с пользователем без полномочий root, у которого есть привилегии sudo. Вы можете узнать, как настроить такую учетную запись пользователя, выполнив шаги 1-3 в нашей начальной настройке сервера для Ubuntu 14.04.

Вы должны владеть или контролировать зарегистрированное доменное имя, с которым хотите использовать сертификат. Если у вас еще нет зарегистрированного доменного имени, вы можете зарегистрировать его у одного из многочисленных регистраторов доменных имен (например, Namecheap, GoDaddy и т. д.).

Если вы еще этого не сделали, обязательно создайте запись A, которая указывает ваш домен на общедоступный IP-адрес вашего сервера. Это необходимо из-за того, как Let’s Encrypt проверяет, что вы являетесь владельцем домена, для которого он выдает сертификат. Например, если вы хотите получить сертификат для example.com, этот домен должен разрешаться на ваш сервер, чтобы процесс проверки работал. Наша установка будет использовать example.com и www.example.com в качестве имен доменов, поэтому необходимы обе записи DNS.

Когда у вас есть все необходимые условия, давайте перейдем к установке certbot, клиентского программного обеспечения Let’s Encrypt.

Шаг 1 — Установка клиента Let’s Encrypt

Первым шагом к использованию Let’s Encrypt для получения SSL-сертификата является установка программного обеспечения certbot на ваш сервер. Разработчики Certbot предоставляют репозиторий с актуальными версиями программного обеспечения. Давайте теперь добавим этот репозиторий в наш менеджер пакетов:

  1. sudo add-apt-repository ppa:certbot/certbot

Вам будет предложено подтвердить добавление. Нажмите ENTER, чтобы продолжить. Затем обновите кэш пакетов, чтобы получить новый список пакетов:

  1. sudo apt-get update

И, наконец, установите пакет certbot:

  1. sudo apt-get install certbot

Теперь, когда у нас установлен certbot, мы готовы получить наш SSL-сертификат.

Шаг 2 — Получение сертификата

Let’s Encrypt предоставляет множество способов получения SSL-сертификатов с помощью различных плагинов. В отличие от подключаемого модуля Apache, который рассматривается в другом руководстве, большинство подключаемых модулей помогут вам получить сертификат, для использования которого вы должны вручную настроить веб-сервер. Плагины, которые только получают сертификаты, но не устанавливают их, называются «аутентификаторами», потому что они используются для аутентификации того, должен ли сервер выдавать сертификат.

Мы покажем вам, как использовать автономный плагин для получения SSL-сертификата.

Убедитесь, что порт 80 открыт

Плагин Standalone предоставляет очень простой способ получения SSL-сертификатов. Он работает, временно запуская небольшой веб-сервер (по умолчанию на порту 80) на вашем сервере, к которому Let’s Encrypt CA может подключиться и проверить личность вашего сервера перед выдачей сертификата. Таким образом, этот метод требует, чтобы порт 80 не использовался. То есть обязательно остановите свой обычный веб-сервер, если он использует порт 80 (т. е. http), прежде чем пытаться использовать этот плагин.

Например, если вы используете HAProxy, вы можете остановить его, выполнив эту команду:

  1. sudo service haproxy stop

Если вы не уверены, используется ли порт 80, вы можете запустить эту команду:

netstat -na | grep ':80.*LISTEN'

Если при запуске этой команды нет вывода, вы можете использовать автономный плагин.

Запустить Certbot

Теперь используйте автономный плагин, выполнив эту команду:

  1. sudo certbot certonly --standalone --preferred-challenges http --http-01-port 80 -d example.com -d www.example.com

Вам будет предложено ввести адрес электронной почты и принять условия обслуживания Let’s Encrypt. После этого будет запущен вызов http. Если все сделано успешно, certbot выведет примерно такое выходное сообщение:

Output:
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2017-09-06. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

Вам нужно будет отметить путь и дату истечения срока действия вашего сертификата, которые были выделены в приведенном выше примере.

Примечание. Если ваш домен маршрутизируется через службу DNS, такую как CloudFlare, вам нужно будет временно отключить ее, пока вы не получите сертификат.

Файлы сертификатов

После получения сертификата у вас будут следующие файлы в кодировке PEM:

  • cert.pem: сертификат вашего домена
  • chain.pem: сертификат цепочки Let’s Encrypt
  • fullchain.pem: cert.pem и chain.pem вместе
  • privkey.pem: закрытый ключ вашего сертификата

Важно, чтобы вы знали расположение только что созданных файлов сертификатов, чтобы вы могли использовать их в конфигурации вашего веб-сервера. Сами файлы помещаются в подкаталог в /etc/letsencrypt/archive. Однако Certbot создает символические ссылки на самые последние файлы сертификатов в каталоге /etc/letsencrypt/live/имя_домена.

Вы можете проверить, что файлы существуют, выполнив эту команду (подставив свое доменное имя):

  1. sudo ls /etc/letsencrypt/live/your_domain_name

На выходе должны быть четыре ранее упомянутых файла сертификата.

Объедините fullchain.pem и privkey.pem

При настройке HAProxy для выполнения терминации SSL, чтобы он шифровал трафик между собой и конечным пользователем, вы должны объединить fullchain.pem и privkey.pem в один файл.

Сначала создайте каталог, в который будет помещен объединенный файл, /etc/haproxy/certs:

  1. sudo mkdir -p /etc/haproxy/certs

Затем создайте объединенный файл с помощью этой команды cat (замените выделенный example.com своим доменным именем):

  1. DOMAIN='example.com' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'

Защитите доступ к комбинированному файлу, содержащему закрытый ключ, с помощью этой команды:

  1. sudo chmod -R go-rwx /etc/haproxy/certs

Теперь мы готовы использовать сертификат SSL и закрытый ключ с HAProxy.

Шаг 3 — Установка HAProxy

Этот шаг охватывает установку HAProxy. Если он уже установлен на вашем сервере, пропустите этот шаг.

Мы установим HAProxy 1.6, которого нет в стандартных репозиториях Ubuntu. Однако мы все еще можем использовать менеджер пакетов для установки HAProxy 1.6, если мы используем PPA, с помощью этой команды:

  1. sudo add-apt-repository ppa:vbernat/haproxy-1.6

Обновите локальный индекс пакетов в ваших балансировщиках нагрузки и установите HAProxy, набрав:

  1. sudo apt-get update
  2. sudo apt-get install haproxy

HAProxy теперь установлен, но его нужно настроить.

Шаг 4 — Настройка HAProxy

В этом разделе показано, как настроить базовый HAProxy с настройкой SSL. В нем также рассказывается, как настроить HAProxy, чтобы мы могли автоматически обновлять наш сертификат Let’s Encrypt.

Откройте haproxy.cfg в текстовом редакторе:

  1. sudo nano /etc/haproxy/haproxy.cfg

Держите этот файл открытым, пока мы редактируем его в следующих нескольких разделах.

Глобальный раздел

Давайте добавим некоторые основные настройки в раздел global.

Первое, что вам нужно сделать, это установить maxconn в разумное число. Это влияет на количество одновременных подключений, разрешенных HAProxy, что может повлиять на QoS и предотвратить сбой ваших веб-серверов из-за попытки обслужить слишком много запросов. Вам нужно будет поиграть с ним, чтобы найти то, что работает для вашей среды. Добавьте следующую строку (со значением, которое вы считаете разумным) в глобальный раздел:

   maxconn 2048

Затем добавьте эту строку, чтобы настроить максимальный размер генерируемых временных ключей DHE:

   tune.ssl.default-dh-param 2048

Раздел по умолчанию

Добавьте следующие строки в раздел defaults:

   option forwardfor
   option http-server-close

Параметр forwardfor позволяет HAProxy добавлять заголовки X-Forwarded-For к каждому запросу, а параметр http-server-close уменьшает задержку между HAProxy и вашими пользователями, закрывая соединения, но поддержание активности.

Разделы интерфейса

Теперь мы готовы определить разделы frontend.

Первое, что мы хотим добавить, — это интерфейс для обработки входящих HTTP-соединений и отправки их на серверную часть по умолчанию (которую мы определим позже). В конце файла добавим интерфейс с именем www-http. Обязательно замените haproxy_public_IP общедоступным IP-адресом вашего сервера HAProxy:

frontend www-http
   bind haproxy_www_public_IP:80
   reqadd X-Forwarded-Proto:\ http
   default_backend www-backend

Далее мы добавим внешний интерфейс для обработки входящих соединений HTTPS. В конце файла добавьте внешний интерфейс с именем www-https. Обязательно замените haproxy_www_public_IP общедоступным IP-адресом вашего сервера HAProxy. Кроме того, вам нужно будет заменить example.com своим доменным именем (которое должно соответствовать файлу сертификата, который вы создали ранее):

frontend www-https
   bind haproxy_www_public_IP:443 ssl crt /etc/haproxy/certs/example.com.pem
   reqadd X-Forwarded-Proto:\ https
   acl letsencrypt-acl path_beg /.well-known/acme-challenge/
   use_backend letsencrypt-backend if letsencrypt-acl
   default_backend www-backend

Этот внешний интерфейс использует ACL (letsencrypt-acl) для отправки запросов проверки Let's Encrypt (для /.well-known/acme-challenge) на letsencrypt-backend. , что позволит нам обновить сертификат, не останавливая службу HAProxy. Все остальные запросы будут перенаправлены на www-backend, который будет обслуживать наше веб-приложение или сайт.

Бэкэнд-разделы

После того, как вы закончите настройку интерфейсов, добавьте серверную часть www-backend, добавив следующие строки. Обязательно замените выделенные слова соответствующими частными IP-адресами ваших веб-серверов (отрегулируйте количество строк server в соответствии с количеством внутренних серверов):

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

Любой трафик, который получает этот бэкенд, будет распределяться между его записями server через HTTP (порт 80).

Наконец, добавьте бэкенд letsencrypt-backend, добавив эти строки

backend letsencrypt-backend
   server letsencrypt 127.0.0.1:54321

Этот бэкенд, который обрабатывает только вызовы Let’s Encrypt ACME, которые используются для запросов и обновлений сертификатов, отправляет трафик на локальный хост через порт 54321. Мы будем использовать этот порт вместо 80 и 443 при обновлении нашего SSL-сертификата Let’s Encrypt.

Теперь мы готовы запустить HAProxy:

  1. sudo service haproxy restart

Примечание. Если у вас возникли проблемы с файлом конфигурации haproxy.cfg, посмотрите этот GitHub Gist для примера.

Сертификат Let’s Encrypt TLS/SSL уже установлен, и мы готовы настроить сценарий автоматического обновления. На этом этапе вы должны проверить, работает ли сертификат TLS/SSL, посетив свой домен в веб-браузере.

Шаг 5 — Настройка автоматического продления

Сертификаты Let’s Encrypt действительны всего 90 дней, поэтому важно автоматизировать процесс продления.

Практический способ гарантировать, что ваши сертификаты не устареют, — это создать задание cron, которое будет автоматически обрабатывать процесс обновления за вас. Cronjob будет ежедневно запускать certbot и обновлять сертификаты, если до истечения срока их действия осталось менее тридцати дней. certbot также запускает специальный скрипт renew-hook после любого успешного обновления. Мы будем использовать этот скрипт обновления, чтобы обновить наш объединенный файл .pem и перезагрузить haproxy.

Давайте создадим этот скрипт сейчас, а затем протестируем его.

Создать сценарий обновления

Откройте новый файл в /usr/local/bin от имени пользователя root:

  1. sudo nano /usr/local/bin/renew.sh

Это будет новый пустой текстовый файл. Вставьте следующий короткий скрипт, обязательно заменив выделенное доменное имя своим собственным:

#!/bin/sh

SITE=example.com

# move to the correct let's encrypt directory
cd /etc/letsencrypt/live/$SITE

# cat files to make combined .pem for haproxy
cat fullchain.pem privkey.pem > /etc/haproxy/certs/$SITE.pem

# reload haproxy
service haproxy reload

Сохраните и закройте файл. Этот скрипт перемещается в правильный каталог Let’s Encrypt, запускает команду cat для объединения двух файлов .pem в один, а затем перезагружает haproxy.

Далее делаем скрипт исполняемым:

  1. sudo chmod u+x /usr/local/bin/renew.sh

Затем запустите скрипт:

  1. sudo /usr/local/bin/renew.sh

Он должен работать без ошибок. Вы увидите некоторый вывод о перезагрузке haproxy. Далее мы обновим Certbot и настроим его для запуска этого сценария обновления.

Обновить конфигурации certbot

Команда certbot renew, которую мы будем использовать для обновления наших сертификатов, считывает файл конфигурации, созданный при первом запуске certbot. Нам нужно открыть этот файл и обновить порт, который certbot использует для запуска своего автономного http-сервера, чтобы он не конфликтовал с haproxy (который уже прослушивает порты 80 и 443). Откройте файл конфигурации в текстовом редакторе:

  1. sudo nano /etc/letsencrypt/renewal/example.com.conf

Нам нужно изменить строку http01_port, чтобы она читалась так:

http01_port = 54321

Сохраните и закройте файл. Теперь протестируйте процесс обновления, указав --dry-run, чтобы мы ничего не обновляли:

  1. sudo certbot renew --dry-run

Certbot будет прослушивать порт 54321 для запроса на продление, а haproxy передаст запрос с порта 80 на 54321.

Создать задание Cron

Затем мы отредактируем crontab, чтобы создать новое задание, которое будет запускать команду certbot renew каждый день. Чтобы отредактировать crontab для пользователя root, запустите:

  1. sudo crontab -e

Добавьте в конец файла следующее:

30 2 * * * /usr/bin/certbot renew --renew-hook "/usr/local/bin/renew.sh" >> /var/log/le-renewal.log

Сохранить и выйти. Это создаст новое задание cron, которое будет выполнять команду certbot renew каждый день в 2:30. Вывод, созданный командой, будет передан в файл журнала, расположенный по адресу /var/log/le-renewal.log. Если сертификат действительно обновлен, скрипт --renew-hook запустится, чтобы создать комбинированный файл PEM и перезагрузить haproxy.

Заключение

Вот и все! Теперь HAProxy использует бесплатный сертификат Let’s Encrypt TLS/SSL для безопасного обслуживания HTTPS-трафика.