server_tokens
server_tokens это настройка nginx, которая, если оставлена включённой, показывает точную версию nginx в каждом ответе, давая атакующим преимущество в поиске уязвимостей, характерных для этой версии.
Почему это простое и низкорисковое исправление
Отключение server_tokens убирает информацию о версии из каждого ответа одной строкой конфигурации без функционального влияния на сайт, что делает это одним из самых ценных и наименее трудозатратных изменений, доступных на сервере nginx.
От чего это не защищает
Скрытие номера версии снижает лёгкую разведку, но не устраняет реальную уязвимость. Сервер, скрывающий версию, но всё ещё работающий на реально устаревшем, уязвимом ПО, лишь незначительно безопаснее того, что её раскрывает.
Эту и другие быстрые настройки защиты см. здесь: руководство по безопасности nginx.
Как убедиться, что изменение действительно сработало
Задать директиву и увидеть, что она работает, это не одно и то же. Проверьте заголовок ответа до и после, а заодно посмотрите страницу ошибки, потому что, согласно документации nginx, значение on выводит версию и в заголовке "Server", и на страницах ошибок:
curl -sI https://example.com/ | grep -i '^server'
curl -s https://example.com/no-such-page | tail -n 3
nginx -T | grep server_tokens
До изменения в первой строке будет nginx/ и номер версии. После неё должно остаться только nginx, а внизу страницы ошибки не должно быть номера. Последняя команда перечисляет все места, где директива задана. Это важно, потому что она допустима в контекстах http, server и location, и более конкретный блок может незаметно включить её обратно. Примените изменение командой nginx -t && systemctl reload nginx.
Документированные значения: on (по умолчанию), off, build (версия плюс имя сборки, начиная с 1.11.10) и произвольная строка. Используйте off. Считайте это быстрой рутиной, а не решением проблемы. Место этой настройки среди остальных показано в руководстве по безопасности nginx.
Когда заголовок Server всё равно выдаёт информацию
При server_tokens off nginx всё равно сообщает, что это nginx. Полностью убрать или переписать заголовок в обычном открытом nginx нельзя: по документации, значение в виде произвольной строки, где пустая строка отключает поле Server, входит в коммерческую подписку. Обычный обходной путь в открытой версии это сторонний модуль headers-more, умеющий очищать встроенные выходные заголовки, но его нужно собирать или подключать как динамический модуль, а это добавляет работы при обновлениях. Для большинства сайтов достаточно скрытого номера версии.
Проверьте и свои приложения. Когда nginx проксирует запросы к бэкенду, модуль proxy по умолчанию не передаёт заголовки Date и Server бэкенда, но остальные, например X-Powered-By, передаются, и они часто называют язык и версию. Убрать такой заголовок можно так:
proxy_hide_header X-Powered-By;
Всё это не остановит целенаправленного атакующего, который проверяет поведение, а не читает баннеры. Решающий шаг это установка обновлений, как показал случай NGINX Rift, где исправлением стало обновление версии. Чтобы сделать это рутиной, прочитайте руководство по управлению обновлениями.
Связанные термины: nginx, Security headers, TLS / SSL.
Часто задаваемые вопросы
Делает ли скрытие версии nginx сервер безопасным?
Нет, само по себе это убирает лишь один элемент разведки; поддержание самого nginx в обновлённом состоянии: вот что реально закрывает известные уязвимости.
Как отключить server_tokens?
Установив "server_tokens off;" в конфигурации nginx, обычно в блоке http, и перезагрузив nginx, чтобы изменение вступило в силу.
Есть ли аналогичная настройка у других веб-серверов?
Да, у большинства веб-серверов есть какая-то форма опции скрытия версии, часто под похожей директивой, хотя точный синтаксис отличается в зависимости от ПО.
Как убедиться, что server_tokens off работает?
Выполните curl -sI для своего сайта и посмотрите строку Server: там должно быть nginx без номера версии. Запросите также несуществующую страницу, потому что при включённой директиве nginx выводит версию и на страницах ошибок.
Можно ли полностью убрать заголовок Server в nginx?
В обычном открытом nginx нет. Документация относит значение в виде произвольной строки, где пустая строка отключает поле Server, к функциям коммерческой подписки, а обычная открытая альтернатива это сторонний модуль headers-more.
Хотите увидеть, в каком состоянии ваш сервер?
Запустите бесплатную read-only проверку сервера или откройте Security Lab и посмотрите цикл обнаружение, сдерживание, восстановление, проверка в действии.
Получить бесплатную проверку сервераОткрыть Security Lab