Поиск по сайту:

Как защитить 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 на свой сервер, набрав:

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

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

  1. sudo apt-get update

После обновления репозитория вы можете установить пакет python-certbot-apache, который извлекает certbot, ориентируясь на репозиторий backports:

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

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

  1. 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 по умолчанию, чтобы мы могли явно указать наши доменные имена:

  1. 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, чтобы сохранить файл.

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

  1. sudo apache2ctl configtest

Найдите эту строку в выводе:

Output
Syntax OK

Если файл прошел проверку синтаксиса, перезапустите службу Apache, чтобы изменения вступили в силу:

  1. sudo systemctl restart apache2

Теперь, когда Apache настроен с вашими доменными именами, мы можем использовать certbot для получения наших SSL-сертификатов.

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

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

УФВ

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

  1. sudo ufw status

Это может выглядеть так, что означает, что к веб-серверу разрешен только SSH-трафик:

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

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

  1. sudo ufw allow 'WWW Full'

Теперь ваш статус должен выглядеть так:

  1. sudo ufw status
Output
Status: 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, вы можете просмотреть текущие правила, набрав:

  1. 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, набрав:

  1. sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT

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

  1. 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, введите:

  1. 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 дней.

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

  1. sudo certbot renew

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

Output
Saving 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, запустите:

  1. sudo crontab -e

Вам может быть предложено выбрать редактор:

Output
no 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 на наличие важных обновлений.