Вальяжной походкой по HTTP-заголовкам

Оглавление

Введение

Данная статья предназначена для знакомства с HTTP-заголовками безопасности и методах их использования. Я коснусь основных моментов, которые способствуют повышению безопасности при администрировании WEB-сервера. Коснусь и постараюсь по возможности описать это доступным языком, без совсем подробного разбора «А что это такое и с чем это есть», поскольку некоторые элементы настолько обширны, что заслуживают отдельной статьи.

Короче говоря, мы будем говорить о том, как защитить веб-морду, если на средства для этой самой защиты денег не дали, но защитить сказали. В первую очередь наши действия при такой ситуации будут подразумевать закрытие потенциально уязвимых мест на самой машине с веб-сервером.
Про харденинг линуха уже раскрывалось ранее — тут. Но сейчас не об этом. Сейчас о том, как защититься с использованием заголовков веб-сервера.

Заголовки HTTP

Заголовки HTTP позволяют серверу и клиенту отправлять доп. информацию вместе с HTTP-запросом или ответом. Обмен данных соответственно происходит по протоколу HTTP, могут содержать описание данных или же информацию, необходимую для взаимодействия между клиентом и сервером.

Сгруппировать заголовки можно по следующим контекстам:

  • Основные заголовки — применяются как к запросам, так и к ответам. Не имеют отношения к данным, которые передаются в теле;

  • Заголовки запроса — содержат в основном информацию о ресурсе, который нужно получить;

  • Заголовки ответа — содержат доп. информацию об ответе. Например, о сервере, предоставившем ответ, или его местонахождении;

  • Заголовки сущности — содержат информацию о теле ресурса. Например, длину его содержимого или MIME тип.

Шифрование трафика

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

Слабое и неэффективное шифрование встречается в следующих случаях:

  • смешанный контент. То есть загрузка одних ресурсов происходит по HTTPS, а других по HTTP;

  • Слабая CORS политика (про неё будет дальше)

  • Кукисы без атрибута Secure, а также стоит определять HttpOnly

  • Использование HTTP вместо HTTPS (хотя мне кажется, сейчас это встречается крайне редко)

HSTS

HTTP Strict-Transport-Security — заголовок ответа, позволяющий сайту уведомить браузер о том, что доступ к ним должен быть осуществлён только посредством HTTPS вместо HTTP

Директивы:

max-age= — время, в секундах, которое браузер должен помнить, что сайт доступен только с помощью HTTPS.

includeSubDomains — является необязательным параметром. Если задан, то правило применяется также ко всем субдоменам сайта.

preload — является необязательным параметром. Осуществляет предзагрузку HSTS «из коробки». А если быть точнее, то из «Списка предварительной загрузки HSTS» Chrome (в других браузерах свои списки, основанные на списке Chrome).

Защита от инъекций

Поскольку веб, как правило, является достаточно открытым, то это периодически приводят к следующим клиентским уязвимостям:

По этому поводу, кстати, сейчас нами готовится подробная статья по разбору Client-Side атак. Чтобы обезопасить себя от эксплуатации перечисленного выше на Вашем хосте рекомендуется использовать:

  • COOP;

  • CORS;

  • X-Frame-Options.

COOP

Поможет защититься от межсайтовых утечек. Заголовок Cross-Origin-Opener-Policy предоставляет сайту возможность изолироваться от перекрестных окон, открываемых с помощью window.open() или ссылки с target="_blank" без rel="noopener". В результате любое межсайтовое обращение к сайту не будет иметь на него ссылки и не сможет с ним взаимодействовать.

Директивы:

unsafe-none — это значение используется по умолчанию. Разрешает добавлять документ в контекстную группу просмотра его открывателя, если сам открыватель не имеет COOP same-origin или same-origin-allow-popups


same-origin-allow-popups — сохраняет ссылки на вновь открытые окна или вкладки, для которых либо не установлен COOP, либо они отказались от изоляции, установив для COOP значение unsafe-none.


same-origin — изолирует контекст просмотра только для сайтов одного происхождения. Перекрестные сайты не загружаются в тот же контекст просмотра.

X-Frame-Options

Заголовок морально устарел, но может использоваться для указания, разрешено ли браузеру отображать данную страницу в ,