Защита Apache с помощью Let’s Encrypt в FreeBSD 12.0

Let’s Encrypt – это центр сертификации (СА, Certificate Authority), который позволяет быстро и легко получить TLS/SSL сертификат для HTTPS-шифрования трафика. Программный клиент Certbot делает процесс запроса и установки сертификатов еще проще, автоматизируя большую часть задач.

Данный мануал поможет вам установить Certbot  и получить TLS/SSL сертификат Let’s Encrypt для веб-сервера Apache в операционной системе FreeBSD 12.0. Также вы научитесь автоматизировать обновление сертификатов с помощью демона cron.

Требования

  • Сервер FreeBSD 12.0, настроенный согласно этому мануалу.
  • Установка Apache (в мануале есть специальный раздел с инструкциями).
  • Включенный брандмауэр.
  • Две DNS-записи A, указывающие на домен или IP-адрес сервера. В наших примерах используется условный домен your-domain и www.your-domain. Подробнее о настройке DNS-записей мы рассказали здесь. Записи А необходимы Let’s Encrypt, чтобы проверить ваше право на домен, для которого вы запрашиваете сертификат. Например, если вы хотите получить сертификат для your-domain, этот домен должен разрешаться ан ваш сервер, чтобы вы прошли проверку и получили сертификат.

1: Установка клиента Certbot

Сертификат Let’s Encrypt позволяет браузерам ваших пользователей убедиться, что веб-сервер защищен доверенным центром сертификации. Такая связь с веб-сервером защищена шифрованием HTTPS.

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

Выполните следующую команду, чтобы установить пакет Certbot и его плагин Apache HTTP:

sudo pkg install -y py36-certbot py36-certbot-apache

Теперь, когда вы установили пакет, вы можете перейти к включению соединений TLS на веб-сервере.

2: Поддержка соединений SSL/TLS в Apache HTTP

По умолчанию каждая установка Apache HTTP обслуживает контент через порт 80 (HTTP). Запись Listen 80 в главном конфигурационном файле httpd.conf подтверждает это. Чтобы разрешить HTTPS-соединения, нужно добавить порт по умолчанию 443. Чтобы добавить его и установить SSL/TLS-соединения, нужно включить модуль mod_ssl в Apache HTTP.

Найти этот модуль в файле httpd.conf можно с помощью grep с флагом -n (этот флаг нужен для нумерации строк в файле). Вы найдете mod_ssl.so, запустив следующую команду:

grep -n 'mod_ssl.so' /usr/local/etc/apache24/httpd.conf

В выводе вы получите номер строки, которая отвечает за настройку этого модуля:

148 #LoadModule ssl_module libexec/apache24/mod_ssl.so

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

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

sudo vi +148 /usr/local/etc/apache24/httpd.conf

Эта команда приведет вас прямо к правильной строке, которую нужно отредактировать, нажав x. Строка должна выглядеть следующим образом,:

#LoadModule session_dbd_module libexec/apache24/mod_session_dbd.so
#LoadModule slotmem_shm_module libexec/apache24/mod_slotmem_shm.so
#LoadModule slotmem_plain_module libexec/apache24/mod_slotmem_plain.so
LoadModule ssl_module libexec/apache24/mod_ssl.so
#LoadModule dialup_module libexec/apache24/mod_dialup.so
#LoadModule http2_module libexec/apache24/mod_http2.so
#LoadModule proxy_http2_module libexec/apache24/mod_proxy_http2.so

После удаления # нажмите :wq, а затем ввод, чтобы закрыть файл.

Итак, вы включили поддержку SSL/TLS в Apache HTTP. Далее мы настроим виртуальные хосты Apache.

3: Включение и настройка виртуальных хостов

Виртуальный хост позволяет одновременно обслуживать несколько независимых сайтов в рамках одной установки Apache. Клиенту Certbot нужны определенные правила в файле виртуального  хоста для работы сертификатов Let’s Encrypt.

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

grep -n 'vhosts' /usr/local/etc/apache24/httpd.conf

Вы увидите такой вывод:

508  #Include etc/apache24/extra/httpd-vhosts.conf

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

sudo vi +508 /usr/local/etc/apache24/httpd.conf

Как и раньше, нажмите x, чтобы удалить # в начале строки, чтобы строка выглядела следующим образом:

...
# User home directories
#Include etc/apache24/extra/httpd-userdir.conf
# Real-time info on requests and configuration
#Include etc/apache24/extra/httpd-info.conf
# Virtual hosts
Include etc/apache24/extra/httpd-vhosts.conf
# Local access to the Apache HTTP Server Manual
#Include etc/apache24/extra/httpd-manual.conf
# Distributed authoring and versioning (WebDAV)
#Include etc/apache24/extra/httpd-dav.conf
...

Сохраните и закройте файл.

Итак, вы включили поддержку виртуальных хостов в Apache. Теперь нужно отредактировать стандартный виртуальный хост и заменить условные домены вашими данными.

Давайте добавим в виртуальный хост httpd-vhosts.conf новый блок. Мы удалим из файла два стандартных блока VirtualHost, которые идут за блоком комментариев (строка 23). Запустите команду:

sudo vi +23 /usr/local/etc/apache24/extra/httpd-vhosts.conf

Удалите из файла существующие блоки VirtualHost, а затем добавьте в файл следующий блок конфигураций.

<VirtualHost *:80>
ServerAdmin your_email@your_domain.com
DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
ServerName your_domain.com
ServerAlias www.your_domain.com
ErrorLog "/var/log/your_domain.com-error_log"
CustomLog "/var/log/your_domain.com-access_log" common
</VirtualHost>

