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).
Синопсис
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: SAMEORIGINReferrer-Policy: strict-origin-when-cross-originX-Content-Type-Options: nosniffCross-Origin-Resource-Policy: same-site
Устаревший заголовок X-XSS-Protection по умолчанию активно удаляется.
Значения этих заголовков (или их включение) можно контролировать с помощью других директив 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 | 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.