Как обезопасить Apache с Let's Encrypt на CentOS 7
Автор Александр Желюк, Last modified by Александр Желюк на 15 April 2016 17:14 PM

Как обезопасить Apache с Let's Encrypt на CentOS 7

 

Введение

 

Этот урок покажет вам, как настроить TLS/SSL сертификат от Let’s Encrypt на сервере CentOS 7 под управлением Apache в качестве веб-сервера. Кроме того, мы рассмотрим, как автоматизировать процесс обновления сертификата с помощью cron задачи.

 

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

 

Требования

 

Для того, чтобы завершить это руководство, вам потребуется:

 

  • CentOS 7 сервер с некорневым sudo пользователем, который вы можете настроить, следуя нашим руководством по установке сервера

  • Веб-сервер Apache установлен с одним или несколькими правильно настроенными доменными именами

 

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

 

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

 

Шаг 1. Создание виртуального хостинга для вашего домена

 

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

 

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

 

Создание структуры каталогов

 

Мы начнем с создания новой структуры каталогов для хранения ваших файлов виртуальных хостов внутри каталога конфигурации Apache, /etc/httpd. Мы будем следовать стандартной структуре введенной дистрибутивами на основе Debian, что делает более легким включение и отключение сайтов, которые настроены в качестве виртуальных хостов внутри Apache.

 

Доступ к каталогу конфигурации Apache с:

 

$ cd /etc/httpd

 

Во-первых, создайте каталог, который будет содержать все доступные сайты на этом сервере:

 

$ sudo mkdir /etc/httpd/sites-available

 

Далее, создайте каталог, который будет вмещать активные в данный момент (включенные) веб-сайты, размещенных на этом сервере. Этот каталог будет содержать только символические ссылки на файлы виртуальных хостов, расположенных внутри /etc/httpd/sites-available.

 

$ sudo mkdir /etc/httpd/sites-enabled

 

Теперь нам нужно сообщить Apache, как найти файлы виртуальные хостов. Для достижения этой цели мы будем редактировать основной конфигурационный файл Apache и добавлять строку, объявляя дополнительный каталог для дополнительных конфигурационных файлов. С помощью командной строки вашего любимого текстового редактора, откройте файл /etc/httpd/conf/httpd.conf:

 

$ sudo nano /etc/httpd/conf/httpd.conf

 

Добавьте эту строку в конец файла:

 

