Как защитить Nginx с помощью Let’s Encrypt в Debian 8

Вступление

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

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

изображение: https: //assets.digitalocean.com/articles/letsencrypt/nginx-letsencrypt.png [Nginx с сертификатом Let’s Encrypt TLS / SSL и автоматическим обновлением]

Предпосылки

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

У вас должен быть сервер Debian 8 с пользователем без полномочий root, который имеет права + sudo +. Вы можете узнать, как настроить такую ​​учетную запись пользователя, следуя нашей initial настройке сервера для учебника Debian 8.

Если вы еще не установили Nginx на свой сервер, сделайте это, следуя this guide.

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

Если вы этого еще не сделали, обязательно создайте * A Record *, который указывает ваш домен на публичный IP-адрес вашего сервера (если вы используете DNS DigitalOcean, вы можете следовать https://www.digitalocean.com/community. / tutorials / how-to-setup-a-host-name-with-digitalocean [это руководство]). Это необходимо из-за того, что Let’s Encrypt проверяет, что вы являетесь владельцем домена, для которого выдается сертификат. Например, если вы хотите получить сертификат для + example.com +, этот домен должен разрешиться на ваш сервер, чтобы процесс проверки заработал. Наша установка будет использовать + example.com + и + www.example.com + в качестве доменных имен, поэтому * необходимы обе записи DNS *.

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

Шаг 1: Установите Certbot, клиент Let Encrypt

Первым шагом к использованию Let Encrypt для получения SSL-сертификата является установка на вашем сервере клиента + certbot + `Let Encrypt.

Пакет + certbot + был недоступен, когда вышел Debian 8. Чтобы получить доступ к пакету + certbot +, нам нужно будет включить репозиторий Jessie backports на нашем сервере. Этот репозиторий можно использовать для установки более новых версий программного обеспечения, чем те, которые включены в стабильные репозитории.

Добавьте репозиторий backports на свой сервер, набрав:

echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list

После добавления нового репозитория обновите индекс пакета + apt +, чтобы загрузить информацию о новых пакетах:

sudo apt-get update

После обновления хранилища вы можете установить пакет + certbot +, настроив хранилище backports:

sudo apt-get install certbot -t jessie-backports

Клиент + certbot + теперь должен быть готов к использованию.

Шаг 2: Получить сертификат SSL

Let’s Encrypt предоставляет различные способы получения SSL-сертификатов с помощью различных плагинов. В отличие от плагина Apache, который описан в другом учебнике https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-debian-8], большинство плагинов помогут вам только в получении сертификата, который вы должны вручную настроить для использования на своем веб-сервере. Плагины, которые только получают сертификаты и не устанавливают их, называются «аутентификаторами», поскольку они используются для проверки подлинности того, должен ли сервер выдавать сертификат.

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

Как использовать плагин Webroot

Плагин Webroot работает, помещая специальный файл в каталог + /. Well-known + в корневом каталоге вашего документа, который может быть открыт (через ваш веб-сервер) службой Let Encrypt для проверки. В зависимости от вашей конфигурации вам может потребоваться явно разрешить доступ к каталогу + /. Well-known +.

Если вы еще не установили Nginx, сделайте это, следуя thisutorial. Продолжайте ниже, когда вы закончите.

Чтобы убедиться, что каталог доступен для проверки Let Encrypt, давайте быстро изменим нашу конфигурацию Nginx. По умолчанию он находится в + / etc / nginx / sites-available / default +. Мы будем использовать + nano для его редактирования:

sudo nano /etc/nginx/sites-available/default

Внутри блока сервера добавьте этот блок местоположения:

Добавить в блок SSL сервера

       location ~ /.well-known {
               allow all;
       }

Вы также можете посмотреть, на что установлен корневой документ, с помощью поиска директивы + root +, так как путь необходим для использования плагина Webroot. Если вы используете файл конфигурации по умолчанию, корнем будет + / var / www / html.

Сохранить и выйти.

Проверьте вашу конфигурацию на наличие синтаксических ошибок:

sudo nginx -t
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Если ошибок не найдено, перезапустите Nginx с помощью этой команды:

sudo systemctl restart nginx

Теперь, когда мы знаем наш + webroot-path +, мы можем использовать плагин Webroot для запроса SSL-сертификата с этими командами. Здесь мы также указываем наши доменные имена с опцией + -d +. Если вы хотите, чтобы один сертификат работал с несколькими доменными именами (например, + example.com + и + www.example.com +), обязательно включите их все. Кроме того, убедитесь, что вы заменили выделенные части на соответствующий путь webroot и доменные имена:

sudo certbot certonly -a webroot --webroot-path= -d  -d

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

Output:IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
  fullchain.pem. Your cert
  will expire on . 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"
- If you lose your account credentials, you can recover through
  e-mails sent to [email protected].
- 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

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

Файлы сертификатов

После получения сертификата у вас будут следующие PEM-кодированные файлы:

  • * cert.pem: * Сертификат вашего домена

  • * chain.pem: * Сертификат цепочки Let’s Encrypt

  • * fullchain.pem: * + cert.pem + и + chain.pem + вместе

  • * privkey.pem: * Закрытый ключ вашего сертификата.

Важно, чтобы вы знали о местонахождении файлов сертификатов, которые были только что созданы, чтобы вы могли использовать их в конфигурации вашего веб-сервера. Сами файлы помещаются в подкаталог в + / etc / letsencrypt / archive +. Однако Let’s Encrypt создает символические ссылки на самые последние файлы сертификатов в каталоге + / etc / letsencrypt / live / +. Поскольку ссылки всегда будут указывать на самые последние файлы сертификатов, этот путь следует использовать для ссылки на файлы сертификатов.

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

sudo ls -l /etc/letsencrypt/live/

Выходными данными должны быть четыре ранее упомянутых файла сертификата. Вскоре вы настроите свой веб-сервер на использование + fullchain.pem + в качестве файла сертификата и + privkey.pem + в качестве файла ключа сертификата.

Генерация сильной группы Диффи-Хеллмана

Для дальнейшего повышения безопасности вы также должны создать сильную группу Диффи-Хеллмана. Чтобы сгенерировать 2048-битную группу, используйте эту команду:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Это может занять несколько минут, но когда это будет сделано, у вас будет сильная группа DH в + / etc / ssl / certs / dhparam.pem +.

Шаг 3. Настройте TLS / SSL на веб-сервере (Nginx)

Теперь, когда у вас есть сертификат SSL, вам необходимо настроить веб-сервер Nginx для его использования.

Мы внесем несколько изменений в нашу конфигурацию:

  1. Мы создадим фрагмент конфигурации, содержащий наш ключ SSL и расположение файла сертификата.

  2. Мы создадим фрагмент конфигурации, содержащий строгие настройки SSL, которые могут быть использованы с любыми сертификатами в будущем.

  3. Мы настроим серверные блоки Nginx для обработки запросов SSL и используем два приведенных выше фрагмента.

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

Создать фрагмент конфигурации, указывающий на ключ SSL и сертификат

Во-первых, давайте создадим новый фрагмент конфигурации Nginx в каталоге + / etc / nginx / snippets +.

Чтобы правильно определить назначение этого файла, мы назовем его + ssl- +, за которым следует имя нашего домена, за которым следует + .conf + в конце:

sudo nano /etc/nginx/snippets/ssl-.conf

В этом файле нам просто нужно установить директиву + ssl_certificate + для нашего файла сертификата, а + ssl_certificate_key + для соответствующего ключа. В нашем случае это будет выглядеть так:

/etc/nginx/snippets/ssl-example.com.conf

ssl_certificate /etc/letsencrypt/live//fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live//privkey.pem;

Когда вы добавите эти строки, сохраните и закройте файл.

Создайте фрагмент конфигурации с надежными настройками шифрования

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

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

sudo nano /etc/nginx/snippets/ssl-params.conf

Для безопасной настройки Nginx SSL мы будем использовать рекомендации Remy van Elst на сайте https://cipherli.st [Cipherli.st]. Этот сайт предназначен для предоставления простых в использовании настроек шифрования для популярного программного обеспечения. Вы можете прочитать больше о его решениях относительно выбора Nginx here.

Для наших целей мы можем скопировать предоставленные настройки в полном объеме. Нам просто нужно сделать несколько небольших модификаций.

Во-первых, мы добавим наш предпочтительный преобразователь DNS для исходящих запросов. Мы будем использовать Google для этого руководства. Мы также продолжим и установим параметр + ssl_dhparam +, чтобы он указывал на файл Диффи-Хеллмана, который мы создали ранее.

Наконец, вы должны уделить немного времени чтению на HTTP Strict Transport Security, или HSTS, а именно о https://hstspreload.appspot.com/ [ Функциональность «предварительной загрузки». Предварительная загрузка HSTS обеспечивает повышенную безопасность, но может иметь далеко идущие последствия, если ее случайно включить или включить неправильно. В этом руководстве мы не будем предварительно загружать настройки, но вы можете изменить это, если уверены, что понимаете последствия:

/etc/nginx/snippets/ssl-params.conf

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver  valid=300s;
resolver_timeout 5s;


add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

Сохраните и закройте файл, когда вы закончите.

Настройте конфигурацию Nginx для использования SSL

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

В этом руководстве мы будем предполагать, что вы используете файл блока сервера + default + в каталоге + / etc / nginx / sites-available +. Если вы используете другой файл блока сервера, подставьте его имя в приведенные ниже команды.

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

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

Теперь откройте файл блока сервера, чтобы внести изменения:

sudo nano /etc/nginx/sites-available/default

Внутри ваш серверный блок, вероятно, начинается так:

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

server {
   listen 80 default_server;
   listen [::]:80 default_server;

   # SSL configuration

   # listen 443 ssl default_server;
   # listen [::]:443 ssl default_server;

   . . .

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

Мы будем разбивать конфигурацию на два отдельных блока. После двух первых директив + listen + мы добавим директиву + server_name +, указав имя домена вашего сервера. Затем мы настроим перенаправление на второй блок сервера, который будем создавать. После этого мы закроем этот короткий блок:

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

server {
   listen 80 default_server;
   listen [::]:80 default_server;
   server_name  www.;



   # SSL configuration

   # listen 443 ssl default_server;
   # listen [::]:443 ssl default_server;

   . . .

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

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

server {
   listen 80 default_server;
   listen [::]:80 default_server;
   server_name  www.;
   return 301 https://$server_name$request_uri;
}



   # SSL configuration






   . . .

Сохраните и закройте файл, когда вы закончите.

(Альтернативная конфигурация) Разрешить трафик HTTP и HTTPS

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

/ И т.д. / Nginx / сайты-отсутствуют / по умолчанию

server {
   listen 80 default_server;
   listen [::]:80 default_server;



   server_name  www.;



   . . .

Сохраните и закройте файл, когда вы закончите.

Шаг 4: Настройте брандмауэр

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

UFW

Если вы используете * ufw *, вы можете увидеть текущие настройки, набрав:

sudo ufw status

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

OutputStatus: active

To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere
WWW                        ALLOW       Anywhere
SSH (v6)                   ALLOW       Anywhere (v6)
WWW (v6)                   ALLOW       Anywhere (v6)

Чтобы дополнительно разрешить HTTPS-трафик, мы можем разрешить профиль «WWW Full», а затем удалить избыточный допуск профиля «WWW»:

sudo ufw allow 'WWW Full'
sudo ufw delete allow 'WWW'

Ваш статус должен выглядеть следующим образом:

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere
WWW Full                   ALLOW       Anywhere
SSH (v6)                   ALLOW       Anywhere (v6)
WWW Full (v6)              ALLOW       Anywhere (v6)

Запросы HTTPS теперь должны приниматься вашим сервером.

IPTables

Если вы используете + iptables +, вы можете увидеть текущие правила, набрав:

sudo iptables -S

Если у вас есть какие-либо правила, они будут отображаться. Пример конфигурации может выглядеть так:

Output-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Команды, необходимые для открытия трафика SSL, будут зависеть от ваших текущих правил. Для базового набора правил, подобного приведенному выше, вы можете добавить доступ SSL, набрав:

sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

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

sudo iptables -S
Output-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Если вы используете программу для автоматического применения правил + iptables + при загрузке, вам следует убедиться, что вы обновили свою конфигурацию новым правилом.

Шаг 5: Включение изменений в Nginx

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

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

sudo nginx -t

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

Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

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

sudo systemctl restart nginx

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

Вы можете использовать отчет Qualys SSL Labs, чтобы увидеть, как оценивается конфигурация вашего сервера:

In a web browser:https://www.ssllabs.com/ssltest/analyze.html?d=

Это может занять несколько минут. Настройка SSL в этом руководстве должна содержать как минимум оценку * A *.

Шаг 6: Настройте автоматическое продление

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

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

sudo certbot renew

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

Output:Saving debug log to /var/log/letsencrypt/.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
 /etc/letsencrypt/live//fullchain.pem (skipped)
No renewals were attempted.

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

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

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

sudo crontab -e

Если вы впервые используете + crontab +, вас могут попросить выбрать предпочитаемый текстовый редактор. Если у вас нет сильных предпочтений, * nano * - легкий выбор.

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

crontab entry30 2 * * * /usr/bin/certbot renew --noninteractive --renew-hook "/bin/systemctl reload nginx" >> /var/log/le-renew.log

Сохранить и выйти. Это создаст новое задание cron, которое будет выполнять команду + certbot renew + каждый день в 2:30 и перезагрузить Nginx, если сертификат будет обновлен. Вывод этой команды будет передан в файл журнала, расположенный по адресу + / var / log / le-renewal.log +.

Заключение

Это оно! Ваш веб-сервер теперь использует бесплатный сертификат Let Encrypt TLS / SSL для безопасного обслуживания содержимого HTTPS.

Related