Важные HTTP заголовки для безопасности Nginx

Плоская векторная иллюстрация концепции безопасности сайта

Установка заголовков безопасности позволяет повысить устойчивость веб-сервера к хакерским атакам. Использование некоторых из них будет полезно не только администраторам, но и SEO-оптимизаторам.

Многие хостинг-провайдеры не включают заголовки безопасности в базовую конфигурацию выделенных серверов из-за проблем совместимости с веб-браузерами.

Рекомендованные заголовки ответа из этого руководства можно использовать без опасений за доступность сайта для пользователей и поисковых систем.

Синтаксис проверен на сайтах под управлением WordPress 6.0 и 1С-Битрикс «Управление сайтом» 22.0.400 на веб-сервере Nginx 1.18.0 с обработчиком PHP-FPM.

Чтобы повысить уровень защиты сайта от кликджекинга, внедрения вредоносного кода и XSS-атак, рекомендуется использовать заголовки ответа:

  • X-XSS-Protection;
  • HTTP Strict Transport Security (сокр. HSTS);
  • X-Frame-Options;
  • X-Content-Type-Options;
  • Content Security Policy;
  • Referrer-Policy.

Добавление заголовков ответа в Nginx

Добавить заголовки можно через терминал или панель управления вашего хостинг-провайдера, например ISPmanager.

Запись заголовка через терминал

  • Откройте терминал, перейдите в каталог /etc/nginx/sites-enabled/%domain%/ (по умолч.);
  • Сделайте резервную копию файла конфигурации;
  • Запишите заголовок в %domain%.conf в секции Server с помощью редактора vim или nano;
  • Перезагрузите Nginx.

Запись заголовка через ISPmanager

  • В контекстном меню на левой панели кликните по ссылке Сайты;
  • Отметьте нужный сайт с помощью чекбокса;
  • Нажмите Файлы конфигурации;
  • Добавьте заголовок в редактор и нажмите Сохранить.

Изменение конфигурации возможно только с правами суперпользователя.

X-XSS-Protection

Отчасти устаревший заголовок, который обеспечивает запрет выполнения встроенного JavaScript-кода в браузерах без поддержки политики безопасности контента (Content Security Policy).

Директивы

Значение Описание
0 Отключает фильтрацию XSS.
1 Включает фильтрацию XSS. Если будет замечена попытка межсайтового скриптинга, браузер удалит небезопасное содержимое.
1; mode=block Включает фильтрацию XSS. Вместо того, чтобы очищать содержимое страницы, браузер предотвратит отображение страницы, если заметит атаку.
1; report=<reporting-uri> Включает фильтрацию XSS. При обнаружении атаки межсайтового скриптинга, браузер очистит страницу от небезопасного содержимого и сообщит о нарушении.

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

add_header X-XSS-Protection "1; mode=block";

HTTP Strict Transport Security

Для сайтов работающих по протоколу HTTPS рекомендуется указывать заголовок ответа HSTS для принудительного перенаправления страниц с HTTP на HTTPS.

Директивы

Значение Описание
max-age=<expire-time> Время, в секундах, до окончания срока принудительной работы сервера по протоколу HTTPS.
includeSubDomains Правило max-age должно применяется ко всем поддоменам сайта.
preload Опциональный параметр добавления сайта в список предварительной загрузки.

Перед использованием убедитесь, что все страницы на сайте доступны по HTTPS, иначе они станут недоступны для пользователей:

add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';

Включаем сайт в HSTS Preload List

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

X-Frame-Options

Заголовок ограничивает показ встроенного контента в браузере внутри тегов: <frame>, <iframe>, <embed> и <object>.

Директивы

Значение Описание
DENY Запрещает загрузку контента в frame/iframe.
SAMEORIGIN Разрешает загрузку контента в рамках текущего домена.
ALLOW-FROM uri Разрешает загрузку контента в frame/iframe только для указанного URI.

Правило позволяет избежать кликджекинга, гарантируя, что страницы с вашего сайта не будут встроены на других площадках:

add_header X-Frame-Options SAMEORIGIN always;

X-Content-Type-Options

