Могу ли я скрыть всю информацию о сервере / ОС?

81

Я не хочу, чтобы кто-нибудь смог обнаружить, что я использую NGINX или даже Ubuntu из Интернета. Существуют инструменты (например, BuiltWith), которые сканируют серверы, чтобы определить, какие инструменты они используют. Кроме того, некоторые инструменты для взлома могут помочь с обнаружением. Что лучше / ближе всего к тому, что я могу скрыть всю эту информацию извне?

orokusaki
источник

Ответы:

116

Вы можете остановить его вывод версии Nginx и ОС, добавив

server_tokens off;

к http, serverили locationконтекста.

Или, если вы хотите полностью удалить заголовок сервера, вам нужно скомпилировать Nginx с модулем Headers More, так как заголовок жестко запрограммирован в источнике Nginx, и этот модуль позволяет изменять любые заголовки http.

 more_clear_headers Server;

Тем не менее, существует множество скрытых способов, которыми серверы работают случайно при их реализации, которые могут помочь идентифицировать систему. Например, как он реагирует на неверный запрос SSL. Я не вижу практического способа предотвратить это.

Некоторые из вещей, которые я мог бы предложить:

  • изменить шаблоны ошибок
  • заблокировать все порты, кроме необходимых служб
Энди
источник
15
Согласовано. Например, посмотрите на обнаружение ОС nmap - он смотрит на ответы целевых хостов на запросы IP / TCP и может таким образом определить ОС. Это действительно не стоит прилагать усилия в этом.
EEAA
6
+1 по совету Эрика. Лучше защитить свой сервер как можно лучше, чем полагаться на безопасность через неизвестность.
Энди Смит
4
Серверные токены отключают только номер версии. Nginx не позволяет полностью удалить заголовок.
Мартин Фьордвальд
45
игнорирование важных факторов безопасности, таких как «отсутствие номеров версий» и, возможно, даже «отсутствие имени поставщика сервера», является просто ... ошибкой новичка. Конечно, безопасность через неизвестность ничего не делает для вашей безопасности сама по себе, но она, безусловно, защитит, по крайней мере, от самых обыденных, упрощенных векторов атаки - безопасность через неизвестность - необходимый шаг, он может быть первым и никогда не должен быть последним. измерение - полное его пропускание - очень серьезная ошибка, даже самые надежные веб-серверы могут быть взломаны, если известен вектор атаки для конкретной версии.
specializt
1
Существует еще раздражающее имя сервера «Nginx», возвращаемое в теле ответа 301 о перенаправлении и не нашедшего способа избежать того, что до сих пор правило использования настраиваемого HTML-шаблона не работает для 301.
Гийом Перро,
32

Если вы установили nginx с помощью apt-get в Debian или Ubuntu, вам может потребоваться установить пакет nginx-extras, чтобы установить или очистить заголовок «Server»

Как только это будет сделано, вы можете добавить строки ниже в nginx.conf (обычно /etc/nginx/nginx.conf):

Чтобы полностью очистить заголовок «Сервер»:

more_clear_headers Server; 

Чтобы установить пользовательскую строку как «Сервер»

more_set_headers 'Server: some-string-here';
packetlord
источник
1
Подтверждено, что more_clear_headers Server;работает и в Debian Jessie 8.5 версия nginx: nginx / 1.6.2
Брэндон
Этот ответ нуждается в большем количестве голосов. Хотя, возможно, следует отметить, что директива должна быть помещена в блок http файла conf (я думаю)
Энди
2
Это работает http, server, location, и location ifконтексты. Источник: документация ngx_headers_more
Кельвин
1
Для пользователей Ubuntu: sudo apt-get install nginx-extras а затем установите заголовки
jchnxu
Для меня это не удалось unknown directive "more_set_headers". Решил это путем явного включения модуля в /etc/nginx/nginx.conf. Просто добавьте load_module modules/ngx_http_headers_more_filter_module.so;в начале файла конфигурации.
Рэпстак
18

@ Мартин Ф. Да, это так. Вам нужно будет скомпилировать его из исходного кода и изменить то, что необходимо, перед компиляцией исходного кода.

Я предполагаю, что вы скачали последнюю стабильную версию, распаковали ее и знаете, где находятся файлы. Если это так, сделайте следующее:

nano src/http/ngx_http_header_filter_module.c

Затем найдите строку 48, если я правильно помню.

static char ngx_http_server_string[] = "Server: nginx" CRLF;

Замените nginx на MyWhwhatServerNameIWant, например

static char ngx_http_server_string[] = "Server: MyWhateverServerNameIWant" CRLF; 

затем

nano src/core/nginx.h 

искать линию

#define NGINX_VER          "nginx/" NGINX_VERSION

измените «nginx /» на «MyWhwhatServerNameIWant /», чтобы он читал

#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, чтобы повысить безопасность вашего кода.

Мартин М
источник
4
+1, спасибо. Я покидаю @ Andy's как официальное лицо, просто из-за более простого подхода, но это отличная информация.
orokusaki
Я думаю, что вы имеете в виду Suhosin.
Жук
7

После долгих размышлений о том, как сделать пользовательский вариант nginx в Ubuntu, я понял, что для этого можно использовать модуль lua.

В Ubuntu 14.04, если вы устанавливаете nginx-extrasпакет, вы можете удалить заголовок сервера, используя:

header_filter_by_lua 'ngx.header["server"] = nil';

Добавьте это в блок http, и у каждого запроса будет отсутствовать Serverзаголовок.

Если это не работает, запустите, nginx -Vчтобы убедиться, что у вас есть модуль lua, скомпилированный в вашу копию nginx. Если нет, скорее всего, есть альтернативный пакет, который вы можете использовать для его получения.

matschaffer
источник
Подтверждено, что это работает на Debian Jessie 8.5 nginx версия: nginx / 1.6.2
Брэндон
1
При тестировании Debian это, похоже, не работает, НО установка nginx-extraсделанной more_set_headers "Server: whatever";работы, так что +1: D
Shautieh
Для этого вам нужно только включить LUA. Tnx
Глава 18
6

Вместо 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

Юрген Краус
источник
1

Прежде всего: зачем использовать дополнительный модуль в качестве заголовков More Nginx? Только чтобы скрыть заголовок сервера. Если несколько строк, простой патч может достичь того же решения для вас.

Использование дополнительного модуля может привести к нестабильности (насколько хорошо он был протестирован с вашей средой? С другими вашими модулями и т. Д.) Или ненадежности (регулярно ли этот модуль обновляется с исправлениями ошибок и / или безопасности?)

Во-вторых. В ответе 279389 эта ветка описывает, как вы можете настроить код Nginx для изменения заголовка сервера. Проблема в том, что они забыли HTTP / 2. Короче, ничего не изменится. Заголовок сервера все еще будет виден.

Чем меньше, тем лучше. Хорошо, я признаю, я также долго искал хорошее решение. Но наконец нашел:

Патч удаления заголовка сервера Nginx

Я наконец-то избавился от этого надоедливого заголовка сервера Nginx.

Бертус Ду Янг
источник
0

Запустите эту функцию 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
}
stranger777
источник
-1

Обратитесь к этой сути . Конечно, поможет вам.

Амиш Балоч
источник
9
Добро пожаловать в сбой сервера! Хотя это может теоретически ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки.
Джеральд Шнайдер