Как защитить Nginx с помощью Let’s Encrypt на Ubuntu 20.04

Введение

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

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

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

Позвольте DigitalOcean беспокоиться о управлении Nginx и Let’s Encrypt. Платформа приложений DigitalOcean позволит вам развернуться прямо из GitHub за несколько минут. Платформа приложений также будет обрабатывать сертификаты SSL и маршрутизацию для вас.

Предварительные требования

Для выполнения этого руководства вам понадобится:

  • Один сервер Ubuntu 20.04, настроенный в соответствии с этим руководством по начальной настройке сервера для Ubuntu 20.04, включая пользователя с sudo-правами и настроенный брандмауэр.

  • Зарегистрированное доменное имя. В этом руководстве будет использоваться example.com. Вы можете приобрести доменное имя на Namecheap, получить бесплатное на Freenom или использовать регистратор доменов на ваш выбор.

  • Должны быть настроены оба следующих DNS-записи для вашего сервера. Если вы используете DigitalOcean, пожалуйста, обратитесь к нашей документации по DNS для получения информации о том, как их добавить.

    • Запись типа A с указанием example.com, указывающая на публичный IP-адрес вашего сервера.
    • Запись типа A с указанием www.example.com, указывающая на публичный IP-адрес вашего сервера.
  • Nginx установлен, следуя инструкции Как установить Nginx на Ubuntu 20.04. Убедитесь, что у вас есть блок сервера для вашего домена. В этом руководстве будет использоваться /etc/nginx/sites-available/example.com в качестве примера.

Шаг 1 — Установка Certbot

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

Установите Certbot и его плагин для Nginx с помощью apt:

  1. sudo apt install certbot python3-certbot-nginx

Теперь Certbot готов к использованию, но для автоматической настройки SSL для Nginx нам нужно проверить некоторые настройки Nginx.

Шаг 2 — Подтверждение конфигурации Nginx

Чтобы Certbot мог найти правильный блок server в вашей конфигурации Nginx и автоматически настроить SSL, он делает это, ища директиву server_name, которая соответствует домену, для которого вы запрашиваете сертификат.

Если вы следовали шагу настройки блока сервера в руководстве по установке Nginx, у вас должен быть блок сервера для вашего домена в /etc/nginx/sites-available/example.com соответствующе установленной директивой server_name.

Чтобы проверить, откройте файл конфигурации вашего домена с помощью nano или вашего любимого текстового редактора:

  1. sudo nano /etc/nginx/sites-available/example.com

Найдите существующую строку server_name. Она должна выглядеть примерно так:

/etc/nginx/sites-available/example.com
...
server_name example.com www.example.com;
...

Если она совпадает, выйдите из редактора и перейдите к следующему шагу.

Если этого не произошло, обновите его, чтобы соответствовать. Затем сохраните файл, выйдите из редактора и проверьте синтаксис ваших изменений в конфигурации:

  1. sudo nginx -t

Если возникла ошибка, откройте файл блока сервера снова и проверьте наличие опечаток или отсутствующих символов. Как только синтаксис вашего файла конфигурации будет правильным, перезагрузите Nginx для загрузки новой конфигурации:

  1. sudo systemctl reload nginx

Теперь Certbot может автоматически найти правильный блок server и обновить его.

Далее давайте обновим брандмауэр, чтобы разрешить трафик HTTPS.

Шаг 3 — Разрешение HTTPS через брандмауэр

Если у вас включен брандмауэр ufw, как рекомендуется в предварительных руководствах, вам нужно настроить параметры для разрешения трафика HTTPS. К счастью, Nginx регистрирует несколько профилей с ufw при установке.

Вы можете увидеть текущие настройки, набрав:

  1. sudo ufw status

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

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

Чтобы дополнительно пропустить трафик HTTPS, разрешите профиль Nginx Full и удалите избыточное разрешение профиля Nginx HTTP:

  1. sudo ufw allow 'Nginx Full'
  2. sudo ufw delete allow 'Nginx HTTP'

Теперь ваш статус должен выглядеть так:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

Затем давайте запустим Certbot и получим наши сертификаты.

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

Certbot предоставляет различные способы получения SSL-сертификатов через плагины. Плагин Nginx позаботится о перенастройке Nginx и перезагрузке конфигурации при необходимости. Чтобы использовать этот плагин, введите следующее:

  1. sudo certbot --nginx -d example.com -d www.example.com

Это запускает certbot с плагином --nginx, используя -d для указания доменных имен, для которых мы хотели бы, чтобы сертификат был действителен.

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

Если это будет успешно, certbot спросит, как вы хотели бы настроить ваши HTTPS-настройки.

Output
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Выберите свой вариант, затем нажмите ENTER. Конфигурация будет обновлена, и Nginx будет перезагружен для применения новых настроек. certbot завершит сообщением о том, что процесс был успешным, и где хранятся ваши сертификаты:

Output
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.com/privkey.pem Your cert will expire on 2020-08-18. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - 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

Ваши сертификаты загружены, установлены и загружены. Попробуйте перезагрузить свой ​​веб-сайт, используя https:// и обратите внимание на индикатор безопасности вашего браузера. Он должен указывать, что сайт правильно защищен, обычно с символом замка. Если вы протестируете свой сервер, используя SSL Labs Server Test, он получит оценку A.

Завершим, протестировав процесс обновления.

Шаг 5 — Проверка автоматического обновления Certbot

Сертификаты Let’s Encrypt действительны только на девяносто дней. Это сделано для того, чтобы побудить пользователей автоматизировать процесс обновления своих сертификатов. Пакет certbot, который мы установили, заботится об этом, добавляя таймер systemd, который будет запускаться дважды в день и автоматически обновлять любой сертификат, который истекает через тридцать дней.

Вы можете проверить статус таймера с помощью systemctl:

  1. sudo systemctl status certbot.timer
Output
● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left Triggers: ● certbot.service

Чтобы протестировать процесс обновления, вы можете выполнить пробный запуск с помощью certbot:

  1. sudo certbot renew --dry-run

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

Заключение

В этом руководстве вы установили клиент Let’s Encrypt certbot, загрузили SSL-сертификаты для вашего домена, настроили Nginx для использования этих сертификатов и настроили автоматическое обновление сертификатов. Если у вас возникнут дополнительные вопросы о использовании Certbot, официальная документация – хорошее место для начала.

Source:
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-20-04