Отправка заголовка ответа со значением nosniff не позволит браузеру анализировать MIME ответ, отличный от объявленного типа содержимого. Директива nosniff применяется только к типам script и style:

add_header X-Content-Type-Options nosniff;

Content Security Policy

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

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

Часто используемые директивы

Значение Описание
default-src Список источников загрузки любого контента.
script-src Список источников загрузки скриптов.
font-src Список источников загрузки шрифтов.
img-src Список источников загрузки изображений.

Примеры из практики

  1. На сайте используются шрифты Google Fonts, разрешаем загрузку файлов шрифта:
    add_header Content-Security-Policy "default-src 'self'; font-src 'self' data: https://fonts.gstatic.com:*; always";
  2. На сайте под управлением WordPress используется Gravatar, разрешаем загрузку изображений:
    add_header Content-Security-Policy "default-src 'self'; img-src 'self' data: https://secure.gravatar.com:*; always";
  3. На сайте используются inline-сценарии (не рекомендуется):
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; always";

Отладка CSP

Определить блокировку контента на сайте можно с помощью DevTools. При возникновении проблем с политикой безопасности в консоли будут напечатаны ошибки с развернутым описанием.

Отладка Content Security Policy с помощью DevTools

Referrer-Policy

Заголовок позволяет верно отслеживать переходы пользователей между сайтами. Сервисы сбора статистики, например Google Analytics и Яндекс.Метрика, используют реферер для сбора источников перехода.

Директивы

Значение Описание
no-referrer Заголовок запроса будет опущен: отправленные запросы не будут содержать никакой информации.
no-referrer-when-downgrade В заголовке запроса будут содержаться: источник, путь и строка запроса, если уровень безопасности протокола останется прежним или улучшится (HTTP -> HTTP, HTTP -> HTTPS, HTTPS -> HTTPS).
origin В заголовке запроса будет содержаться только источник. Например, документ по адресу https://example.com/page.html отправит реферер https://example.com/.
origin-when-cross-origin В заголовке запроса будут содержаться: источник, путь и строка запроса при выполнении из того же источника на том же уровне протокола (HTTP -> HTTP, HTTPS -> HTTPS). Для запросов между источниками и запросов к менее безопасным адресатам (HTTPS -> HTTP) будет отправлен только источник.
same-origin В заголовке запроса будут содержаться: источник, путь и строка запроса для запросов с одним и тем же источником.
strict-origin В заголовке запроса будет содержаться только источник, если уровень безопасности протокола останется прежним (HTTPS -> HTTPS). При запросах к менее безопасным адресатам (HTTPS -> HTTP) заголовок будет очищен.
strict-origin-when-cross-origin (default) В заголовке запроса будут содержаться: источник, путь и строка запроса при выполнении запроса из того же источника. Для запросов между разными источниками с прежним уровнем безопасности (HTTPS -> HTTPS) будет отправлен только источник. При запросах к менее безопасным адресатам (HTTPS -> HTTP) заголовок будет очищен.
unsafe-url В заголовке запроса будет содержаться: источник, путь и строку запроса при выполнении любого запроса.

Директивы заголовка позволяют гибко настроить объем информации, которую передает сервер в момент перехода пользователей по внешним ссылкам:

add_header Referrer-Policy 'strict-origin-when-cross-origin';
4 комментария
  1. Аватар пользователя: abubakar
    abubakar

    А при чем тут SEO оптимизаторы?

    1. Аватар пользователя: Николай Дубков
      Николай Дубков

      Пользователи Screaming Frog могли заметить, что заголовки безопасности входят в основной чеклист тестирования страниц.

  2. Аватар пользователя: Юрий
    Юрий

    Здравствуйте. Можно расшифровать вот эту Вшу последовательность strict-origin-when-cross-origin…. Из орписания выше не совсем понятно что и как прописывать…

    1. Аватар пользователя: Николай Дубков
      Николай Дубков

      Добрый день, Юрий!

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

      Для настройки достаточно разместить заголовок в конфигурации Nginx внутри секции server:

      server {
          add_header Referrer-Policy "strict-origin-when-cross-origin";
      }