Приветствую, уважаемый читатель!
Размышляя над фразой
«Безопасности много не бывает», решил внедрить для веб-сервера Apache механизмы обеспечения безопасности HTTP Public Key Pining (HPKP)
и HTTP Strict Transport Security (HSTS) и оценить насколько это просто или сложно.
Полученный опыт ниже.
Начнём с пояснения работы этих механизмов
и остановимся на ключевых моментах.
HTTP Public Key Pining (HPKP)
Как понятно из названия, данный
механизм позволяет привязать публичный ключ. Если быть более точным, то
привязывается хэш публичного ключа из сертификата к соответствующему доменному
имени. Привязка заключается в передаче от веб-сервера клиенту специального HTTP-заголовка (Public-Key-Pins) с хешем ключа. Если валидация предъявленной цепочки сертификатов прошла удачно, то браузер запоминает значение из заголовка. Привязать можно хеш ключа из любого сертификата, который участвует в цепочке валидации для конкретного домена.
HTTP Strict Transport Security (HSTS)
Данный механизм предназначен
для принудительного установления защищенного соединения клиента в веб-сервером
по HTTPS, вместо работы по HTTP. Для активации данного механизма веб-сервер
при первом подключении по HTTPS
передаёт специальный заголовок (Strict Transport Security), браузер его запоминает,
и при следующем подключении по HTTP
переключает на HTTPS.
HPKP
Для внедрения HPKP нам понадобятся следующие компоненты:
- Доменное имя, к которому будем привязывать хэш ключа.
- Дистрибутив OpenSSL для создания своего удостоверяющего (CA) и выпуска сертификатов.
Заранее
скажу, в данном посте не рассматривается сценарий с покупкой сертификата у
какого-либо УЦ или получение бесплатного валидного сертификата.
Доменное имя вы можете купить у
любого регистратора или провайдера, стоит это относительно недорого (от 150р в
год и выше). Предположим, вы это уже сделали.
Создание
собственного CA и
генерация сертификатов
Создать
свой удостоверяющий центр можно с помощью утилиты OpenSSL, она вообще много
чего умеет. Для начала работы перейдите в директорию /etc/ssl/, там должен быть конфигурационный файл openssl.cnf. Настоятельно советую
ознакомится с его содержимым и при необходимости поправить (по умолчанию для
своего CA используется директория /etc/ssl/demoCA,
в которой нужно создать файлы index.txt, serial, crlnumber и
директории private, newcerts).
1) Команда
для создания своего CA:
openssl req -config openssl.cnf -new -x509 -keyout
cakey.pem -out cacert.pem -days 1095
После
её выполнения на основании конфигурационного файла будут созданы ключ(cakey.pem) и сертификат(cacert.pem) нового CA, сроком на 3 года.
Теперь
нам необходимо выпустить 2 сертификата, т.к. по спецификации HPKP привязывается не один хэш
открытого ключа, а два. Один является основным, а второй резервным. Я выпущу 2
сертификата, один для имени splunkbas.ru, второй для имени www.splunkbas.ru.
2) Запрос
на выдачу сертификата для доменного имени splunkbas.ru:
openssl req -config openssl.cnf -new -nodes -keyout splunkbas.ru.key -out splunkbas.ru.csr
На
этом этапе самое главное при запросе «Common
Name» указать точное доменное имя, для которого создаём сертификат.
В моём случае - splunkbas.ru.
3) Подписываем
запрос на получение сертификата и получаем сам сертификат:
openssl ca -config openssl.cnf -out
splunkbas.ru.crt -infiles splunkbas.ru.csr
Собственно, для www.splunkbas.ru процесс генерации и подписания аналогичен.
Для того чтобы браузер начал доверять нашим сертификатам необходимо
импортировать сертификат нашего CA в список доверенных сертификатов. Для Windows
это можно сделать следующим образом: переименовываем cacert.pem в cacert.crt,
открываем файл и нажимаем на кнопку «Установить
сертификат», далее выбираем хранилище сертификатов.
Получение хэшей ключей для привязывания
Оба хэша нам нужны в формате base64, и для их получения необходимо выполнить
следующую команду:
openssl x509
-pubkey < splunkbas.ru.crt | openssl pkey -pubin -outform der | openssl
dgst -sha256 -binary | base64
Получаем
строку, которую необходимо привязать к заголовку:
vBEs8ZsTK1GlzD9cYQNTPdI0CYSQWANMIXQrcu/APwY=
(splunkbas.ru)
fLj4xkeCqmGDuHIrkcnNcv2bNZvC7ikzSqx0pZ6IOcM=
(www.splunkbas.ru)
Добавляем
новый заголовок для Apache
Для этого необходимо в /etc/apache2/sites-available/default-ssl.conf (при
настройках по умолчанию) для нужного Virtual Host добавить следующее:
Header set Public-Key-Pins "pin-sha256=\"vBEs8ZsTK1GlzD9cYQNTPdI0CYSQWANMIXQrcu/APwY=\"; pin-sha256=\"fLj4xkeCqmGDuHIrkcnNcv2bNZvC7ikzSqx0pZ6IOcM=\";
max-age=1000000"
На этом настройка HPKP завершена и нужно перезапустить Apache.
Включаем
HSTS
Для активации механизма HSTS необходимо
в /etc/apache2/sites-available/default-ssl.conf
добавить ещё один заголовок, а именно:
Header always set Strict-Transport-Security
"max-age=1000000; includeSubDomains"
Теперь перезагружаем веб-сервер
и заходим на сайт по HTTPS. Проверить всё ли получилось можно в браузере Chrome, для этого на новой вкладке набираем URL - chrome://net-internals/#hsts,
и в разделе Query domain вбиваем имя интересующего
домена.
Для проверки работоспособности,
с точки зрения защиты от MITM,
можете воспользоваться burp J
Комментариев нет:
Отправить комментарий