Вопрос или проблема
Я не хочу, чтобы кто-либо мог определить, что я использую NGINX или даже Ubuntu через интернет. Существуют инструменты (такие как BuiltWith), которые сканируют серверы, чтобы определить, какие инструменты они используют. Также некоторые инструменты для взлома могут помочь с обнаружением. Как лучше всего скрыть всю эту информацию снаружи?
Вы можете остановить вывод версии Nginx и ОС, добавив
server_tokens off;
в контексте http
, server
или location
.
Если вы хотите полностью убрать заголовок Server, вам нужно скомпилировать Nginx с модулем Headers More, так как этот заголовок закодирован в исходниках Nginx, и этот модуль позволяет изменять любые HTTP-заголовки.
more_clear_headers Server;
Тем не менее, существует множество скрытых способов, которыми серверы могут случайно выполнять обработку через свою реализацию, что может помочь определить систему, например, как они реагируют на неправильный SSL-запрос. Я не вижу практического способа предотвратить это.
Некоторые рекомендации, которые я могу предложить:
- изменить шаблоны ошибок
- закрыть все порты, кроме необходимых служб
Если вы установили nginx с помощью apt-get в Debian или Ubuntu, вам может потребоваться установить пакет nginx-extras, чтобы установить или очистить заголовок “Server”.
После этого вы можете добавить строчки ниже в nginx.conf (обычно /etc/nginx/nginx.conf):
Чтобы полностью очистить заголовок “Server”:
more_clear_headers Server;
Чтобы установить собственную строку в качестве “Server”:
more_set_headers 'Server: some-string-here';
@Martin F. Да, это так. Вам придется скомпилировать его из исходников и изменить то, что нужно, перед компиляцией.
Я предполагаю, что вы скачали последнюю стабильную версию, распаковали её и знаете, где находятся файлы. Если это так, сделайте следующее:
nano src/http/ngx_http_header_filter_module.c
Затем найдите строку 48, если я правильно помню.
static char ngx_http_server_string[] = "Server: nginx" CRLF;
Замените nginx на MyWhateverServerNameIWant, например:
static char ngx_http_server_string[] = "Server: MyWhateverServerNameIWant" CRLF;
Далее
nano src/core/nginx.h
найдите строку
#define NGINX_VER "nginx/" NGINX_VERSION
измените “nginx/” на “MyWhateverServerNameIWant/”, так чтобы она выглядела следующим образом:
#define NGINX_VER "MyWhateverServerNameIWant" NGINX_VERSION
Наконец, если вы хотите, также измените номер версии
найдите строку
#define NGINX_VERSION “1.0.4”
и замените “1.0.4” на любую нужную вам версию. Например, она будет выглядеть так:
#define NGINX_VERSION "5.5.5"
Надеюсь, это поможет. Однако, безопасность сервера выходит за рамки того, чтобы не показывать, что запущено. PHP по своей природе небезопасен, так же как и Linux. Конечно, Linux может быть довольно безопасным, если будут приняты все необходимые меры для достижения достойной безопасности. Что касается PHP, я рекомендую использовать Suoshin, чтобы помочь усилить безопасность вашего кода.
1) Установите пакет nginx-extras
совместно с nginx
:
apt install nginx-extras
2) Откройте nginx.conf
и добавьте следующие строки внутри блока http
:
more_clear_headers Server;
server_tokens off;
3) Перезапустите nginx
После долгого времени, проведенного над тем, как сделать свою версию nginx на ubuntu, я осознал, что вы можете использовать модуль lua для этого.
На ubuntu 14.04, если вы установите пакет nginx-extras
, вы можете убрать заголовок сервера, используя:
header_filter_by_lua 'ngx.header["server"] = nil';
Добавьте это в блок http, и каждый запрос будет лишен заголовка Server
.
Если это не сработает, выполните nginx -V
, чтобы проверить, что у вас компилирован модуль lua в вашей копии nginx. Если нет, скорее всего, есть альтернативный пакет, который вы можете использовать для этого.
Вместо header_filter_by_lua рекомендуется использовать новую директиву header_filter_by_lua_block, которая инлайнит исходный код Lua непосредственно между фигурными скобками ({}
). С этим не нужно экранировать специальные символы.
header_filter_by_lua_block {
ngx.header["server"] = nil
}
https://github.com/openresty/lua-nginx-module#header_filter_by_lua_block
Хочу отметить, что даже если заголовок сервера удален из ответа, имя сервера (например, nginx или openresty) все еще четко видно в HTML-ответе об ошибке, который сервер отправляет в случае ошибки.
Кто угодно может очень легко получить этот ответ, например, отправив заголовок, который слишком длинный. Nginx вернет 400 Bad Request, который не содержит заголовка сервера (если это исправлено), но сам HTML его покажет:
П.С. Я не знаю, как избавиться от этого тоже, действительно HTML сам выдаст это, так что, возможно, должен быть способ вообще не генерировать их?
Прежде всего: Зачем использовать дополнительный модуль как Headers More Nginx? Только для того, чтобы скрыть заголовок сервера. Если несколько строк, простой патч могут достичь того же решения для вас.
Поскольку использование дополнительного модуля может привести к нестабильности (как хорошо он тестировался с вашей средой? С другими вашими модулями и т.д.) или небезопасности (регулярно ли этот модуль обновляется с исправлениями ошибок и/или безопасности?)
Во-вторых. Эта тема описывает как в ответе 279389, как вы можете настроить код Nginx, чтобы изменить заголовок сервера. Проблема в том, что они забыли про HTTP/2. Вкратце, ничего не изменится. Заголовок сервера все равно будет виден.
Меньше – лучше. Ок, признаюсь, я тоже долго искал хорошее решение. Но, наконец, нашел:
Патч для удаления заголовка сервера Nginx
Я наконец-то избавился от надоедливого заголовка сервера Nginx.
Как упоминал rapstacke в комментариях, nginx-extras
устанавливает много лишних вещей (сюрприз). Кроме того, я выяснил, что после установки nginx-extras, nginx не мог перезапуститься после выполнения systemctl reload nginx
несколько раз.
Если вы хотите только удалить заголовок сервера, вам следует установить libnginx-mod-http-headers-more-filter:
sudo apt-get install libnginx-mod-http-headers-more-filter
Это работает у меня без каких-либо проблем на Ubuntu 20.04.
Запустите этуbash-функцию в папке исходного кода nginx. В nginx-$version, не в src/.
На основе этого ответа.
hidengxver () {
read -r -p "Ваша собственная http_server_string для безопасности: " http_server_string
first_string="static char ngx_http_server_string\[\] = \"Server: nginx\" CRLF;"
second_string="static char ngx_http_server_string\[\] = \"$http_server_string\" CRLF;"
sed -ire "s/$first_string/$second_string/g" src/http/ngx_http_header_filter_module.c
read -r -p "Ваша собственная константа NGINX_VER: " nginx_ver
third_string="\#define NGINX\_VER \"nginx\/\" NGINX\_VERSION"
forth_string="\#define NGINX\_VER \"$nginx_ver\" NGINX\_VERSION"
sed -ire "s/$third_string/$forth_string/g" src/core/nginx.h
real_nginx_version=$( grep '#define NGINX_VERSION' src/core/nginx.h | gawk -F'"' '{print $2}' )
read -r -p "Ваша собственная константа NGINX_VERSION: " new_nginx_version
fifth_string="\#define NGINX\_VERSION \"$real_nginx_version\""
sixth_string="\#define NGINX\_VERSION \"$new_nginx_version\""
sed -ire "s/$fifth_string/$sixth_string/g" src/core/nginx.h
}
Используйте нижеприведенные методы в исходниках; чтобы убрать строку nginx из сообщений об ошибках
sed -i 's@"nginx/"@"-/"@g' src/core/nginx.h
sed -i 's@r->headers_out.server == NULL@0@g' src/http/ngx_http_header_filter_module.c
sed -i 's@r->headers_out.server == NULL@0@g' src/http/v2/ngx_http_v2_filter_module.c
sed -i 's@<hr><center>nginx</center>@@g' src/http/ngx_http_special_response.c
затем перекомпилируйте
Раскрытие сервера Nginx происходит через различные коды состояния, и поэтому я использую комбинацию всех следующих:
-
server_tokens off;
-
more_clear_headers Server;
-
error_page 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 421 422 423 424 425 426 428 429 431 451 500 501 502 503 504 505 506 507 508 510 511 599 =444 /;
-
Используйте hexedit и вручную замените строку “nginx” на что-то вроде “hiden”.
Не забудьте сделать резервную копию исполняемого файла nginx перед последним шагом. Вам может понадобиться остановить сервер перед редактированием и запустить его после.
Пакет nginx-extra теперь устарел.
Следовательно, следующее не сработало для меня, так как я пытался установить различные пакеты:
more_set_headers 'Server: My Very Own Server';
Вы можете просто сделать следующее, и никакая информация о сервере или версии не будет отправлена обратно:
server_tokens '';
Если вы просто хотите удалить номер версии, это сработает:
server_tokens off;
Ответ или решение
Скрыть всю информацию о сервере и операционной системе в Интернете, безусловно, сложная задача, но есть несколько подходов, которые можно использовать для минимизации этой информации:
1. Настройка Nginx
-
Отключение заголовка сервера: В конфигурационном файле Nginx (
nginx.conf
) можно добавить следующую директиву:server_tokens off;
Это отключит отображение версии Nginx в заголовках ответа.
-
Удаление заголовка "Server": Для этого вам, возможно, понадобится установить модуль
headers-more-nginx-module
. После его установки добавьте следующую строку в блокhttp
вашего конфигурационного файла:more_clear_headers Server;
Это полностью удалит заголовок "Server" из ответов.
-
Настройка кастомного заголовка: Если вы хотите, чтобы заголовок "Server" отображал пользовательское значение, вы можете использовать так:
more_set_headers 'Server: MyVeryOwnServer';
2. Защита от утечек информации
-
Изменение страниц ошибок: Страницы ошибок по умолчанию могут раскрывать информацию о сервере. Настройте пользовательские страницы ошибок, чтобы скрыть эту информацию.
-
Блокировка ненужных портов: Убедитесь, что вы открыли только необходимые для работы порты. Это не только улучшает безопасность, но и помогает скрыть данные о сервере.
3. Секретность версии Nginx
Если вы хотите изменить строку, указывающую на сервер в самом исполняемом файле, вам следует:
- Компилировать Nginx из исходных кодов. Для этого измените строки в файлах
ngx_http_header_filter_module.c
иnginx.h
, чтобы заменить упоминания "nginx" на что-то другое.
Например:static char ngx_http_server_string[] = "Server: MyCustomServer" CRLF;
4. Использование модуля Lua
Если у вас установлен модуль Lua, вы можете использовать следующий код в блоке http
:
header_filter_by_lua_block {
ngx.header["server"] = nil
}
Это также удалит заголовок "Server".
5. Общая безопасность
Помните, что сокрытие информации о сервере — это всего лишь часть стратегии безопасности. Рекомендуется также:
- Периодически обновлять программное обеспечение и применять патчи безопасности.
- Использовать файрволы и другие средства защиты от атак.
- Произвести аудит вашего приложения на предмет уязвимостей.
С помощью этих шагов вы сможете значительно повысить уровень анонимности вашего сервера в сети, но учтите, что абсолютной защиты не существует, и всегда могут быть способы определения используемых систем.