среда, 14 декабря 2016 г.

Защищаемся заголовками. Настройка HPKP и HSTS.

Приветствую, уважаемый читатель!

Размышляя над фразой «Безопасности много не бывает», решил внедрить для веб-сервера 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


Комментариев нет:

Отправить комментарий