Как защитить HAProxy от Let’s Encrypt на CentOS 7

Вступление

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

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

изображение: https: //assets.digitalocean.com/articles/letsencrypt/haproxy-letsencrypt.png [HAProxy с сертификатом Let’s Encrypt TLS / SSL и автоматическим обновлением]

Предпосылки

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

У вас должен быть сервер CentOS 7 с пользователем без полномочий root, который имеет права + sudo +. Вы можете узнать, как настроить такую ​​учетную запись пользователя, выполнив шаги 1-3 в нашей https://www.digitalocean.com/community/articles/initial-server-setup-with-centos-7[initial настройке сервера для CentOS 7 учебник.

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

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

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

Шаг 1 - Установка Certbot, клиента Let Encrypt

Первым шагом к использованию Let Encrypt для получения SSL-сертификата является установка программного обеспечения `+ certbot + 'на ваш сервер. В настоящее время лучший способ установить это через репозиторий EPEL.

Разрешите доступ к репозиторию EPEL на вашем сервере, набрав:

sudo yum install epel-release

После того, как хранилище было включено, вы можете получить пакет + certbot +, набрав:

sudo yum install certbot

Клиент + certbot + Let’s Encrypt должен быть установлен и готов к использованию.

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

Let’s Encrypt предоставляет различные способы получения SSL-сертификатов с помощью различных плагинов. В отличие от плагина Apache, который описан в другом учебнике https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-14-04. ], большинство плагинов помогут вам только в получении сертификата, который вы должны будете вручную настроить для своего веб-сервера. Плагины, которые только получают сертификаты и не устанавливают их, называются «аутентификаторами», поскольку они используются для проверки подлинности того, должен ли сервер выдавать сертификат.

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

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

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

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

sudo systemctl stop haproxy

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

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

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

Запустите Certbot

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

sudo certbot certonly --standalone --preferred-challenges http --http-01-port 80 -d  -d

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

Output:IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
  /fullchain.pem. Your cert
  will expire on . 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

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

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

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

  • * cert.pem: * Сертификат вашего домена

  • * chain.pem: * Сертификат цепочки Let’s Encrypt

  • * fullchain.pem: * + cert.pem + и + chain.pem + вместе

  • * privkey.pem: * Закрытый ключ вашего сертификата.

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

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

sudo ls /etc/letsencrypt/live/

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

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

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

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

sudo mkdir -p /etc/haproxy/certs

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

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

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

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

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

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

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

Установите HAProxy с помощью yum:

sudo yum install haproxy

HAProxy теперь установлен, но должен быть настроен.

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

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

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

sudo vi /etc/haproxy/haproxy.cfg

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

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

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

haproxy.cfg - 1 из 5

  tune.ssl.default-dh-param 2048

Разделы внешнего интерфейса

Теперь мы готовы определить ваши разделы + front end.

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

haproxy.cfg - 2 из 5

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

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

haproxy.cfg - 3 из 5

frontend www-https
  bind :443 ssl crt /etc/haproxy/certs/.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 (для + /. Хорошо известный / acme-challenge +) в бэкэнд + letsencrypt-backend +, что позволит нам обновить сертификат без остановки службы HAProxy. Все остальные запросы будут перенаправлены в + www-backend +, который является бэкэндом, который будет обслуживать наше веб-приложение или сайт.

Разделы бэкэнда

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

haproxy.cfg - 4 из 5

backend www-backend
  redirect scheme https if !{ ssl_fc }
  server www-1 :80 check
  server www-2 :80 check

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

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

haproxy.cfg - 5 из 5

backend letsencrypt-backend
  server letsencrypt 127.0.0.1:54321

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

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

sudo systemctl start haproxy

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

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

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

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

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

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

Откройте новый файл в + / usr / local / bin + как * root *:

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

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

#!/bin/sh

SITE=

# 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
systemctl reload haproxy

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

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

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

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

sudo /usr/local/bin/renew.sh

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

Обновление настроек Certbot

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

sudo vi /etc/letsencrypt/renewal/.conf

Нам нужно изменить строку + http01_port +, чтобы она выглядела следующим образом:

example.com.conf

http01_port =

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

sudo certbot renew --dry-run

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

Создать Cron Job

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

sudo crontab -e

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

запись crontab

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 Encrypt TLS / SSL для безопасного обслуживания HTTPS-трафика.

Related