Как обезопасить Nginx с помощью Let’s Encrypt на Rocky Linux 9

Введение

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

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

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

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

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

  • Один сервер Rocky Linux 9 настроенный в соответствии с инициальной настройкой сервера для Rocky Linux 9 пошаговой инструкции, включая пользователя с возможностью использования sudo и настройку брандмауэра.

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

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

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

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

Сначала вам необходимо установить пакет программного обеспечения certbot. Войдите в свою машину Rocky Linux 8 от имени вашего нерутового пользователя:

  1. ssh sammy@your_server_ip

Пакет certbot по умолчанию недоступен через менеджер пакетов. Вам нужно будет включить репозиторий EPEL, чтобы установить Certbot.

Чтобы добавить репозиторий Rocky Linux 9 EPEL, выполните следующую команду:

  1. sudo dnf install epel-release

Когда будет предложено подтвердить установку, введите y и нажмите Enter.

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

  1. sudo dnf install certbot python3-certbot-nginx

Это установит сам Certbot и плагин Nginx для Certbot, который необходим для запуска программы.

В процессе установки вас попросят импортировать GPG-ключ. Подтвердите это, чтобы завершить установку.

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

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

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

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

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

  1. sudo nano /etc/nginx/conf.d/example.com

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

/etc/nginx/conf.d/example.com
...
server_name example.com www.example.com;
...

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

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

  1. sudo nginx -t

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

  1. sudo systemctl reload nginx

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

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

Шаг 3 — Обновление правил брандмауэра

Поскольку ваша предварительная настройка позволяет использовать firewalld, вам нужно будет настроить параметры брандмауэра, чтобы разрешить внешние подключения к вашему веб-серверу Nginx.

Чтобы проверить, какие службы уже включены, выполните команду:

  1. sudo firewall-cmd --permanent --list-all

Вы получите вывод, подобный следующему:

Output
public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

Если вы не видите http в списке служб, включите его, выполнив:

  1. sudo firewall-cmd --permanent --add-service=http

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

  1. sudo firewall-cmd --permanent --add-service=https

Чтобы применить изменения, вам нужно будет перезагрузить службу брандмауэра:

  1. sudo firewall-cmd --reload

Теперь, когда вы открыли свой сервер для трафика https, вы готовы запустить Certbot и получить свои сертификаты.

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

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

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

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

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

Output
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem This certificate expires on 2022-12-15. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background. Deploying certificate Successfully deployed certificate for your_domain to /etc/nginx/conf.d/your_domain.conf Successfully deployed certificate for www.your_domain to /etc/nginx/conf.d/your_domain.conf Congratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain

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

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

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

Сертификаты Let’s Encrypt действительны в течение 90 дней, но рекомендуется обновлять их каждые 60 дней, чтобы иметь запас времени на случай ошибки. Клиент Certbot Let’s Encrypt имеет команду `renew`, которая автоматически проверяет установленные в данный момент сертификаты и пытается обновить их, если они остаются менее чем на 30 дней до истечения срока действия.

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

  1. sudo certbot renew --dry-run

Результат будет похож на это:

Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/your_domain.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator nginx, Installer nginx Renewing an existing certificate Performing the following challenges: http-01 challenge for monitoring.pp.ua Waiting for verification... Cleaning up challenges - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - new certificate deployed with reload of nginx server; fullchain is /etc/letsencrypt/live/your_domain/fullchain.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/your_domain/fullchain.pem (success) ...

Обратите внимание, что если вы создали объединенный сертификат с несколькими доменами, в выводе будет показано только базовое имя домена, но обновление будет работать для всех доменов, включенных в этот сертификат.

A practical way to ensure your certificates will not get outdated is to create a cron job that will periodically execute the automatic renewal command for you. Since the renewal first checks for the expiration date and only executes the renewal if the certificate is less than 30 days away from expiration, it is safe to create a cron job that runs every week, or even every day.

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

  1. sudo crontab -e

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

crontab
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet

Когда закончите, нажмите ESC, чтобы выйти из режима вставки, затем :wq и ENTER, чтобы сохранить и выйти из файла. Чтобы узнать больше о текстовом редакторе Vi и его преемнике Vim, ознакомьтесь с нашим учебным пособием Установка и использование текстового редактора Vim на облачном сервере.

Это создаст новую задачу cron, которая будет выполняться в полдень и в полночь каждый день. python -c 'import random; import time; time.sleep(random.random() * 3600)' выберет случайную минуту в течение часа для ваших задач обновления.

Команда renew для Certbot будет проверять все установленные на системе сертификаты и обновлять те, которые установлены на срок менее тридцати дней. Параметр --quiet указывает Certbot не выводить информацию или ожидать ввода пользователя.

Более подробную информацию о продлении можно найти в документации Certbot.

Заключение

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

Также вы можете проверить официальный блог Let’s Encrypt на предмет важных обновлений время от времени.

Source:
https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-rocky-linux-9