Как защитить Apache с использованием Let’s Encrypt на Ubuntu

Введение

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

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

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

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

  1. Установка Certbot
  2. Проверка конфигурации виртуального хоста Apache
  3. Разрешение HTTPS через межсетевой экран
  4. Получение SSL-сертификата
  5. Проверка автоматического обновления Certbot

Требования

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

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

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

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

    • Запись A с ваш_домен, указывающая на публичный IP-адрес вашего сервера.
    • Запись A с www.ваш_домен, указывающая на публичный IP-адрес вашего сервера.
  • Apache установлен согласно инструкции по установке Apache на Ubuntu. Убедитесь, что у вас есть файл виртуального хоста для вашего домена. В этом руководстве в качестве примера будет использоваться /etc/apache2/sites-available/ваш_домен.conf.

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

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

Сначала обновите локальный индекс пакетов:

  1. sudo apt update

Вам нужны два пакета: certbot и python3-certbot-apache. Последний является плагином, который интегрирует Certbot с Apache, позволяя автоматизировать получение сертификата и настройку HTTPS на вашем веб-сервере с помощью одной команды:

  1. sudo apt install certbot python3-certbot-apache

Вам будет предложено подтвердить установку, нажав Y, а затем ENTER.

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

Шаг 2 — Проверка конфигурации вашего виртуального хоста Apache

Для автоматического получения и настройки SSL для вашего веб-сервера, Certbot необходимо найти правильный виртуальный хост в файлах конфигурации Apache. Имя(а) домена вашего сервера будут извлечены из директив ServerName и ServerAlias, определенных в блоке конфигурации VirtualHost.

Если вы следовали шагу настройки виртуального хоста в руководстве по установке Apache, то у вас должен быть блок VirtualHost, настроенный для вашего домена в файле /etc/apache2/sites-available/ваш_домен.conf с уже установленными директивами ServerName и ServerAlias.

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

  1. sudo nano /etc/apache2/sites-available/your_domain.conf

Nайдите существующие строки ServerName и ServerAlias. Они должны быть указаны следующим образом:

/etc/apache2/sites-available/your_domain.conf
...
ServerName your_domain
ServerAlias www.your_domain
...

Если у вас уже настроены ServerName и ServerAlias таким образом, вы можете выйти из текстового редактора и перейти к следующему шагу. Если текущая конфигурация виртуального хоста не соответствует примеру, обновите ее соответственно. Если вы используете nano, вы можете выйти, нажав CTRL+X, затем Y и ENTER, чтобы подтвердить ваши изменения, если таковые имеются. Затем выполните следующую команду, чтобы проверить ваши изменения:

  1. sudo apache2ctl configtest

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

  1. sudo systemctl reload apache2

С этих изменениями Certbot сможет найти правильный блок VirtualHost и обновить его.

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

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

Если у вас включен брандмауэр UFW, как рекомендуется в руководствах по предварительным условиям, вам нужно будет скорректировать настройки, чтобы разрешить трафик HTTPS. После установки Apache зарегистрирует несколько различных профилей приложений UFW. Вы можете использовать профиль Apache Full, чтобы разрешить как HTTP, так и HTTPS трафик на вашем сервере.

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

  1. sudo ufw status

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

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

Чтобы разрешить HTTPS-трафик, разрешите профиль “Apache Full”:

  1. sudo ufw allow 'Apache Full'

Затем удалите избыточный профиль “Apache”:

  1. sudo ufw delete allow 'Apache'

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

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

Теперь вы готовы запустить Certbot и получить ваши сертификаты.

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

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

  1. sudo certbot --apache

Этот сценарий попросит вас ответить на ряд вопросов, чтобы настроить ваш SSL-сертификат. Сначала он попросит вас указать действительный адрес электронной почты. Этот адрес электронной почты будет использоваться для уведомлений о возобновлении и уведомлений о безопасности:

Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): you@your_domain

После указания действительного адреса электронной почты нажмите ENTER, чтобы перейти к следующему шагу. Затем вас попросят подтвердить, согласны ли вы с условиями обслуживания Let’s Encrypt. Вы можете подтвердить, нажав Y, а затем ENTER:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

В следующем шаге вам будет предложено поделиться вашим адресом электронной почты с Electronic Frontier Foundation для получения новостей и другой информации. Если вы не хотите подписаться на их контент, введите N. В противном случае, введите Y, затем нажмите ENTER, чтобы перейти к следующему шагу:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

В следующем шаге вам нужно будет сообщить Certbot, для каких доменов вы хотите активировать HTTPS. Записанные имена доменов автоматически получены из вашей конфигурации виртуального хоста Apache, поэтому важно убедиться, что у вас правильно настроены параметры ServerName и ServerAlias в вашем виртуальном хосте. Если вы хотите включить HTTPS для всех перечисленных имен доменов (рекомендуется), вы можете оставить поле пустым и нажать ENTER, чтобы продолжить. В противном случае, выберите домены, для которых хотите включить HTTPS, перечислив соответствующие номера, разделенные запятыми и/ или пробелами, затем нажмите ENTER:

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: your_domain
2: www.your_domain
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 

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

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-07-10. 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/apache2/sites-available/your_domain-le-ssl.conf Successfully deployed certificate for www.your_domain.com to /etc/apache2/sites-available/your_domain-le-ssl.conf Congratulations! You have successfully enabled HTTPS on https:/your_domain and https://www.your_domain.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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

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

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

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

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

Пакет certbot, который вы установили, занимается обновлениями, включая сценарий обновления в /etc/cron.d, который управляется службой systemctl под названием certbot.timer. Этот сценарий запускается дважды в день и автоматически обновляет любой сертификат, срок действия которого истекает в течение тридцати дней.

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

  1. sudo systemctl status certbot.timer

Ваш вывод будет похож на следующее:

Output
● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset:> Active: active (waiting) since Mon 2022-04-11 20:52:46 UTC; 4min 3s ago Trigger: Tue 2022-04-12 00:56:55 UTC; 4h 0min left Triggers: ● certbot.service Apr 11 20:52:46 jammy-encrypt systemd[1]: Started Run certbot twice daily.

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

  1. sudo certbot renew --dry-run
Output
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/your_domain.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Account registered. Simulating renewal of an existing certificate for your_domain and www.your_domain.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations, all simulated renewals succeeded: /etc/letsencrypt/live/your_domain/fullchain.pem (success) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

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

Заключение

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

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