Насколько строга ваша транспортная безопасность

Источник: «Security Tip: How Strict Is your Transport Security?»
HTTPS — повсюду, но HTTP всё ещё остаётся доступным… Как остановить злоумышленников, перехватывающих и понижающих соединения с вашим сайтом?

На прошлой неделе мы рассмотрели заголовок безопасности Referer, а на этой неделе переходим к другому заголовку: Strict-Transport-Security.

Заголовок HTTP Strict-Transport-Security (HSTS) сообщает браузеру пользователя, что доступ к текущему сайту должен осуществляться только по протоколу HTTPS, не позволяя загружать сайт по протоколу HTTP.

Это важный заголовок, на который следует обратить внимание, так как он предназначен для предотвращения атак понижения рейтинга с помощью атаки на соединение по принципу PitM/MitM.

Обычно соединение из браузера выглядит так:

 ---------        HTTPS        --------
| Браузер | <-------> | Сервер |
--------- --------

Однако если злоумышленнику удастся перехватить запрос, он сможет указать браузеру использовать только HTTP, сохраняя при этом HTTPS-соединение с сервером:

 ---------      HTTP      ---------------      HTTPS      --------
| Браузер | <------> | Злоумышленник | <-------> | Сервер |
--------- --------------- --------

Это позволяет злоумышленнику читать и изменять все проходящие запросы. Это означает, что он имеет полный доступ к паролям, деталям платежей, частной или конфиденциальной информации и т. д., а также может вносить любые изменения или выполнять любые команды на взломанном сайте.

Заголовок Strict-Transport-Security предотвращает эту атаку, сообщая браузеру, что ему требуется зашифрованное HTTPS-соединение. Если злоумышленник (или сервер) попытается использовать незашифрованное HTTP-соединение, браузер отклонит его и выдаст предупреждение. Он всегда будет требовать валидный зашифрованный HTTPS-запрос и блокировать или игнорировать любые перенаправления или попытки в противном случае.

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

Например, эта инструкция требует от браузера использования HTTPS в течение 1 года:

Strict-Transport-Security: max-age=31536000

Добавление директивы includeSubDomains предписывает браузеру применять HTST к домену и всем поддоменам в течение 1 года, позволяя при первом запросе к любому месту на домене сохранить требование HSTS.

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

Какова продолжительность max-age

Доступ к большинству сайтов должен осуществляться только через HTTPS, поэтому рекомендуется использовать длительный срок действия — 1-2 года. Это позволит сохранить защиту сайта при нечастых посещениях.

Тем не менее, если у вас старый домен с множеством различных поддоменов, на которых размещены разные приложения, могут быть области, которым нужен только HTTP. Если вы беспокоитесь об этом, то можете начать с короткого max-age, чтобы посмотреть, не сломается ли что-нибудь, и постепенно увеличивать. Например, 5 минут, 1 день, 1 неделя, 1 месяц и т. д. Однако это становится менее распространённым, поскольку HTTPS намного проще, чем раньше, и браузеры активно предупреждают пользователей о HTTP сайтах.

Предварительная загрузка, она же проблема доверия при первом использовании (TOFU)

Возможно, вы уже заметили один из недостатков заголовка HSTS: браузер получает заголовок HSTS при первом запросе.

Это означает, что если злоумышленник уже перехватывает трафик, он может удалить заголовок для понижения уровня HTTP, чтобы браузер не узнал, что у него должно быть зашифрованное соединение.

Это называется проблемой Проблема доверия при первом использовании (TOFU).

HSTS обходит эту проблему с помощью директивы preload и списка Preload List. Preload List — список жёстко закодированных доменов в основных браузерах (Chrome, Firefox, Safari и др.), в котором перечислены все домены, требующие HTTPS. Браузер не будет делать HTTP-запрос к этим доменам, что не позволит злоумышленникам перехватить запрос или попытаться провести атаку на понижение.

Чтобы ваш сайт попал в Preload list, необходимо включить HSTS с max-age не менее 1 года, включить поддомены с помощью includeSubDomains и добавить директиву preload.

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

Как только это будет сделано и заработает, вы можете отправить его в Preload List на <hstspreload.org>, и он будет включён в браузеры в одном из будущих выпусков.

Примечание: удаление из Preload List может занять несколько месяцев или даже лет. Поэтому убедитесь, что вы знаете о последствиях, прежде чем добавлять preload и отправлять свой домен.

Некоторые новые расширения доменов, в частности .dev и .app, уже включены в список Preload List, что помогает обеспечить безопасность любых приложений, использующих эти расширения. Так что если используете один из них, вы уже защищены 🙂.

Дополнительные материалы

Предыдущая Статья

Composer: Менее известные, но полезные команды

Следующая Статья

Управляйте промисами используя Promise.withResolvers()