Внедрение закрепления открытого ключа с помощью отчетов HPKP

Использование SSL на вашем сайте — важный способ сохранить безопасность и конфиденциальность ваших пользователей. Но включение SSL — это еще не конец истории: вы можете предпринять множество шагов для дальнейшего повышения безопасности, обеспечиваемой вашим сайтом: от установки атрибута Secure в файлах cookie до включения строгой транспортной безопасности HTTP и использования политики безопасности контента для заблокируйте привилегии вашего сайта. Однако развертывание этих мощных функций иногда может быть непростым. Чтобы помочь вам внедрить более строгую форму SSL, в Chrome 46 реализована функция отчетов HPKP.

Что означают все эти аббревиатуры?

Безопасность в Интернете сегодня опирается на сертификаты SSL: криптографические подписи, доказывающие, что веб-сайт является тем, кем он себя называет. Когда ваш браузер отправляет запрос на URL-адрес, например https://developers.google.com , сервер предоставляет сертификат SSL, и если сертификат действителен, браузер разрешает выполнение запроса и отображает URL-адрес веб-сайта зеленым цветом. замок в адресной строке.

Но что такое действительный сертификат? Чтобы считаться действительным, сертификат должен быть подписан центром сертификации (ЦС) или другим сертификатом, подписанным ЦС (известным как промежуточный ЦС). Браузеры и операционные системы поставляются со списком из нескольких сотен центров сертификации, которым доверено выдавать сертификаты. Проблема, однако, в том, что по умолчанию любой из этих центров сертификации может выдавать сертификаты для любого веб-сайта. Если какой-либо из них будет скомпрометирован или будет вести себя некорректно, это может иметь разрушительные последствия для всей сети.

Введите «Закрепление открытого ключа HTTP» или HPKP. Этот стандарт позволяет веб-сайтам отправлять HTTP-заголовок, инструктирующий браузер запомнить (или «закрепить») части цепочки сертификатов SSL. После этого браузер будет отклонять последующие соединения, которые не соответствуют ранее полученным контактам. Вот пример заголовка HPKP:

Public-Key-Pins:  
       pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
       max-age=259200

Этот заголовок определяет два хеша сертификата в качестве контактов. Один из них — это хэш сертификата в цепочке сертификатов сайта, а другой — резервный PIN-код или хэш сертификата, который сайт может использовать в случае необходимости ротации своего сертификата. Заголовок также включает значение max-age . По истечении этого количества секунд браузер забудет о PIN-коде.

Дополнительную информацию о HPKP в целом можно найти в спецификации или в превосходной записи блога коллеги-разработчика Chrome Криса Палмера.

Должен ли я включить HPKP прямо сейчас?

Не обязательно. При развертывании HPKP довольно легко допустить ошибку и случайно нанести DoS-атак на ваш сайт. Если вы прикрепите свой сайт к одному набору сертификатов, а затем вам придется развернуть новый, пользователи, увидевшие PIN-код, не смогут получить доступ к вашему сайту до истечения срока действия PIN-кода (на основе значения max-age в заголовке).

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

Что представляет собой отчет HPKP и чем он полезен?

Отчеты HPKP, поставляемые в Chrome 46, — это функция, которую можно использовать для обнаружения неправильных конфигураций при развертывании HPKP.

Во-первых, вы можете начать с отправки заголовка Public-Key-Pins-Report-Only вместо заголовка Public-Key-Pins:

Public-Key-Pins-Report-Only: 
       max-age=2592000;  
       pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
report-uri="https://example.net/pkp-report"

Когда ваш сайт отправляет такой заголовок, Chrome проверит, соответствует ли текущее соединение контактам, и в противном случае отправляет отчет в report-uri . Chrome никогда не будет блокировать запросы на основе контактов в заголовке «Только отчет», поэтому это безопасный способ опробовать HPKP и посмотреть, не вызывает ли он проблем у ваших пользователей, не рискуя атаковать ваш сайт.

Обратите внимание, что заголовок Report-Only применяется только к запросу, по которому он получен. Браузер не запоминает пины только для отчетов, как это происходит с реальными пинами. Это позволяет вам тестировать вашу конфигурацию, не беспокоясь о кэшировании неверных значений в браузерах ваших пользователей, и вы можете развертывать ее постепенно (например, только на одном ресурсе), чтобы избежать перегрузки вашего сервера отчетами.

Когда вы развертываете настоящий заголовок Public-Key-Pins , чтобы начать принудительное применение ваших контактов, вы также можете включить в этот заголовок значение report-uri, чтобы продолжать получать отчеты в случае возникновения каких-либо проблем.

Что содержится в отчете о нарушении HPKP?

Отчет о нарушении HPKP — это сообщение JSON, отправленное в HTTP-запросе POST на настроенный вами report-uri . Список полей можно найти в спецификации , но я выделю здесь два из них: served-certificate-chain и validated-certificate-chain . served-certificate-chain — это сертификат в том виде, в котором Chrome получил его при настройке SSL-соединения для запроса. С другой стороны, validated-certificate-chain — это цепочка, которую Chrome перестраивает при попытке проверить сертификат сервера, которая, как ни удивительно, может отличаться от served-certificate-chain . Разные клиенты выполняют проверку сертификата по-разному, и это может быть распространенной причиной неправильных настроек HPKP. Обязательно проверьте это поле, если вы получаете неожиданные отчеты.

Последняя «попался»

Если вы развертываете отчеты HPKP, помните, что Chrome выполняет проверку контактов для всех запросов, включая запросы на отправку отчетов. Поэтому, если вы развернули HPKP на своем сайте, вы, вероятно, захотите отправлять отчеты HPKP в другой домен, который вы не закрепили. В противном случае нарушение PIN-кода на вашем сайте приведет к отправке отчета в тот же домен, что также не приведет к нарушению PIN-кода, и поэтому вы не получите отчет.

Если у вас нет под рукой другого домена, вы можете вместо этого попробовать воспользоваться такой службой, как report-uri.io, которая обрабатывает за вас отчеты о нарушениях.