Перейти к содержанию

security-headers: NGINX модуль для отправки заголовков безопасности

Установка

Вы можете установить этот модуль в любом дистрибутиве на основе RHEL, включая, но не ограничиваясь:

  • RedHat Enterprise Linux 7, 8, 9 и 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 и Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-security-headers
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-security-headers

Включите модуль, добавив следующее в начало файла /etc/nginx/nginx.conf:

load_module modules/ngx_http_security_headers_module.so;

Этот документ описывает nginx-module-security-headers v0.3.0, выпущенный 15 февраля 2026 года.


Этот модуль NGINX добавляет заголовки безопасности и удаляет небезопасные заголовки, правильным образом (c).

Test Build

Синопсис

http {
    security_headers on;
    ...
}

Запуск curl -IL https://example.com/ приведет к добавленным заголовкам безопасности:

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 21 May 2019 16:15:46 GMT
Content-Type: text/html; charset=UTF-8
Vary: Accept-Encoding
Accept-Ranges: bytes
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Cross-Origin-Resource-Policy: same-site
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

В общем, модуль обеспечивает отправку заголовков безопасности HTTP таким образом, чтобы лучше соответствовать стандартам. Например, заголовок Strict-Transport-Security не должен отправляться для обычных HTTP-запросов. Модуль следует этой рекомендации.

Важное примечание о Strict-Transport-Security

Модуль добавляет несколько заголовков безопасности, включая Strinct-Transport-Security. Обратите внимание, что preload отправляется по умолчанию в значении этого заголовка. Это означает, что Chrome может и будет включать ваши веб-сайты в свой список предварительной загрузки доменов, которые работают только по HTTPS.

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

Если вы абсолютно уверены, что все ваши домены и поддомены, используемые с модулем, будут работать в основном по HTTPs, продолжайте без дополнительных шагов.

Если вы не уверены, нужно ли вам получать доступ к вашим веб-сайтам или любым из их поддоменов через обычный незащищенный HTTP-протокол, убедитесь, что в вашей конфигурации установлено security_headers_hsts_preload off; перед тем, как вы когда-либо запустите NGINX с модулем, чтобы избежать предварительной загрузки вашего домена Chrome.

Ключевые особенности

  • Plug-n-Play: стандартный набор заголовков безопасности можно включить с помощью security_headers on; в вашей конфигурации NGINX
  • Отправляет заголовки безопасности только для соответствующих типов, не отправляя для других, например, X-Frame-Options бесполезен для CSS
  • Хорошо работает с условными GET запросами: заголовки безопасности не включаются там без необходимости
  • Не страдает от недостатков директивы add_header
  • Скрывает X-Powered-By и другие заголовки, которые часто раскрывают информацию о версии программного обеспечения
  • Полностью скрывает заголовок Server, а не только информацию о версии

Директивы конфигурации

security_headers

  • синтаксис: security_headers on | off
  • по умолчанию: off
  • контекст: http, server, location

Включает или отключает применение заголовков безопасности. Стандартный набор включает:

  • X-Frame-Options: SAMEORIGIN
  • Referrer-Policy: strict-origin-when-cross-origin
  • X-Content-Type-Options: nosniff
  • Cross-Origin-Resource-Policy: same-site

Устаревший заголовок X-XSS-Protection по умолчанию активно удаляется.

Значения этих заголовков (или их включение) можно контролировать с помощью других директив security_headers_*, приведенных ниже.

hide_server_tokens

  • синтаксис: hide_server_tokens on | off
  • по умолчанию: off
  • контекст: http, server, location

Включает скрытие заголовков, которые раскрывают информацию о программном обеспечении:

  • Server
  • X-Powered-By
  • X-Page-Speed
  • X-Varnish

Стоит отметить, что некоторые из этих заголовков имеют функциональное применение, например, документация X-Page-Speed упоминает:

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

Поэтому лучше указать hide_server_tokens on; в экземплярах NGINX, обращенных к пользователям, например, в тех, к которым обращаются реальные браузеры, а не в тех, которые используются Varnish или другим программным обеспечением.

В большинстве случаев вам будет достаточно security_headers on; и hide_server_tokens on;, без каких-либо настроек.

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

security_headers_xss

  • синтаксис: security_headers_xss off | on | block | omit | unset
  • по умолчанию: unset
  • контекст: http, server, location

Контролирует заголовок X-XSS-Protection.

  • unset (по умолчанию): Активно удаляет заголовок из ответов, включая любые, установленные вышестоящими серверами. Это рекомендуемая настройка, поскольку заголовок устарел и вводит уязвимости XSS в браузерах, которые его поддерживают.
  • omit: Не добавляет и не удаляет заголовок; позволяет вышестоящим заголовкам проходить без изменений.
  • off: Отправляет X-XSS-Protection: 0, чтобы явно отключить фильтрацию XSS в браузере.
  • on: Отправляет X-XSS-Protection: 1.
  • block: Отправляет X-XSS-Protection: 1; mode=block.

security_headers_frame

  • синтаксис: security_headers_frame sameorigin | deny | omit
  • по умолчанию: sameorigin
  • контекст: http, server, location

Контролирует включение и значение заголовка X-Frame-Options. Специальное значение omit отключит отправку заголовка модулем.

security_headers_referrer_policy

  • синтаксис: security_headers_referrer_policy no-referrer | no-referrer-when-downgrade | same-origin | strict-origin | origin-when-cross-origin | strict-origin-when-cross-origin | unsafe-url | omit
  • по умолчанию: strict-origin-when-cross-origin
  • контекст: http, server, location

Контролирует включение и значение заголовка Referrer-Policy. Специальное значение omit отключит отправку заголовка модулем.

security_headers_corp

  • синтаксис: security_headers_corp same-site | same-origin | cross-origin | omit
  • по умолчанию: same-site
  • контекст: http, server, location

Контролирует включение и значение заголовка Cross-Origin-Resource-Policy. Этот заголовок контролирует, как ваши ресурсы могут быть встроены другими источниками. Специальное значение omit отключит отправку заголовка модулем.

По умолчанию same-site является безопасным выбором, который предотвращает встраивание с других сайтов, позволяя запросы с того же сайта.

security_headers_coop

  • синтаксис: security_headers_coop same-origin | same-origin-allow-popups | unsafe-none | omit
  • по умолчанию: omit
  • контекст: http, server, location

Контролирует включение и значение заголовка Cross-Origin-Opener-Policy. Этот заголовок контролирует отношения между окнами-открывателями между источниками. Специальное значение omit отключит отправку заголовка модулем.

По умолчанию установлено значение omit, так как включение этого заголовка может нарушить модели связи между всплывающими окнами и window.opener. Включайте явно только если понимаете последствия.

security_headers_coep

  • синтаксис: security_headers_coep require-corp | credentialless | unsafe-none | omit
  • по умолчанию: omit
  • контекст: http, server, location

Контролирует включение и значение заголовка Cross-Origin-Embedder-Policy. Этот заголовок контролирует встраивание ресурсов с других источников. Специальное значение omit отключит отправку заголовка модулем.

По умолчанию установлено значение omit, так как включение этого заголовка может нарушить работу сайтов, которые загружают сторонние ресурсы (аналитику, активы CDN, рекламу) без соответствующих заголовков CORS.

Кросс-Origin Изоляция

Чтобы включить кросс-origin изоляцию (требуется для SharedArrayBuffer и таймеров высокой разрешающей способности), настройте все три заголовка кросс-origin:

security_headers on;
security_headers_corp same-origin;
security_headers_coop same-origin;
security_headers_coep require-corp;

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

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-security-headers.