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.2.0, выпущенный 3 февраля 2026 года.
Этот модуль NGINX добавляет заголовки безопасности и удаляет небезопасные заголовки, правильным образом (c).
Синопсис
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 X-XSS-Protection: 0 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.
Ключевые особенности
- Простота использования: стандартный набор заголовков безопасности можно включить с помощью
security_headers on;в вашей конфигурации NGINX - Отправляет заголовки безопасности только для HTML, не отправляя их для других типов, например,
X-Frame-Optionsбесполезен для CSS - Хорошо работает с условными
GETзапросами: заголовки безопасности не включаются там без необходимости - Не страдает от недостатков директивы
add_header - Скрывает
X-Powered-Byи другие заголовки, которые часто раскрывают информацию о версии программного обеспечения - Полностью скрывает заголовок
Server, а не только информацию о версии
Директивы конфигурации
security_headers
- синтаксис:
security_headers on | off - по умолчанию:
off - контекст:
http,server,location
Включает или отключает применение заголовков безопасности. Стандартный набор включает:
X-Frame-Options: SAMEORIGINX-XSS-Protection: 0Referrer-Policy: strict-origin-when-cross-originX-Content-Type-Options: nosniffCross-Origin-Resource-Policy: same-site
Значения этих заголовков (или их включение) могут контролироваться другими директивами security_headers_* ниже.
hide_server_tokens
- синтаксис:
hide_server_tokens on | off - по умолчанию:
off - контекст:
http,server,location
Включает скрытие заголовков, которые раскрывают информацию о программном обеспечении:
ServerX-Powered-ByX-Page-SpeedX-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 - по умолчанию:
off - контекст:
http,server,location
Контролирует заголовок X-XSS-Protection. Специальное значение omit отключит отправку заголовка модулем. Значение off отключает защиту от XSS: X-XSS-Protection: 0. Это значение по умолчанию, потому что
современные браузеры не поддерживают его, и там, где он поддерживается, он вводит уязвимости.
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 | 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.
Кросс-доменные изоляции
Чтобы включить кросс-доменные изоляции (требуется для SharedArrayBuffer и таймеров с высокой разрешающей способностью), настройте все три кросс-доменных заголовка:
security_headers on;
security_headers_corp same-origin;
security_headers_coop same-origin;
security_headers_coep require-corp;
Предупреждение: Эта конфигурация нарушит загрузку любых кросс-доменных ресурсов, которые явно не разрешают это через CORS.
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-security-headers.