Защита приложения Rancher с помощью Let’s Encrypt в Ubuntu 16.04
Ubuntu | Комментировать запись
Ранее защита веб-приложений с помощью TLS/SSL считалась необходимой только в том случае, если приложение хранит конфиденциальную информацию (поскольку получение официального сертификата требует материальных затрат и дополнительной настройки). Сервис Let’s Encrypt выдаёт бесплатные доверенные сертификаты в автоматическом режиме, что позволяет добавить этот уровень безопасности на любой веб-сайт или в любое приложение.
Rancher – это простой дашборд для управления контейнерами Docker. Rancher предоставляет каталог популярных приложений, которые можно быстро развернуть. Среди них можно найти и сервис Let’s Encrypt, который позволяет генерировать и обновлять сертификаты. Созданные сертификаты хранятся в Rancher.
Установка Let’s Encrypt в Rancher выполняется в три этапа:
- Развёртывание сервиса Let’s Encrypt.
- Добавление полученного сертификата на балансировщик нагрузки.
- Настройка перенаправления HTTP на HTTPS.
Данное руководство поможет выполнить все эти этапы.
Требования
- Сервер Ubuntu 16.04 с 1 Гб памяти. Настройка такого сервера подробно описана в руководстве Многоузловое развёртывание с помощью Rancher и Docker Machine в Ubuntu 16.04 (также оно поможет создать дополнительные серверы, которые будут выступать в качестве нод для контейнеров Docker).
- Приложение, развёрнутое с помощью Rancher и встроенного балансировщика нагрузки (пример развёртывания можно найти здесь). Балансировщик должен передавать запросы контейнеру приложения.
- FQDN и запись A, направленная на внешний IP-адрес сервера, на котором работает балансировщик нагрузки Rancher. Это позволит сервису Let’s Encrypt подтвердить ваше право собственности на домен (прежде чем приступить к выполнению руководства, убедитесь, что вы можете просмотреть приложение по FQDN; в руководстве используется условный домен http://your_domain).
1: Развёртывание сервиса Let’s Encrypt
Сначала нужно развернуть сервис Let’s Encrypt как контейнер Docker, который будет размещён на одном из хостов Rancher. Для этого нужно выбрать Let’s Encrypt в каталоге Rancher и предоставить информацию о сервисе. После этого у вас будет сертификат для Rancher. Сервис сможет автоматически обновлять сертификат до окончания срока его действия.
Для начала откройте Rancher Catalog (выберите Catalog в верхнем меню интерфейса Rancher). Затем найдите в нём сервис Let’s Encrypt и нажмите кнопку View Details. Чтобы настроить сервис:
- Выберите последнюю версию шаблона (вэтом руководстве используется версия 0.4.0).
- Присвойте новому стеку приложений свое уникальное имя (в руководстве он называется Certificates).
- Выберите Yes в поле I Agree to the Let’s Encrypt TOS.
- Выберите версию Production интерфейса Let’s Encrypt.
- В поле Your Email Address укажите валидный почтовый адрес.
- В поле Certificate Name введите имя сертификата (это позволит вам быстро найти сертификат в пользовательском интерфейсе Rancher). Для этого можно использовать доменное имя.
- В поле Domain Names укажите домен, который нужно защитить с помощью сертификата. Вы можете указать несколько доменов, разделив их запятыми.
- В Public Key Algorithm оставьте RSA-2048 (используется по умолчанию) или выберите другой алгоритм.
- В Renewal Time of Day выберите время в формате UTC, в которое будет обновляться сертификат. Значение по умолчанию 12 подойдёт в большинстве случаев.
- В Domain Validation Method можно выбрать HTTP. Существуют и другие методы, которые вы можете выбрать для своего DNS-провайдера. Метод HTTP универсален, он будет работать вне зависимости от провайдера.
- Остальные поля предназначены для настройки определённого DNS-провайдера. Поскольку вы используете метод HTTP, можете пропустить их.
- Затем снимите флажок Start service after creating. Сервис лучше запустить после внесения дополнительных изменений в настройки.
- Нажмите кнопку Launch в конце страницы, чтобы запустить сервис, и подождите, пока он развернётся.
Теперь нужно настроить балансировщик нагрузки Racher для перенаправления запросов к /.well-known/acme-challenge на сервис Certificate. Без этого Let’s Encrypt не сможет подтвердить право собственности на домен.
Чтобы настроить перенаправление запросов:
- Найдите балансировщик нагрузки и нажмите кнопку Upgrade/Edit.
- Чтобы добавить новое правило, установите такие параметры: Access – Public, Protocol – HTTP, Port – 80, Path – /.well-known/acme-challenge, Target – Certificate.
- Нажмите кнопку со стрелкой вверх, чтобы сервис был первым в списке.
- Нажмите Edit в нижней части экрана, чтобы сохранить конфигурацию.
Новое правило добавлено. Теперь можно запустить сервис Let’s Encrypt:
- Найдите стек Certificate в меню Stacks.
- Выберите стек Certificates, чтобы открыть сервис letsencrypt.
- Нажмите Start.
На этом этапе сервис Let’s Encrypt должен запуститься и создать сертификат. Процесс может занять от 5 до 15 минут. Выберите меню Infrastructure и выберите Certificates, чтобы просмотреть сертификаты. Через некоторое время вы увидите новый сертификат (для этого может понадобиться обновить страницу). Полученный сертификат можно использовать для защиты приложения.
2: Добавление сертификата
Теперь нужно добавить сертификат Let’s Encrypt в сервис балансировки нагрузки Rancher. Для этого нужно изменить правило балансировщика нагрузки, указав в нем HTTPS. Чтобы применить сертификат:
- Найдите балансировщик нагрузки и нажмите Upgrade/Edit.
- В разделе Port Rules найдите запись, которая перенаправляет запросы к приложению. Измените Protocol на HTTPS, а Request Host Port на 443 (стандартный порт HTTPS).
- Откройте вкладку SSL Termination и в поле Certificate выберите сертификат, который нужно использовать. Чтобы добавить несколько сертификатов, выберите их в Alternate Certs. Выбирая сертификат, вы автоматически связываете его с соответствующим доменом.
- Нажмите Create.
Попробуйте открыть приложение с помощью протокола HTTPS:
https://your_domain
Теперь соединение защищено. Однако теперь, когда в настройках указан только порт 443, приложение перестанет обслуживать запросы HTTP (порт 80). Чтобы решить эту проблему, можно снова добавить в настройки правило для HTTP и порта 80. Но вместо этого лучше настроить перенаправление всех HTTP-запросов на HTTPS.
3: Перенаправление HTTP на HTTPS
Сервис балансировки нагрузки Rancher поддерживает пользовательские настройки HAProxy. Эту функцию можно использовать, чтобы добавить правила перенаправления HTTP на HTTPS. После этого сервис сможет обслуживать HTTP-запросы.
Чтобы настроить перенаправление, найдите балансировщик нагрузки Rancher и нажмите Upgrade/Edit. На появившейся странице откройте вкладку Custom haproxy.cfg.
Добавьте следующий код:
frontend 80
acl lepath path_beg -i /.well-known/acme-challenge
redirect scheme https code 301 if !lepath !{ ssl_fc }
Этот код создаст правило, с помощью которого балансировщик сможет перенаправлять весь трафик на HTTPS и игнорировать запросы к /.well-known/acme-challenge (который был необходим для подтверждения права собственности на домен). Параметр code 301 настроит постоянное перенаправление трафика.
Читайте также: Документация HAProxy
Чтобы обновить настройки, нажмите Edit.
Теперь все запросы HTTP будут перенаправлены на HTTPS, что сделает сайт безопасным. После этого можно перейти к тестированию сайта.
4: Тестирование настройки
Чтобы протестировать настройку попробуйте открыть сайт с помощью HTTP:
http://your_domain
Обратите внимание на адресную строку: http автоматически изменится на https.
Также проверить сайт можно с помощью утилиты curl. Она отправит запрос на сервер, выполнит все перенаправления и выведет заголовки ответов.
curl -I -L http://your_domain
HTTP/1.1 301 Found
Cache-Control: no-cache
Content-length: 0
Location: https://your_domain/
Connection: close
HTTP/1.1 200 OK
Cache-Control: public, max-age=0
Content-Type: text/html; charset=utf-8
Vary: Accept-Encoding
Date: Sun, 19 Feb 2017 03:42:47 GMT
Первый блок вывода показывает ответ при запросе веб-сайта через HTTP; как видите, сайт был найден, но теперь находится по другому адресу. Обратите внимание на раздел 301 Found: он значит, что добавленное правило HAProxy работает. В разделе Location показано новое местоположение запрашиваемого ресурса. Второй блок вывода показывает, что утилита curl проследовала за перенаправлением в новое местоположение, и что веб-сайт был найден в новом месте (об этом свидетельствует 200 OK).
Заключение
Теперь вы умеете настраивать HTTPS с помощью Rancher и сервиса Let’s Encrypt. Благодаря бесплатным доверенным сертификатам защитить сайт стало проще. Кроме того, вам не придется беспокоиться об обновлении сертификатов.
Tags: HAProxy, HTTP, HTTPS, Let's Encrypt, Rancher, Ubuntu 16.04