Как обезопасить 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 Record *, который указывает ваш домен на публичный IP-адрес вашего сервера (если вы используете DNS DigitalOcean, вы можете следовать https://www.digitalocean.com/community. / tutorials / how-to-setup-a-host-name-with-digitalocean [это руководство]). Это необходимо из-за того, что Let’s Encrypt проверяет, что вы являетесь владельцем домена, для которого выдается сертификат. Например, если вы хотите получить сертификат для + example.com +, этот домен должен разрешиться на ваш сервер, чтобы процесс проверки заработал. Наша установка будет использовать + example.com + и + www.example.com + в качестве доменных имен, поэтому * необходимы обе записи DNS *.

Когда вы будете готовы двигаться дальше, войдите на свой сервер, используя свою учетную запись sudo.

Шаг 1: Установите Certbot, клиент Let Encrypt

Первым шагом к использованию Let Encrypt для получения SSL-сертификата является установка на вашем сервере клиента + certbot + `Let 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:

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 + в качестве псевдонима. Когда мы установим эти директивы, это будет выглядеть так:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
   . . .
   ServerName
   ServerAlias
   . . .
</VirtualHost>

Когда вы закончите, сохраните и закройте файл, удерживая * CTRL * и нажимая * X *. Введите * Y * и нажмите * Enter *, чтобы сохранить файл.

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

sudo apache2ctl configtest

Ищите эту строку в выводе:

OutputSyntax OK

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

sudo systemctl restart apache2

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

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

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

UFW

Если вы используете * 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 -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 Encrypt довольно проста. Клиент автоматически получит и установит новый сертификат SSL, действительный для доменов в нашей конфигурации Apache.

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

sudo certbot --apache

Утилита + certbot + оценит вашу конфигурацию Apache, чтобы найти домены, которые должны быть покрыты запрошенным сертификатом. Вы сможете отменить выбор любых определенных доменов, которые вы не хотите охватывать сертификатом.

Вам будет предложено пошаговое руководство по настройке параметров сертификата. Вам будет предложено указать адрес электронной почты для восстановления потерянного ключа и уведомления, и вы сможете выбрать между разрешением доступа + http + и + https + или принудительным перенаправлением всех запросов на + https +. Обычно наиболее безопасно требовать + https +, если только у вас нет особой потребности в незашифрованном + http + трафике.

Когда установка будет завершена, вы сможете найти сгенерированные файлы сертификатов в + / etc / letsencrypt / live +. Вы можете проверить статус своего SSL-сертификата по следующей ссылке (не забудьте заменить свой домен):

https://www.ssllabs.com/ssltest/analyze.html?d=&latest

Тест может занять несколько минут. Теперь вы сможете получить доступ к своему веб-сайту с помощью префикса + https +.

Шаг 5: Настройте автоматическое продление

Сертификаты Let Encrypt действительны в течение 90 дней, но рекомендуется обновлять сертификаты каждые 60 дней, чтобы допускать погрешность. Клиент + certbot + имеет команду + renew +, которая автоматически проверяет установленные сертификаты и пытается обновить их, если срок их действия истек менее чем через 30 дней.

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

sudo certbot renew

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

OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
 /etc/letsencrypt/live//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 +.

Заключение

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

Related