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.1.2, выпущенный 26 апреля 2025 года.
Этот модуль 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 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: SAMEORIGINX-XSS-Protection: 0Referrer-Policy: strict-origin-when-cross-originX-Content-Type-Options: nosniff
Значения этих заголовков (или их включение) можно контролировать с помощью других директив 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 отключит отправку заголовка модулем.
GitHub
Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-security-headers.