#1 楼
您可以通过在http
,server
或location
上下文中添加server_tokens off;
来停止输出Nginx和OS的版本。
您要完全删除Server标头,需要使用Headers More模块编译Nginx,因为标头在Nginx源代码中进行了硬编码,并且此模块允许更改任何http标头。
但是,服务器有许多隐藏的方式,它们通过实施意外地执行,可能有助于识别系统。例如它如何响应错误的SSL请求。我没有防止这种情况的实用方法。
我可能会建议一些事情:
更改错误模板
阻止所有端口除了所需的服务
#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
评论
同意例如,查看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