我可以隐藏所有服务器/操作系统信息吗?


78

我不希望任何人能够从互联网上检测到我正在使用NGINX甚至是Ubuntu。有一些工具(例如BuiltWith)可以扫描服务器以检测它们正在使用的工具。另外,某些破解工具可能会有助于检测。我能从外面隐藏所有这些信息的最好/最接近的是什么?

Answers:


114

您可以通过添加以下命令停止输出Nginx和OS的版本

server_tokens off;

httpserverlocation上下文。

或者,如果您想完全删除Server标头,则需要使用Headers More模块编译Nginx,因为标头在Nginx源代码中是硬编码的,并且该模块允许更改任何http标头。

 more_clear_headers Server;

但是,服务器有许多隐藏的方式,通过它们的实现来意外执行,这可能有助于识别系统。例如,它如何响应错误的SSL请求。我没有防止这种情况的实用方法。

我可能会建议一些事情:

  • 更改错误模板
  • 封锁除所需服务以外的所有端口

14
同意 例如,查看nmap的OS检测-查看目标主机对IP / TCP请求的响应,并能够以这种方式确定OS。确实不值得为此付出努力。
EEAA 2010年

6
根据ErikA的建议+1。更好地最大程度地保护服务器,而不要过分依赖安全性。
安迪·史密斯

4
服务器令牌仅关闭版本号。Nginx不允许完全删除标头。
Martin Fjordvald 2010年

44
忽略重要的安全因素,例如“没有版本号”,甚至可能完全没有“没有服务器供应商名称”,只是……初学者的错误。当然,默默无闻的安全性本身并不会为您的安全性做任何事情,可以肯定,地狱至少会防范最平凡,最简单的攻击媒介-默默无闻的安全性是必不可少的步骤,它可能是第一个步骤,永远都不应该是最后一个安全性完全跳过它是一个非常严重的错误,如果已知特定于版本的攻击媒介,那么即使是最安全的Web服务器也可以被破解。
specializt

1
后面还有一个恼人的服务器名称“Nginx的”在301重定向响应的身体回来,发现没有办法避免的,到目前为止,该规则使用自定义HTML模板301不起作用
纪尧姆·帕罗特

30

如果您已在Debian或Ubuntu中使用apt-get安装了nginx,则可能需要安装软件包nginx-extras来设置或清除“服务器”标头

完成此操作后,您可以在nginx.conf(通常是/etc/nginx/nginx.conf)中添加以下行:

要完全清除“服务器”标头:

more_clear_headers Server; 

要将自定义字符串设置为“服务器”

more_set_headers 'Server: some-string-here';

1
已确认more_clear_headers Server;在Debian Jessie 8.5 nginx版本上的工作原理:nginx / 1.6.2
Brandon

这个答案需要更多的投票。尽管也许应该指出,该指令需要放置在conf文件的http块内(我认为)
Andy

2
这部作品在httpserverlocation,和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;在配置文件的开头添加即可 。
rapstacke

17

@Martin F.是的。您将必须从源代码进行编译,并在编译源代码之前更改所需的内容。

我假设您下载了最后一个稳定的版本,并将其解压缩,然后知道文件在哪里。如果是这种情况,请执行以下操作:

nano src/http/ngx_http_header_filter_module.c

如果我没记错的话,然后寻找第48行。

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

用MyWhateverServerNameIWant替换nginx例如

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来增强代码的安全性。


4
+1,谢谢。由于更简单的方法,我将离开@ Andy's作为官方官员,但这是极好的信息。
orokusaki 2011年

我想你是说Suhosin。
甲虫

7

在花了很多时间研究如何在ubuntu上自定义nginx风格后,我意识到您可以为此使用lua模块。

在ubuntu 14.04上,如果安装nginx-extras软件包,则可以使用以下方法删除服务器头:

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

将其扔到http块中,每个请求都将缺少Server标题。

如果不起作用nginx -V,请运行以验证是否已将lua模块编译到nginx副本中。如果没有,您可能会使用替代软件包来获取它。


确认此功能适用于Debian Jessie 8.5 nginx版本:nginx / 1.6.2
Brandon

1
在debian测试中,这似乎不起作用,但安装nginx-extra成功了more_set_headers "Server: whatever";,所以+1:D
Shautieh

您只需要启用LUA即可工作。TNX
glavić


1

首先,为什么要使用额外的模块作为Headers More Nginx?仅隐藏服务器标头。如果几行,简单的补丁程序可以为您达到相同的解决方案。

由于使用额外的模块可能会导致不稳定(已在您的环境中对其进行了良好的测试?与其他模块等一起进行了测试)或不安全(此模块是否定期通过错误和/或与安全相关的修复程序进行更新?)

其次。此线程作为答复279389描述了如何调整Nginx代码以更改服务器头。问题是他们忘记了HTTP / 2。简而言之,什么都不会改变。服务器标头仍将可见。

少即是多。好的,我承认,我也一直在寻找一种好的解决方案。但最后发现:

Nginx服务器头删除补丁

我终于从那个烦人的Nginx服务器头中赎回了。


0

在Nginx源代码文件夹中运行此bash函数。在nginx- $ version中,不在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
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.