Как обезопасить Nginx с Let’s Encrypt на Debian 12

Для защиты передаваемых данных между веб-сайтом и пользователем, а также для предотвращения перехвата информации или её изменения злоумышленниками, используется протокол HTTPS. Являясь более безопасной версией протокола HTTP, HTTPS сегодня – стандарт для всех современных сайтов. В особенности это касается сайтов, обрабатывающих конфиденциальные данные: пароли, платежи или личную информацию. Более того, наличие HTTPS повышает доверие к сайту у пользователей и улучшает его SEO-рейтинг.

Для получения доступа к сайту по протоколу HTTPS применяются SSL/TLS-сертификаты, которые зашифровывают данные между пользователем и сервером, тем самым защищая передаваемую информацию. Наибольшей популярностью пользуются сертификаты, предоставляемые центром сертификации Let’s Encrypt. Данные сертификаты предоставляются бесплатно и поддерживаются практически всеми современными браузерами и веб-серверами, в том числе Nginx.

Как обезопасить Nginx с Let’s Encrypt

Далее рассмотрим, как установить сертификат Let’s Encrypt на сайт, управляемый веб-сервером Nginx, который работает на виртуальном выделенном сервере с Debian 12.

В Debian 12 наиболее удобным способом установки сертификата от Let’s Encrypt представляется применение утилиты Certbot. Данная утилита является инструментом, специально разработанным для упрощённого получения Let’s Encrypt сертификатов и работы с ними. Certbot автоматизирует процесс генерации, проверки, установки и обновления сертификатов, что делает внедрение протокола HTTPS простым и быстрым.

Для начала, перед установкой нового программного обеспечения обновите информацию о доступных пакетах:

$ sudo apt update

Следующей командой запустите установку утилиты Certbot и плагина для данной утилиты. Устанавливаемый софт позволит автоматически интегрировать и настраивать сертификаты на Nginx:

$ sudo apt install certbot python3-certbot-nginx

Настройка брандмауэра

Если вы используете на своём VPS брандмауэр UFW, вам необходимо добавить в него правило, разрешающее доступ к серверу по порту 443. Данный порт используется для установки соединения по протоколу HTTPS.

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

$ sudo ufw delete allow 'Nginx HTTP'

Затем, чтобы открыть доступ к нашему веб-сайту как по HTTP, так и по HTTPS, необходимо добавить в брандмауэр разрешающее правило для профиля, который называется Nginx Full:

$ sudo ufw allow 'Nginx Full'

Чтобы увидеть список действующих правил брандмауэра, выполните команду:

$ sudo ufw status

Вывод команды должен содержать в том числе разрешающее правило Nginx Full:

Просмотр состояния брандмауэра UFW - Как обезопасить Nginx с Let's Encrypt

На данном этапе веб-сайт по-прежнему доступен по протоколу HTTP, но всё ещё не работает при подключении с использованием HTTPS. Чтобы организовать такое соединение между веб-сервером и клиентом, необходима установка TLS-сертификата.

Установка сертификата Let’s Encrypt

Чтобы установить сертификат Let’s Encrypt, запустите следующую команду, заменив vash-domain.ru на имя вашего домена:

$ sudo certbot --nginx -d vash-domain.ru -d www.vash-domain.ru

В процессе работы утилита попросит вас указать адрес электронной почты. Он будет использоваться для рассылки уведомлений об обновлениях и сообщений о мерах безопасности. Если вы не хотите получать подобные письма, используйте латинский символ c, после чего нажмите Enter. Далее утилита спросит вас о готовности поделиться своим e-mail с Electronic Frontier Foundation после успешной выдачи сертификата. Эта некоммерческая организация является партнёром-основателем проекта Let’s Encrypt, и в том числе занимается разработкой Certbot. На этом процесс регистрации будет завершён и Certbot обратится к Let’s Encrypt для запроса сертификата в отношении указанных доменов. В нашем случае это – vash-domain.ru и www.vash-domain.ru.

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

Процесс установки сертификата Let's Encrypt с помощью утилиты Certbot

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

Let’s Encrypt сертификаты действуют 90 дней. Certbot автоматически создаёт задачу для их обновления. Чтобы проверить, работает ли задача, выполните команду:

$ sudo systemctl list-timers | grep certbot

Вывод команды должен выглядеть примерно так:

Вывод команды sudo systemctl list-timers | grep certbot

Также можно вручную протестировать процесс обновления сертификата:

$ sudo certbot renew --dry-run

На данный момент наш сайт уже доступен по протоколу HTTPS. Чтобы проверить это, откройте браузер и перейдите по адресу https://vash-domain.ru. Естественно, замените vash-domain.ru на доменное имя вашего сайта.

Подключение к веб-сайту через протокол HTTPS - Как обезопасить Nginx с Let's Encrypt

Корректировка конфигурации Nginx

Конфигурация Nginx, скорректированная утилитой Certbot при добавлении в систему TLS-сертификата, в целом абсолютно корректна. При этом можно обратить внимание на некоторые моменты в файле конфигурации, в нашем случае – /etc/nginx/sites-available/vash-domain.ru.

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

В файле конфигурации, скорректированном утилитой Certbot, используются две директивы if для одного и того же действия – return 301:

server
   {
    if ($host = www.vash-domain.ru) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = vash-domain.ru) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

      listen 80;
      listen [::]:80;
      server_name vash-domain.ru www.vash-domain.ru;
    return 404; # managed by Certbot
   }

Такое количество их использований – избыточно. Если запрос на порт 80 не соответствует никакому домену, то он уже будет обработан условием. Применение явного return 404 становится не обязательным. Поэтому, чтобы избежать использования if, можно объединить условия:

server {
    listen 80;
    listen [::]:80;
    server_name vash-domain.ru www.vash-domain.ru;

    return 301 https://$host$request_uri; # Перенаправление всех запросов на HTTPS
   }

Таким образом, все запросы на домены vash-domain.ru и www.vash-domain.ru будут перенаправляться на HTTPS без использования if. При этом также отпадает необходимость в применении директивы return 404.

Следует учитывать, что если вы вносите какие-либо изменения в конфигурацию Nginx, то после этого необходимо проверить её на корректность синтаксиса:

$ sudo nginx -t

И, наконец, чтобы изменения вступили в силу, следует перезапустить службу веб-сервера:

$ sudo systemctl reload nginx

Вам также может понравиться