IncludeOptional sites-enabled/*.conf

 

Сохраните и закройте файл, когда добавите эту строку.

 

Создание нового файла виртуального хоста

 

Следующим шагом является создание файла конфигурации виртуального хоста. С помощью командной строки вашего любимого текстового редактора, создайте новый файл под /etc/httpd/sites-available. Мы назовем файл example.com.conf, но вы можете выбрать любое имя. Важно, однако, чтоб файл заканчивался расширением .conf.

$ sudo nano /etc/httpd/sites-available/example.com.conf

 

Добавьте следующее содержимое в файл, заменив example.com вашим собственным доменом:

 

<VirtualHost *:80>
   ServerName example.com
   ServerAlias www.example.com
   DocumentRoot /var/www/html
   ErrorLog /var/log/apache/example.com/error.log
</VirtualHost>

 

Сохраните файл и выйдите. Ниже вы можете найти краткое описание каждой опции конфигурации, используемой для этого примера:

 

  • ServerName: имя вашего главного домена.

  • ServerAlias (optional): алиас для основного домена. Это обычная практика, чтобы добавить WWW субдомен в качестве алиаса (псевдонима) основного домена.

  • DocumentRoot: место, где должны быть найдены файлы веб-сайта. В конфигурации Apache по умолчанию на CentOS 7, главный корневой документ, как правило, /var/www/html, но вы можете изменить это значение, если вы хотите разместить файлы сайта в другом месте на сервере.

  • ErrorLog (необязательно): пользовательское место для ведения журнала ошибок, характерных для данного виртуального хоста. Если вы не укажете эту опцию, ошибки будут регистрироваться в журнале ошибок Apache по умолчанию: /var/log/httpd/error_log.

 

Включение виртуального хоста

 

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

 

$ sudo ln -s /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-enabled/example.com.conf

 

Таким образом, всякий раз, когда вы хотите, чтобы отключить виртуальный хост, вы можете просто удалить ссылку внутри sites-enabled и перезагрузить службу Apache, сохраняя исходный файл виртуального хоста внутри sites-available для любых будущих нужд.

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

 

Откройте файл /etc/httpd/conf/httpd.conf и ищите директивы  ServerName и ServerAlias. Если они установлены в том же домене, который вы настроили в качестве виртуального хоста, вы должны закомментировать их, добавив знак # в начале строки:

 

$ sudo nano /etc/httpd/conf/httpd.conf

 


# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName example.com:80
#ServerAlias www.example.com


Все, что осталось сделать сейчас - это перезапустить Apache, чтобы изменения вступили в силу:

 

$ sudo systemctl restart httpd

 

Шаг 2. Установка зависимостей сервера

 

Прежде чем мы сможем установить Let’s Encrypt клиент и сгенерировать сертификат SSL, нам нужно установить несколько зависимостей на сервере CentOS.

 

Во-первых, установите репозиторий EPEL (Extra Packages for Enterprise Linux):

 

$ sudo yum install epel-release


Нам понадобится git, чтобы загрузить Let’s Encrypt клиент. Для установки git, выполните следующую команду:

 

$ sudo yum install git

 

Теперь вы должны быть готовы следовать остальной части этого руководства.

 

Шаг 3. Скачивание Let’s Encrypt клиента

 

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

 

Мы скопируем репозиторий Let’s Encrypt в /opt, который является стандартный каталогом для размещения программного обеспечения сторонних производителей на системах Unix:

 

$ sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

 

Это создаст локальную копию официального репозитория Let’s Encrypt под /opt/letsencrypt.

 

Шаг 4. Настройка SSL-сертификата

 

Создание SSL сертификата для Apache с помощью Let’s Encrypt клиента довольно простое. Клиент автоматически получит и установит новый сертификат SSL, который действителен для доменов, предоставленных в качестве параметров.

 

Доступ к каталогу letsencrypt:

 

$ cd /opt/letsencrypt

 

Чтобы выполнить интерактивную установку и получить сертификат, который охватывает только один домен, выполните команду letsencrypt-auto:

 

$ ./letsencrypt-auto --apache -d example.com

 

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

 

$ ./letsencrypt-auto --apache -d example.com -d www.example.com

 

Для этого примера, базовым доменом будет example.com.

 

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

 

Когда установка успешно завершена, вы должны увидеть сообщение, похожее на это:

Output:

IMPORTANT NOTES:

- If you lose your account credentials, you can recover through

  e-mails sent to user@example.com

- Congratulations! Your certificate and chain have been saved at

  /etc/letsencrypt/live/example.com/fullchain.pem. Your

  cert will expire on 2016-03-15. To obtain a new version of the

  certificate in the future, simply run Let's Encrypt again.

- Your account credentials have been saved in your Let's Encrypt

  configuration directory at /etc/letsencrypt. You should make a

  secure backup of this folder now. This configuration directory will

  also contain certificates and private keys obtained by Let's

  Encrypt so making regular backups of this folder is ideal.

- If like Let's Encrypt, please consider supporting our work by:

 

  Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

  Donating to EFF:                      https://eff.org/donate-le


Сформированные файлы сертификатов должны быть доступны в /etc/letsencrypt/live.

 

Организация ваших виртуальных хостов

 

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

 

Чтобы сохранить ваши файлы виртуальных хостов организованными и в соответствии со значениями по умолчанию, вы можете переместить этот новый файл виртуального хоста в каталог sites-available и создать символическую ссылку внутри sites-enabled:

 

$ sudo mv /etc/httpd/sites-enabled/example.com-le-ssl.conf /etc/httpd/sites-available/example.com-le-ssl.conf

 

$ sudo ln -s /etc/httpd/sites-available/example.com-le-ssl.conf /etc/httpd/sites-enabled/example.com-le-ssl.conf

Ваш каталог sites-enabled должен выглядеть примерно следующим образом:

 

lrwxrwxrwx 1 root root   48 Jan 25 12:37 example.com.conf -> /etc/httpd/sites-available/example.com.conf
lrwxrwxrwx 1 root root   55 Jan 25 12:44 example.com-le-ssl.conf -> /etc/httpd/sites-available/example.com-le-ssl.conf

Перезапустите Apache, чтобы применить изменения:

 

$ sudo systemctl restart httpd

 

Проверка состояния сертификата

 

Вы можете проверить статус вашего SSL сертификата по следующей ссылке (не забудьте заменить example.com вашим базовим доменом):

 

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

 

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

 

Шаг 5. Настройка автопродления

 

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

 

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

 

./letsencrypt-auto renew

 

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

 

Checking for new version...
Requesting root privileges to run letsencrypt...
  /root/.local/share/letsencrypt/bin/letsencrypt renew
Processing /etc/letsencrypt/renewal/example.com.conf

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 для корневого пользователя, выполните следующую команду:

 

$ sudo crontab -e

 

Включите следующее содержимое, все в одной строке:

 

30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log

 

Сохраните и выйдите. Это создаст новую cron задачу, которая будет выполнять letsencrypt-auto renew команду каждый понедельник в 2:30 утра, и перезагружать Nginx в 2:35 утра (поэтому обновленный сертификат будет использоваться). Вывод, генерируемый командой будет поступать в лог-файл, расположенный в /var/log/le-renewal.log.

 

Шаг 6. Обновление Let’s Encrypt клиента (не обязательно)

 

Каждый раз, когда будут доступны новые обновления для клиента, вы можете обновить локальную копию, запустив git pull изнутри каталога Let’s Encrypt:

 

$ cd /opt/letsencrypt
$ sudo git pull

Это позволит загрузить все последние изменения в хранилище, обновив ваш клиент.

 

Заключение

 

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

(0 голос(а))
Эта статья полезна
Эта статья бесполезна

Комментарии (0)
Добавить новый комментарий
 
 
Полное имя:
Email:
Комментарии:
Проверка CAPTCHA 
 
Пожалуйста, введите текст, находящийся на изображении, в текстовое поле ниже (этот метод используется для предотвращения отправки автоматических сообщений).