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

Вступление

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

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

HAProxy with Let’s Encrypt TLS/SSL Certificate and Auto-renewal

Предпосылки

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

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

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

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

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

[[step-1 -—- install-let-39-s-encrypt-client]] == Шаг 1. Установка клиента Let's Encrypt

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

sudo add-apt-repository ppa:certbot/certbot

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

sudo apt-get update

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

sudo apt-get install certbot

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

[[шаг-2 -—- получение-сертификата]] == Шаг 2 - Получение сертификата

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

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

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

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

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

sudo service haproxy stop

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

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

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

Запустите Certbot

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

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

Вам будет предложено ввести свой адрес электронной почты и принять условия обслуживания Let 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

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

[.note] #Note: Если ваш домен маршрутизируется через службу 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/your_domain_name.

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

sudo ls /etc/letsencrypt/live/your_domain_name

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

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

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

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

sudo mkdir -p /etc/haproxy/certs

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

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'

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

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

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

[[step-3 -—- install-haproxy]] == Шаг 3 - Установка HAProxy

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

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

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

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

sudo apt-get update
sudo apt-get install haproxy

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

[[step-4 -—- configuring-haproxy]] == Шаг 4. Настройка HAProxy

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

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

sudo nano /etc/haproxy/haproxy.cfg

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

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

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

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

haproxy.cfg — 1 of 7

   maxconn 2048

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

haproxy.cfg — 2 of 7

   tune.ssl.default-dh-param 2048

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

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

haproxy.cfg — 3 of 7

   option forwardfor
   option http-server-close

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

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

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

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

haproxy.cfg — 4 of 7

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 своим доменным именем (которое должно соответствовать файлу сертификата, который вы создали ранее):

haproxy.cfg — 5 of 7

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 в соответствии с количеством имеющихся у вас внутренних серверов):

haproxy.cfg — 6 of 7

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, добавив эти строки

haproxy.cfg — 7 of 7

backend letsencrypt-backend
   server letsencrypt 127.0.0.1:54321

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

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

sudo service haproxy restart

[.note] #Note: Если у вас возникли проблемы с файлом конфигурацииhaproxy.cfg, посмотрите примерthis GitHub Gist.
#

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

[[step-5 -—- setting-up-auto-продление]] == Шаг 5. Настройка автоматического продления

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

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

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

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

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

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.

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

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

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

sudo /usr/local/bin/renew.sh

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

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

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

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

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

example.com.conf

http01_port = 54321

Сохраните и закройте файл. Теперь протестируйте процесс обновления, указав--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