В блоке находятся такие настройки:

  • ServerAdmin: электронная почта лица, ответственного за этот конкретный сайт.
  • DocumentRoot: эта директива определяет корневой каталог, где хранятся файлы сайта.
  • ServerName: домен сайта.
  • ServerAlias: алиасы сайта. Почти как ServerName, но с www. перед доменным именем.
  • ErrorLog: путь к логу ошибок. Все сообщения об ошибках будут записаны в файл, указанный в этой директиве.
  • CustomLog: эта директива аналогична ErrorLog, но предназначена для логов доступа.

Теперь нужно создать каталог, в котором будет размещен сайт. Этот путь должен совпадать с тем, который вы объявили в директиве DocumentRoot в файле httpd-vhosts.conf.

sudo mkdir /usr/local/www/apache24/data/your_domain.com

Теперь измените права доступа к каталогу, чтобы процесс Apache (работающий как wwwuser) мог взаимодействовать с ним:

sudo chown -R www:www /usr/local/www/apache24/data/your_domain.com

Команда chown изменила владельца, флаг –R сделал ее действие рекурсивным. Пользователь и группа задаются параметрами www: www.

4: Включение модуля rewrite

Модуль rewrite в Apache необходим для изменения URL-адресов, например, при перенаправлении с HTTP на HTTPS.

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

grep -n 'rewrite' /usr/local/etc/apache24/httpd.conf

Вы увидите похожий вывод:

180  #LoadModule rewrite_module libexec/apache24/mod_rewrite.so

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

sudo vi +180 /usr/local/etc/apache24/httpd.conf

Отредактируйте ваш файл, чтобы он выглядел следующим образом, (нажмите x, чтобы удалить #):

#LoadModule actions_module libexec/apache24/mod_actions.so
#LoadModule speling_module libexec/apache24/mod_speling.so
#LoadModule userdir_module libexec/apache24/mod_userdir.so
LoadModule alias_module libexec/apache24/mod_alias.so
LoadModule rewrite_module libexec/apache24/mod_rewrite.so
LoadModule php7_module        libexec/apache24/libphp7.so
# Third party modules
IncludeOptional etc/apache24/modules.d/[0-9][0-9][0-9]_*.conf
<IfModule unixd_module>

Сохраните и закройте файл.

Вы завершили настройку необходимых конфигураций Apache.

5: Получение сертификата Let’s Encrypt

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

sudo certbot --apache -d your-domain -d www.your-domain

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

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

Если проверка прошла успешно, Certbot спросит, как вы хотите настроить HTTPS:

. . .
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Вы также можете выбрать между доступом HTTP и HTTPS или принудительно перенаправить все запросы на HTTPS. Для большей безопасности рекомендуется выбрать опцию 2: Redirect, если у вас нет особой необходимости поддерживать незашифрованные соединения. Сделайте выбор, а затем нажмите Enter.

Это обновит конфигурацию и перезагрузит Apache HTTP, чтобы новые настройки вступили в силу. Клиент certbot завершит работу, сообщит, что процесс прошел успешно, и покажет, где хранятся ваши сертификаты:

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/usr/local/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/usr/local/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on yyyy-mm-dd. 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"
- Your account credentials have been saved in your Certbot
configuration directory at /usr/local/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

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

Certbot сделал несколько важных изменений в конфигурации. Когда он устанавливает сертификаты на веб-сервер, он размещает их по определенным путям. Если вы сейчас просмотрите содержимое файла httpd-vhosts.conf, вы увидите несколько изменений, внесенных программой Certbot.

Например, в конце раздела <VirtualHost *:80> находятся правила перенаправления.

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.your_domain.com [OR] RewriteCond %{SERVER_NAME} =your_domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Также Certbot создал файл httpd-vhosts-le-ssl.conf, где хранятся параметры сертификатов для Apache.

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin your_email@your_domain.com
DocumentRoot "/usr/local/www/apache24/data/your_domain.com"
ServerName your_domain.com
ServerAlias www.your_domain.com
ErrorLog "/var/log/your_domain.com-error_log"
CustomLog "/var/log/your_domain.com-access_log" common
Include /usr/local/etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /usr/local/etc/letsencrypt/live/your_domain.com/fullchain.pem
SSLCertificateKeyFile /usr/local/etc/letsencrypt/live/your_domain.com/privkey.pem
</VirtualHost>
</IfModule>

Примечание: Если вы хотите изменить шифронабор на сайтах с поддержкой сертификатов Let’s Encrypt, вы можете отредактировать файл /usr/local/etc/letsencrypt/options-ssl-apache.conf.

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

6: Настройка автоматического обновления сертификата

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

Сначала давайте рассмотрим команду, которую можно использовать для обновления сертификата. У клиента certbot есть команда renew, которая автоматически проверяет установленные сертификаты и пытается их обновить, если срок их действия истечет менее чем через 30 дней. Используя опцию –dry-run, вы можете запустить симуляцию этой задачи, чтобы посмотреть, как работает обновление:

sudo certbot renew --dry-run

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

Официальная документация Certbot рекомендует запускать cron дважды в день: если Let’s Encrypt инициирует отзыв сертификата, то Certbot продлит его максимум через полдня.

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

sudo crontab -e

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

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# Order of crontab fields
# minute          hour     mday    month   wday command
0        0,12    *           *          *       /usr/local/bin/certbot renew

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

Заключение

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

Tags: , , , ,

Добавить комментарий