Обережно: HSTS

Про HSTS на Хабре вже писали, цей механізм включений в генераторі конфіги для веб-серверів від Mozilla. Написати цей пост я вирішив за один день зіткнувшись з недоступність відразу двох великих сайтів з-за HSTS.

TL;DR: Ретельно перевіряйте роботу сайту за TLS перед включенням HSTS, особливо якщо це великий портал з купою субдоменів.

Що таке HSTS?
HSTS (HTTP Strict Transport Security) — це механізм захисту від даунгрейд-атак на TLS, який вказує браузеру завжди використовувати TLS для сайтів з відповідними політиками. Стандарт описаний в RFC6797, а політики бувають двох видів:

Динамічні

Політика застосовується з HTTP-заголовка Strict-Transport-Security при першому заході на сайт HTTPS, в ньому вказано термін дії і придатність до субдоменам:

Strict-Transport-Security: max-age=15768000; includeSubDomains;

Статичні

Статичні політики захардкожены в браузер і для деяких сайтів містить прив'язку до вищестоящому CA, выпустевшему сертифікат (наприклад: google.com, paypal.com або torproject.org). Причому вона може діяти тільки коли сайт відкритий через TLS, дозволяючи незахищене з'єднання, але блокуючи MitM із заміною сертифіката.

Список Chromium використовують всі популярні браузер (Firefox, Safari, IE 11+Edge) і будь-який бажаючий може відправити заявку на додавання після відповідної установки. Веб-сервер також повинен віддавати заголовок з терміном дії від двох років і ключовим словом preload в кінці:

Strict-Transport-Security: max-age=63072000; includeSubDomains; preload


Як выстрелись собі в ногу?
Днями колеги поскаржилися на недоступність деяких розділів сайту 1С (dist.1c.ru і partweb.1c.ru). Підтримка запевняла, що все працює, у мене проблема не відтворювалася і навіть у колег сайти відкрилися з усіх браузерів, крім основного Chrome. Той видав ERR_CONNECTION_TIMED_OUT через 20 секунд і чомусь наполегливо підставляв HTTPS " в URL, навіть якщо адреса був написаний повністю з HTTP.

Рішення прийшло майже відразу, так як нещодавно згадували HSTS в контексті корпоративного MitM. Гуглеж по ключовому слову першої посиланням підказав, що подивитися кеш політик можна у chrome://net-internals/#hsts і здогадка підтвердилася:

dynamic_sts_domain: 1c.ruFound:
static_sts_domain:
static_upgrade_mode: UNKNOWN
static_sts_include_subdomains:
static_sts_observed:
static_pkp_domain:
static_pkp_include_subdomains:
static_pkp_observed:
static_spki_hashes:
dynamic_sts_domain: 1c.ru
dynamic_upgrade_mode: STRICT
dynamic_sts_include_subdomains: true

dynamic_sts_observed: 1485244696.197302
dynamic_pkp_domain:
dynamic_pkp_include_subdomains:
dynamic_pkp_observed:
dynamic_spki_hashes:

Політика включала всі субдомени, хоча багато з них були доступні тільки на 80 порту без TLS.
Після її видалення потрібні розділи стали відкриватися, по даті отримання (у форматі unix time) в історії браузера знайшли сторінку з неправильними налаштуваннями і відправили багрепорт в 1С.

Другим виявився сайтом ask.mcdonalds.ru, який відкривався перший раз, однак Chrome все одно показав попередження з вже знайомої четырехбуквенной абревіатурою і без звичної кнопки Proceed to (unsafe):

ER_CERT_COMMON

Помилка говорить про невідповідність імені сертифіката, закінчення терміну дії або його відкликання, а показ кнопки для відкриття сайту прямо заборонений RFC. При цьому політика для mcdonalds.ru виявилася статичної, яку не можна видалити з chrome://net-internals/#hsts.

Обійти таку заглушку в Chrome можна набравши badidea (попереднім було danger) або запустивши браузер з ключем --ignore-certificate-errors.

У Firefox треба натиснути «Forge About This Site» навпроти сайту в історії, відкрити about:config і створити новий Integer з ім'ям «test.currentTimeOffsetSeconds» і значенням 11491200, а потім відкрити сайт в новій вкладці.

Висновки
Не включайте потенційно небезпечні функції без розуміння принципів їх роботи. Оцінку «A» тест від SSL Labs ви отримаєте і без HSTS, а включити його можна після перевірки всього функціоналу через TLS. Зі статичним листом в браузері шляху назад вже не буде, тому краще відразу придбати сертифікат з wildcard.

p.s.

Chrome і Firefox підтримують додатковий механізм захисту: HTTP Public Key Pinning (HPKP), позволяющий прив'язати хеш сертифіката і відправляти повідомлення власнику, якщо браузеру попадеться сертифікат від публічного CA для його домену з іншим хешем. Він допоміг розкрити кілька инциденов з публічними CA, але на практиці використовується дуже рідко з-за високої ціни помилки.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.