Осторожно: 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) и добавить в него сайт может любой желающий, если веб-сервер отдаёт заголовок Strict-Transport-Security со сроком действия от двух лет и ключевым словом 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.ru
    Found:
    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 можно набрав thisisunsafe (предыдущим волшебным словом были 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, но на практике используется очень редко из-за высокой цены ошибки.

    P.P.S.


    Интересен состав захардкоженных политик в Chromium: кроме сети фастуда, нескольких доменов Mail.ru и Яндекса, там есть только ЮниКредит из ТОП-15 российски банков. Нет ни модного ТКС, ни Qiwi, ни WebMoney, а динамические политики оказались включены лишь у Qiwi и для адресов интернет-банков Бинбанка, МКБ, Открытия, Райффайзена и РСХБ.

    Ещё там нет Телеграма, но есть Whatsapp, а в логе изменений встречаются запросы на удаление (!) ошибочно включенных сайтов, где какое-то время был preload в заголовке.
    Поделиться публикацией
    Комментарии 14
      +3
      HTTP Public Key Pinning (HPKP) [...] но на практике используется очень редко из-за высокой цены ошибки.

      И зря, ведь есть режим Public-Key-Pins-Report-Only, который вместо "не пущать" включает режим "пожаловаться в спортлото".

        0

        я вот не могу понять, если, допустим, через MitM кто-то подменил сертификат своего сайта, чтобы он выглядел "как фейсбук", то как можно полагаться на жалобы, если они идут через то же, скомпрометированное соединение?

          0

          Надеяться на них — нельзя. А вот пришедшей жалобе доверять можно.

          0
          От спортлото мало толку, тем более Гугол обещал сделать глобальный CT log.
          А хардкорный режим следует включать после покупки HSM, но он дорогой и требуется в основном банкам с платёжными шлюзами.
          –1
          Не включайте потенциально опасные функции без понимания принципов их работы. Оценку «A» в тесте от SSL Labs вы получите и без HSTS, а включить его можно после проверки всего функционала через TLS.

          Для начала не А, а А+. Затем про HSTS — ваш совет вредный, если на сервере используется https то на нем юзера и надо оставить. Следом про кривые настройки — это пусть админы серверов отдупляют работу, следят за обновлением сертификатов поставят letsencrypt в кроне.
            +2

            Как минимум, перед включением HSTS для всех поддоменов надо настроить HTTPS на всех серверах. Перед, а не после.


            А когда переходят на HTTPS — обычно как раз с основного сайта и начинают. Поэтому объединять в одну работу настройку HTTPS и включение HSTS — нельзя. Надо добыть сертификаты для всех субдоменов, настроить все сервера, проверить работоспособность — и только потом включать HSTS.

              –4
              Блаблабла, давайте еще гайд напишем, сисадмин за 15 минут. Ейбогу, к чему так драматизировать?
              Наклепать пачку сертификатов с letsencrypt (если жаба душит за wildcard), и добавить строчку в nginx c HSTS заголовком. Вот и все.
              Но никак не писать, мол все плохо, HSTS такая западня, чуть-что — все криво, не включайте.
              Тут всю статью можно представить в виде твита: Нашел криворучек, прописали HSTS и не позаботились, блаблабла. Все.
                0
                Нафига вся эта паранойя человеку, который просто хочет видеть зелёный значок в адресной строке Хрома?
                  +2

                  Я не уверен, что каждый, кто пробует включать у себя HSTS осознаёт, что удалённо его не отключит у пользователя, если поймёт, что что-то пошло не так, ведь отключить HSTS можно только в рамках валидного соединения по https.


                  Однако, по настоящему дельный совет, ставить HSTS для начала в несколько секунд и проверять, работает ли всё, я почему-то встречаю далеко не в каждой статье.

                +1
                Вся разница между А и А+ как раз HSTS. Исключительно.
                0
                С HSTS проблема надуманная. Работает, безопасность повышает (теоретически).
                Вот с Public-Key-Pins проблема при замене (не своевременной) сертификата, если включен в strict режим.
                  0
                  По просьбам трудящихся проверил ТОП российских банков и там всё очень печально: в статическом листе есть всего один, а динамические политики включены ещё у пяти, но только для поддоменов с ИБ.
                  0
                  Вот что говорит сам гугол…

                  Используйте технологию HSTS

                  На сайтах, использующих протокол HTTPS, рекомендуется применять технологию HSTS. В этом случае браузер будет запрашивать страницы HTTPS, даже если пользователь введет http в адресной строке, а Google будет отображать в результатах поиска только защищенные URL. Все это снижает вероятность показа пользователям незащищенного содержания.

                  Чтобы применять HSTS, используйте веб-сервер, поддерживающий эту технологию.

                  Технология HSTS усложняет процесс отката, поэтому ее включение следует выполнять следующим образом:

                  Выполните переход на HTTPS, не включая HSTS.
                  Активируйте отправку заголовков HSTS с минимальным значением директивы max-age. Отслеживайте объем трафика пользователей и других клиентов, а также эффективность зависимых объектов, например объявлений.
                  Постепенно увеличивайте значение директивы max-age в заголовках HSTS.

                  Если HSTS не затрудняет пользователям и поисковым системам просмотр веб-страниц, то сайт можно включить в список предварительной загрузки HSTS в браузере Google Chrome.


                  https://support.google.com/webmasters/answer/6073543?hl=ru
                    +1
                    добавить в него сайт может любой желающий, если веб-сервер отдаёт заголовок Strict-Transport-Security со сроком действия от двух лет

                    Что-то вы про два года вроде перегнули. Официально так звучит: «The max-age must be at least eighteen weeks (10886400 seconds)» — т.е., собственно, что-то вроде 4 с половиной месяца.

                    И это сейчас, а раньше в него добавляли и без учета этого условия (возможно, как-то и проверяли, чтобы не 5 минут было, но официально ничего не писали).

                    Ну а что
                    Политика включала все субдомены, хотя многие из них были доступны только на 80 порту без TLS.

                    От 1С ничего прямо сделанного и не ждешь — как-то практика говорит, что накладки не то что могут быть, а прямо-таки почти наверняка будут.

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое