Pull to refresh

«HTTP Strict-Transport-Security» или как обезопасить себя от атак «man-in-the-middle» и заставить браузер всегда использовать HTTPS

Reading time 4 min
Views 99K
Внимание к мелочам рождает совершенство,
а вот совершенство уже не мелочь.


Микеланджело Буонарроти


C 2012 года администраторам веб-ресурсов стала доступна новая технология HTTP Strict Transport Security (HSTS) — механизм, активирующий форсированное защищённое соединение по HTTPS. Данная политика безопасности позволяет сразу же устанавливать безопасное соединение, вместо использования HTTP. Механизм использует особый заголовок HTTP Strict-Transport-Security, для переключения пользователя, зашедшего по HTTP, на HTTPS-сервер [1].
HSTS направлен на закрытие следующих уязвимостей к атакам:
Пользователь помещает в закладки или набирает в адресной строке http://example.com/ и становится жертвой атаки «man-in-the-middle» HSTS автоматически преобразует HTTP-запросы в HTTPS для целевого домена
Веб-приложение, предполагаемое к использованию строго по HTTPS, по небрежности содержит HTTP-ссылки или отдает контент по HTTP HSTS автоматически преобразует HTTP-запросы в HTTPS для целевого домена
Атакующий «man-in-the-middle» пытается перехватить трафик жертвы используя поддельный сертификат в надежде, что пользователь не обратит внимания на сообщение о невалидном сертификате HSTS не даст пользователю пройти дальше сообщения о проблемах с сертификатом
Включается данная технология проще простого, необходимо возвращать пользователю HTTP-заголовок «Strict-Transport-Security» в тот момент, когда он заходит на сайт по HTTPS:
Strict-Transport-Security: max-age=expireTime [; includeSubdomains]

expireTime
    Время в секундах, на которое браузер должен запомнить, что данный сайт должен посещаться исключительно по HTTPS. includeSubdomains (опционально)
    Если указать этот необязательный параметр, правила так же применятся ко всем поддоменам.

Что это дает

В случае, если веб-сайт принимает соединения по HTTP и перенаправляет их на HTTPS, пользователь вполне может обратиться к незашифрованной версии сайта до перенаправления если, к примеру, он наберет в адресной строке http://example.com/ или, еще проще, example.com. Это открывает потенциальную возможность проведения атаки «man-in-the-middle», в которой HTTP-перенаправление вместо оригинальной зашифрованной страницы отправит пользователя прямиком на сайт злоумышленника.
Механизм HTTP Strict Transport Security позволяет веб-сайту проинформировать браузер, что тот не должен использовать HTTP и, вместо этого, автоматически со своей стороны преобразовывать все HTTP-запросы в HTTPS.
Например, вы подключаетесь к открытой точке доступа Wi-Fi в публичном месте и открываете ДБО своего любимого банка, чтобы проверить баланс и совершить пару платежей. К несчастью, используемая вами точка доступа на самом-то деле — ноутбук злоумышленника, перехватывающего ваши HTTP-запросы и перенаправляющего вас вместо оригинального сайта банка на страничку-клон. Ваши данные попадают прямо ему в руки.
HSTS решает данную проблему. Если вы хоть раз успешно подключились к веб-сайту банка по HTTPS, использующему «Strict Transport Security», браузер автоматически начнет использовать HTTS для всех запросов. Это предотвратит возможность атак «man-in-the-middle» вышеописанного типа.

Как поступает браузер

Первый раз когда сайт посещается по HTTPS и возвращает заголовок «Strict Transport Security», браузер запоминает указанную информацию и все дальнейшие попытки доступа к сайту по HTTP будут автоматически преобразовываться в HTTPS.
Когда истечет указанный в заголовке «Strict-Transport-Security» таймаут, следующая попытка загрузить сайт по HTTP произойдет в обычном режиме и автоматическое перенаправление на HTTPS не осуществится.
Всякий раз при получении заголовка «Strict-Transport-Security», браузер обновляет таймаут, т.е. сайты имеют возможность обновлять данную информацию и не допустить истечения таймаута (или наоборот, по каким-либо причинам его уменьшить).
Кстати: заголовок «Strict-Transport-Security» игнорируется браузером в случае подключения по HTTP, так как атакующий может перехватить HTTP-соединение и подменить заголовок. Браузер поймет, что сайт HTTPS-совместим и должным образом обработает заголовок «Strict-Transport-Security» в том случае, если доступ к сайту происходит по HTTPS без ошибок с сертификатами.

Поддержка браузерами

  • Chromium и Google Chrome с версий 4.0.211.0
  • Firefox с версии 4 [2]; с Firefox 17, Mozilla внедрила список веб-сайтов, поддерживающих HSTS.
  • Opera с версии 12
  • Safari из комплекта OS X Mavericks

Детали реализации

Заголовки «Strict-Transport-Security» должны передаваться только по HTTPS. Клиенты не должны обрабатывать HSTS заголовки, присланные, не в HTTPS-ответах или по HTTPS с невалидными, неверно настроенными сертификатами. Следующие отрывки конфигурации должны находиться внутри контекста SSL и примеры кода предполагаются исключительно в контексте HTTPS ответов.
Имейте ввиду, что директива «max-age» представлена в секундах. 31536000 секунд (12 месяцев) в примерах ниже м.б. изменены в зависимости от того, как долго администратор веб-сервера предполагает использовать сайт исключительно по HTTPS. Рекомендовано устанавливать значение «max-age» довольно большим вроде 31536000 (12 мес.) или 63072000 (24 мес.). [3]

Реализация в Apache
# подгружаем модуль (на примере RHEL/CentOS)
LoadModule headers_module modules/mod_headers.so
<VirtualHost 10.0.0.1:443>
   # Use HTTP Strict Transport Security to force client to use secure connections only
   Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>

Реализация в Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

Предопределенные HSTS сайты

Существует промежуток в котором пользователь со свежеустановленным браузером и сборошенными настройками оказывается уязвим. По этой причине Chrome и Firefox поддерживают список «предопреденных» HSTS ресурсов. Следующие домены настроены использовать HSTS «из коробки»:
  • Google
  • Paypal
  • Twitter
  • Torproject
  • passport.yandex.ru
Полный список сайтов доступен по ссылке: http://src.chromium.org/viewvc/chrome/trunk/src/net/http/transport_security_state_static.json [4]

Для самостоятельного изучения:

  1. ru.wikipedia.org: HSTS
  2. developer.mozilla.org: HTTP Strict Transport Security
  3. en.wikipedia.org: HTTP Strict Transport Security
  4. dev.chromium.org: HTTP Strict Transport Security
  5. www.owasp.org: Top 10 2010-A9-Insufficient Transport Layer Protection
  6. security.stackexchange.com: How can a web application protect IE users when this browser doesn't support HSTS?
  7. habrahabr.ru: Все на https, безопасно и дешево
  8. habrahabr.ru: На пути к созданию безопасного веб-ресурса. Часть 1 — серверное ПО
Tags:
Hubs:
+36
Comments 33
Comments Comments 33

Articles