Я не хочу, чтобы кто-нибудь мог обнаружить, что я использую NGINX или даже Ubuntu из Интернета. Существуют инструменты (например, BuiltWith), которые сканируют серверы, чтобы определить, какие инструменты они используют. Кроме того, некоторые инструменты для взлома могут помочь в обнаружении. Что лучше / ближе всего к этому, чтобы скрыть всю эту информацию извне?
Вы можете остановить вывод версии Nginx и ОС, добавив
server_tokens off;
к http
, server
, или location
контекст.
Или, если вы хотите полностью удалить заголовок сервера, вам нужно скомпилировать Nginx с модулем Headers More, поскольку заголовок жестко закодирован в исходном коде Nginx, и этот модуль позволяет изменять любые заголовки http.
more_clear_headers Server;
Однако существует множество скрытых способов, которыми серверы работают случайно, благодаря их реализации, которые могут помочь идентифицировать систему. например Как он отвечает на неверный запрос SSL. Я не вижу практического способа предотвратить это.
Что я могу предложить:
Если вы установили nginx с помощью apt-get в Debian или Ubuntu, вам может потребоваться установить пакет nginx-extras, чтобы установить или очистить заголовок «Сервер».
Как только это будет сделано, вы можете добавить следующие строки в nginx.conf (обычно /etc/nginx/nginx.conf):
Чтобы полностью очистить заголовок «Сервер»:
more_clear_headers Server;
Чтобы установить настраиваемую строку как «Сервер»
more_set_headers 'Server: some-string-here';
@ Мартин Ф. Да, это так. Вам нужно будет скомпилировать его из исходного кода и изменить то, что необходимо, перед компиляцией исходного кода.
Я предполагаю, что вы загрузили последнюю стабильную версию, которую распаковали, и знаете, где находятся файлы. В таком случае сделайте следующее:
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, я бы рекомендовал использовать Суошин чтобы повысить безопасность вашего кода.
После долгих размышлений о том, как создать собственный вариант 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 покажет его:
P.S. Я не знаю, как избавиться от этого, правда, сам html выдаст его, так что должен быть способ, возможно, не генерировать их вообще?
1) Установить nginx-extras
пакет рядом с nginx
:
apt install nginx-extras
2) Открыть nginx.conf
и добавьте следующие строки внутри http
блок:
more_clear_headers Server;
server_tokens off;
3) Перезагрузка nginx
Прежде всего: зачем использовать дополнительный модуль в качестве заголовков? Подробнее Nginx? Только чтобы скрыть заголовок сервера. Если несколько строк, простой патч может дать такое же решение для вас.
Поскольку использование дополнительного модуля может привести к нестабильности (насколько хорошо он был протестирован с вашей средой? С другими вашими модулями и т. Д.) Или небезопасностью (регулярно ли этот модуль обновляется исправлениями ошибок и / или безопасности?)
Во-вторых. В этой ветке в качестве ответа 279389 описывается, как можно настроить код Nginx для изменения заголовка сервера. Проблема в том, что они забыли HTTP / 2. Короче ничего не изменится. Заголовок сервера по-прежнему будет виден.
Лучше меньше, да лучше. Хорошо, признаю, я тоже очень давно искал хорошее решение. Но наконец нашел:
Патч для удаления заголовка сервера Nginx
Я наконец избавился от этого надоедливого заголовка сервера Nginx.
Запустите эту функцию bash в папке с исходным кодом nginx. В версии nginx- $, а не в src /.
Исходя из на этот ответ.
hidengxver () {
read -r -p "Your own http_server_string for safety: " 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 "Your own NGINX_VER const: " 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 "Your own NGINX_VERSION const: " 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-extra устарел.
Поэтому следующее не работают для меня, поскольку я пытался установить различные пакеты:
more_set_headers 'Server: My Very Own Server';
Вы можете просто сделать следующее, и информация о сервере или версии не будет отправлена обратно
server_tokens '';
Если вы просто хотите удалить номер версии, это работает:
server_tokens off;