Как защитить Apache с помощью Let's Encrypt в Debian 8
Введение
В этом руководстве показано, как настроить сертификат TLS/SSL от Let’s Encrypt на сервере Debian 8, на котором в качестве веб-сервера используется Apache. Мы также расскажем, как автоматизировать процесс обновления сертификата с помощью задания cron.
Сертификаты SSL используются на веб-серверах для шифрования трафика между сервером и клиентом, обеспечивая дополнительную безопасность для пользователей, обращающихся к вашему приложению. Let’s Encrypt предоставляет простой способ бесплатно получить и установить доверенные сертификаты.
Предпосылки
Для выполнения этого руководства вам понадобится сервер Debian 8 с пользователем без полномочий root sudo
для административных задач. Вы можете настроить пользователя с соответствующими разрешениями, следуя нашему руководству по начальной настройке сервера Debian 8.
Вы должны владеть или контролировать зарегистрированное доменное имя, с которым хотите использовать сертификат. Если у вас еще нет зарегистрированного доменного имени, вы можете зарегистрировать его у одного из многочисленных регистраторов доменных имен (например, Namecheap, GoDaddy и т. д.).
Если вы еще этого не сделали, обязательно создайте запись A, которая указывает ваш домен на общедоступный IP-адрес вашего сервера (если вы используете DNS DigitalOcean, вы можете следовать этому руководству). Это необходимо из-за того, как Let’s Encrypt проверяет, что вы являетесь владельцем домена, для которого он выдает сертификат. Например, если вы хотите получить сертификат для example.com
, этот домен должен разрешаться на ваш сервер, чтобы процесс проверки работал. Наша установка будет использовать example.com
и www.example.com
в качестве имен доменов, поэтому необходимы обе записи DNS.
Когда вы будете готовы двигаться дальше, войдите на свой сервер, используя свою учетную запись sudo.
Шаг 1. Установите Certbot, клиент Let’s Encrypt
Первым шагом к использованию Let’s Encrypt для получения SSL-сертификата является установка certbot
клиента Let’s 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
После обновления репозитория вы можете установить пакет python-certbot-apache
, который извлекает certbot
, ориентируясь на репозиторий backports:
Примечание. При использовании резервных копий рекомендуется устанавливать только те пакеты, которые вам нужны, а не использовать репозиторий для общих обновлений. Пакеты Backport имеют меньше гарантий совместимости, чем основные репозитории.
Чтобы избежать случайной установки или обновления пакетов с использованием этого репозитория, вы должны явно передать флаг -t
с именем репозитория для установки пакетов из бэкпортов.
- sudo apt-get install python-certbot-apache -t jessie-backports
Теперь клиент certbot
должен быть готов к использованию.
Шаг 2. Настройте Apache ServerName и ServerAlias
Можно передать домены, которые мы хотим защитить, в качестве аргументов при вызове утилиты certbot
. Однако certbot
также может считывать их из самой конфигурации Apache. Поскольку рекомендуется всегда четко указывать домены, на которые должен отвечать ваш сервер, мы установим ServerName
и ServerAlias
непосредственно в конфигурации Apache.
Когда мы устанавливали службу python-certbot-apache
, Apache был установлен, если его еще не было в системе. Откройте файл виртуального хоста Apache по умолчанию, чтобы мы могли явно указать наши доменные имена:
- sudo nano /etc/apache2/sites-available/000-default.conf
Внутри, в блоке Virtual Host, добавьте или раскомментируйте директиву ServerName
и задайте для нее ваше основное доменное имя. Любые альтернативные доменные имена, на которые этот сервер также должен реагировать, можно добавить с помощью директивы ServerAlias
.
В нашем примере мы используем example.com
в качестве канонического имени и www.example.com
в качестве псевдонима. Когда мы установим эти директивы, это будет выглядеть так:
<VirtualHost *:80>
. . .
ServerName example.com
ServerAlias www.example.com
. . .
</VirtualHost>
Когда вы закончите, сохраните и закройте файл, удерживая CTRL и нажав X. Введите Y и нажмите Enter, чтобы сохранить файл.
Проверьте файл конфигурации, чтобы выявить любые синтаксические ошибки, которые могли быть вызваны вашими изменениями:
- sudo apache2ctl configtest
Найдите эту строку в выводе:
OutputSyntax OK
Если файл прошел проверку синтаксиса, перезапустите службу Apache, чтобы изменения вступили в силу:
- sudo systemctl restart apache2
Теперь, когда Apache настроен с вашими доменными именами, мы можем использовать certbot
для получения наших SSL-сертификатов.
Шаг 3: Настройка брандмауэра
Если у вас включен брандмауэр, вам необходимо настроить параметры, чтобы разрешить трафик SSL. Требуемая процедура зависит от используемого вами брандмауэра. Если в настоящее время у вас не настроен брандмауэр, не стесняйтесь пропустить его.
УФВ
Если вы используете ufw, вы можете увидеть текущую настройку, набрав:
- sudo ufw status
Это может выглядеть так, что означает, что к веб-серверу разрешен только SSH-трафик:
OutputStatus: active
To Action From
-- ------ ----
SSH ALLOW Anywhere
SSH (v6) ALLOW Anywhere (v6)
Чтобы дополнительно пропустить трафик HTTP и HTTPS, мы можем разрешить профиль приложения «WWW Full»:
- sudo ufw allow 'WWW Full'
Теперь ваш статус должен выглядеть так:
- 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)
Запросы HTTP и 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 --dport 443 -j ACCEPT
Если мы снова посмотрим на правила брандмауэра, мы должны увидеть новое правило:
- sudo iptables -S
Output-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j 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
при загрузке, вам нужно убедиться, что вы обновили свою конфигурацию с помощью нового правила.
Шаг 4: Настройте SSL-сертификат
Создание SSL-сертификата для Apache с помощью клиента Let’s Encrypt довольно просто. Клиент автоматически получит и установит новый сертификат SSL, действительный для доменов в нашей конфигурации Apache.
Чтобы выполнить интерактивную установку и получить сертификат для всех доменов, определенных в вашей конфигурации Apache, введите:
- sudo certbot --apache
Утилита certbot
оценит вашу конфигурацию Apache, чтобы найти домены, на которые должен распространяться запрошенный сертификат. Вы сможете отменить выбор любых определенных доменов, на которые вы не хотите распространять сертификат.
Вам будет представлено пошаговое руководство по настройке параметров сертификата. Вам будет предложено указать адрес электронной почты для восстановления утерянного ключа и уведомлений, и вы сможете выбрать между включением доступа по http
и https
или принудительной переадресацией всех запросов. на https
. Обычно безопаснее требовать https
, если только вам не нужен незашифрованный трафик http
.
Когда установка будет завершена, вы сможете найти сгенерированные файлы сертификатов в /etc/letsencrypt/live
. Вы можете проверить статус своего SSL-сертификата по следующей ссылке (не забудьте заменить example.com на свой домен):
https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest
Выполнение теста может занять несколько минут. Теперь вы сможете получить доступ к своему веб-сайту, используя префикс https
.
Шаг 5. Настройте автоматическое продление
Сертификаты Let’s Encrypt действительны в течение 90 дней, но рекомендуется обновлять сертификаты каждые 60 дней, чтобы допустить погрешность. Клиент certbot
имеет команду renew
, которая автоматически проверяет установленные сертификаты и пытается обновить их, если до истечения срока их действия осталось менее 30 дней.
Чтобы запустить процесс обновления для всех установленных доменов, вы должны запустить:
- sudo certbot renew
Поскольку мы недавно установили сертификат, команда проверит только дату истечения срока действия и напечатает сообщение о том, что сертификат еще не подлежит обновлению. Вывод должен выглядеть примерно так:
OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal
The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
Обратите внимание, что если вы создали связанный сертификат с несколькими доменами, в выходных данных будет отображаться только базовое имя домена, но продление должно действовать для всех доменов, включенных в этот сертификат.
Практический способ гарантировать, что ваши сертификаты не устареют, — это создать задание cron, которое будет периодически выполнять для вас команду автоматического обновления. Поскольку обновление сначала проверяет дату истечения срока действия и выполняет обновление только в том случае, если до истечения срока действия сертификата осталось менее 30 дней, безопасно создать задание cron, которое выполняется, например, каждую неделю или даже каждый день.
Давайте отредактируем crontab, чтобы создать новое задание, которое будет запускать команду обновления каждую неделю. Чтобы отредактировать crontab для пользователя root, запустите:
- sudo crontab -e
Вам может быть предложено выбрать редактор:
Outputno crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
Choose 1-3 [1]:
Если вам не нравится vim
, нажмите Enter, чтобы использовать nano
по умолчанию.
Включите следующее содержимое в конец crontab, все в одну строку:
crontab. . .
30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
Сохранить и выйти. Это создаст новое задание cron, которое будет выполнять команду letsencrypt-auto renew
каждый понедельник в 2:30. Вывод, созданный командой, будет передан в файл журнала, расположенный по адресу /var/log/le-renewal.log
.
Для получения дополнительной информации о том, как создавать и планировать задания cron, вы можете ознакомиться с нашим руководством по использованию Cron для автоматизации задач в руководстве по VPS.
Заключение
В этом руководстве мы увидели, как установить бесплатный SSL-сертификат от Let’s Encrypt, чтобы защитить веб-сайт, размещенный с помощью Apache. Мы рекомендуем вам время от времени проверять официальный блог Let’s Encrypt на наличие важных обновлений.