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

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).

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
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: SAMEORIGIN
  • X-XSS-Protection: 0
  • Referrer-Policy: strict-origin-when-cross-origin
  • X-Content-Type-Options: nosniff

Значения этих заголовков (или их включение) можно контролировать с помощью других директив 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
  • по умолчанию: 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.