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

#1 楼

您可以通过在httpserverlocation上下文中添加

server_tokens off;


来停止输出Nginx和OS的版本。

您要完全删除Server标头,需要使用Headers More模块编译Nginx,因为标头在Nginx源代码中进行了硬编码,并且此模块允许更改任何http标头。

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

我可能会建议一些事情:


更改错误模板
阻止所有端口除了所需的服务


评论


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

–EEAA
2010-12-19 21:52

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

–安迪·史密斯(Andy Smith)
2010-12-19 21:54

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

–马丁·峡湾(Martin Fjordvald)
2010-12-20 18:46

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

–专业
2015年4月27日14:23



301重定向响应的正文中仍然返回一个令人烦恼的服务器名称“ Nginx”,并且到目前为止,仍然没有办法避免这种情况,使用自定义HTML模板的规则不适用于301。

– Guillaume Perrot
16-2-17在3:30



#2 楼

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

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

要完全清除“服务器”标头:
>将自定义字符串设置为“服务器”

more_clear_headers Server; 


评论


已确认more_clear_headers服务器;在Debian Jessie 8.5 nginx版本上也能正常工作:nginx / 1.6.2

–布兰登
16年7月21日在19:54

这适用于http,服务器,位置和上下文环境。来源:ngx_headers_more文档

–开尔文
16年11月18日在14:09

对于ubuntu用户:sudo apt-get install nginx-extras,然后设置标题

– jchnxu
19年7月20日在6:09



对我来说,这失败,并带有未知的指令“ more_set_headers”。通过在/etc/nginx/nginx.conf中显式启用模块来解决该问题。只需添加load_module modules / ngx_http_headers_more_filter_module.so;在配置文件的开头。

–rapstacke
19-09-6在9:46

nginx-extras安装了许多额外的功能。如果只需要覆盖Server标头,则也可以只安装sudo apt-get install libnginx-mod-http-headers-more-filter

–rapstacke
19年9月6日在10:21

#3 楼

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

评论


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

–orokusaki
2011年6月12日在2:47

我想你是说Suhosin。

–甲虫
16-2-29在10:33

#4 楼

经过大量时间研究如何在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

–布兰登
16年7月21日在19:52

在debian测试中,这似乎不起作用,但安装nginx-extra会使more_set_headers“ Server:what”;工作,所以+1:D

– Shautieh
16-09-15在7:07



您只需要启用LUA即可运行。特纳克斯

–glavić
18年9月2日在13:50

#5 楼

建议使用新的指令header_filter_by_lua_block代替header_filter_by_lua,该指令直接在花括号({})之间内联Lua源。这样就不需要转义特殊字符。

header_filter_by_lua_block { ngx.header["server"] = nil }

https://github.com/openresty/lua-nginx-module#header_filter_by_lua_block

#6 楼

只是要指出,即使服务器头已从响应中删除,服务器的名称(例如nginx或openresty)在出现错误的情况下服务器发送的html错误响应中仍然清晰可见。

任何人都可以通过例如发送的标题太长。 Nginx将返回一个400 Bad Request,该请求不包含服务器标头(如果已固定),但是html本身将显示它:



PS。我也不知道该如何摆脱这个问题,实际上html本身会放弃它,所以应该有一种可能根本不产生这些问题的方法吗?

评论


将error_page指令用于要自定义的所有错误。例如,error_page 400 / err / 400将替代/ err / 400的默认响应。

–伊凡(IvanVučica)
20 Nov 16 '18:44

#7 楼

1)在nginx-extras旁边安装nginx软件包:

 apt install nginx-extras
 


2)打开nginx.conf并添加以下行内部http块:

more_clear_headers Server;
server_tokens off;




3)重新启动nginx

#8 楼

最重要的是:
为什么要使用额外的模块作为Headers More Nginx?仅隐藏服务器头。如果只有几行,简单的修补程序就可以为您提供相同的解决方案。

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

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

越少越好。很长一段时间。
但是终于找到了:

Nginx服务器头删除补丁

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

#9 楼

在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 }' )
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的详细步骤

–克鲁纳尔
20 Mar 15 '20 at 19:55

#10 楼

在源代码中使用以下方法;从错误消息中消除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


然后重新编译

#11 楼

现在已弃用Nginx-extra软件包。

当我尝试安装各种软件包时,以下内容对我不起作用:

more_set_headers 'Server: My Very Own Server';


您可以只需执行以下操作,就不会发回任何服务器或版本信息

server_tokens '';


如果您只想删除版本号,则可以:

server_tokens off;


评论


自1.9.13起,该版本似乎仅在商业版本中可用-nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens

–Shagglez
20-11-18在12:27