Безопасный веб-сервер Nginx с помощью Let's Encrypt в Ubuntu 16.04

Secure Nginx with Let's Encrypt on Ubuntu 16.04

28 Августа 2020 | Ubuntu

В этом руководстве мы предоставим пошаговые инструкции о том, как защитить ваш Nginx с помощью Let's Encrypt с помощью инструмента certbot в Ubuntu 16.04.

Безопасный веб-сервер Nginx с помощью Let's Encrypt в Ubuntu 16.04

Let's Encrypt - это бесплатный открытый центр сертификации, разработанный исследовательской группой Internet Security Research Group (ISRG). Сертификатам, выданным Let's Encrypt, сегодня доверяют почти все браузеры.



Введение

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

Установить Certbot 

Certbot - это утилита, написанная на Python, которая может автоматизировать задачи по получению и обновлению SSL-сертификатов Let's Encrypt и настройке веб-серверов.

Сначала установите software-properties-common пакет, который предоставляет add-apt-repository инструмент, необходимый для добавления дополнительных PPA.

Обновите индекс пакетов и установите software-properties-common :

sudo apt update sudo apt install software-properties-common 


После завершения установки добавьте репозиторий certbot PPA в вашу систему, используя следующую команду:

sudo add-apt-repository ppa:certbot/certbot 

Обновите список пакетов и установите пакет certbot:

sudo apt update sudo apt install certbot 

Создать сильную группу Dh (Диффи-Хеллмана) 

Обмен ключами Диффи – Хеллмана (DH) - это метод безопасного обмена криптографическими ключами по незащищенному каналу связи. Сгенерируйте новый набор 2048-битных параметров DH для усиления безопасности:

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

При желании вы можете изменить размер до 4096 бит, но в этом случае генерация может занять более 30 минут в зависимости от энтропии системы.

Получение SSL-сертификата Let's Encrypt

Чтобы получить сертификат SSL для нашего домена, мы собираемся использовать плагин Webroot, который работает путем создания временного файла для проверки запрошенного домена в ${webroot-path}/.well-known/acme-challenge каталоге. Сервер Let's Encrypt отправляет HTTP-запросы к временному файлу, чтобы убедиться, что запрошенный домен разрешается на сервер, на котором работает certbot.

Чтобы упростить задачу, мы собираемся сопоставить все HTTP-запросы для .well-known/acme-challenge одного каталога /var/lib/letsencrypt .

Следующие команды создадут каталог и сделают его доступным для записи для сервера Nginx.

sudo mkdir -p /var/lib/letsencrypt/.well-known sudo chgrp www-data /var/lib/letsencrypt sudo chmod g+s /var/lib/letsencrypt 

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

/etc/nginx/snippets/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;
}
 

/etc/nginx/snippets/ssl.conf
ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;

add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
 

Приведенный выше фрагмент включает в себя программы-измельчители, рекомендованные Mozilla , включает сшивание OCSP, HTTP Strict Transport Security (HSTS) и обеспечивает соблюдение нескольких ориентированных на безопасность заголовков HTTP.

После создания фрагментов откройте блок сервера домена и letsencrypt.confвключите фрагмент, как показано ниже:


/etc/nginx/sites-available/example.com.conf
server {
  listen 80;
  server_name example.com www.example.com;

  include snippets/letsencrypt.conf;
} 

Активируйте серверный блок, создав символическую ссылку с sites-availableна sites-enabled:

sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf 

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

sudo systemctl reload nginx 

Запустите сценарий certbot с подключаемым модулем webroot и получите файлы сертификата SSL:

sudo certbot certonly --agree-tos --email admin@example.com --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com 

Если сертификат SSL получен успешно, certbot напечатает следующее сообщение:

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 2018-04-23. 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 like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   ............................
   Donating to EFF:                    ............................
 

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

/etc/nginx/sites-available/example.com.conf
server {
    listen 80;
    server_name www.example.com example.com;

    include snippets/letsencrypt.conf;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    # . . . other code
}
 

В приведенной выше конфигурации мы форсируем HTTPS и перенаправляем www версию домена на non www версию.

Перезагрузите службу Nginx, чтобы изменения вступили в силу:

sudo systemctl reload nginx 

Автоматическое продление SSL-сертификата 

Сертификаты Let's Encrypt действительны в течение 90 дней. Чтобы автоматически обновлять сертификаты до истечения срока их действия, пакет certbot создает задание cron, которое запускается дважды в день и автоматически обновляет любой сертификат за 30 дней до истечения срока его действия.

Поскольку мы используем подключаемый модуль certbot webroot после обновления сертификата, нам также необходимо перезагрузить службу nginx. Для этого добавьте файл --renew-hook "systemctl reload nginx" в /etc/cron.d/certbot файл так, чтобы он выглядел так:

/etc/cron.d/certbot
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx"
 

Чтобы протестировать процесс обновления, используйте --dry-run переключатель certbot :

sudo certbot renew --dry-run 

Если ошибок нет, значит процесс продления прошел успешно.

Вывод 

В этом руководстве вы использовали клиент Let's Encrypt, certbot, для получения сертификатов SSL для вашего домена. Вы также создали сниппеты Nginx, чтобы избежать дублирования кода, и настроили Nginx для использования сертификатов. В конце руководства вы настроили задание cron для автоматического продления сертификата.

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


    Комментарии

    Если у вас есть вопросы, не стесняйтесь оставлять комментарии ниже.

Загрузка комментариев...