温馨提示:
本文所述内容不具普遍性,可能因操作环境差异而与实际有所出入,故请勿照搬照抄,仅供参考。
默认情况下,不管是 Apache 还是 Nginx,亦或是 Tengine 等 WEB 服务器软件,在访客请求数据时都会返回服务器软件、版本等信息。虽然在一定程度上方便维护,但是安全性上却大打折扣,比如说某个版本的 Nginx 曝出有 BUG,当恶意访客发现服务器的 Nginx 恰好是这个版本,就很有可能针对性发起攻击。这样一来我们就会想办法隐藏服务器回复的信息,降低安全风险。
先来看下 Nginx + PHP 默认情况下回复的请求标头:
# curl -I https://vircloud.net/
HTTP/1.1 200 OK
Date: Wed, 22 Aug 2018 11:50:01 GMT
Content-Length: 0
Connection: keep-alive
Server: Tengine/1.1
X-Powered-By: PHP/7.1.1
X-Powered-By
X-Powered-By 字段是由 PHP 程序回复的,因此要修改 php.ini
,修改 expose_php = On 为 Off:
expose_php = Off
重启下再看看请求标头:
# curl -I https://vircloud.net/
HTTP/1.1 200 OK
Date: Wed, 22 Aug 2018 11:52:01 GMT
Content-Length: 0
Connection: keep-alive
Server: Tengine/1.1
可以看到 X-Powered-By 已经隐藏了。
Server
Server 字段是由 Apache/Nginx/Tengine 等程序回复,并且有两个地方可以看到,一个是在请求标头,一个是在错误页面。
请求标头与 PHP 一样可以配置关闭:
Apache
修改 httpd.conf
配置 ,将 ServerSignature、ServerTokens 两个字段修改成与下面一致:
ServerSignature Off
ServerTokens Prod
Nginx
修改 nginx.conf
配置,将 server_tokens 设为 off:
server_tokens off;
重启程序后,我们再来看下请求:
# curl -I https://vircloud.net/
HTTP/1.1 200 OK
Date: Wed, 22 Aug 2018 11:52:01 GMT
Content-Length: 0
Connection: keep-alive
Server: Tengine
可以看到版本号已经隐藏了,但是程序名还在。
彻底隐藏或修改
程序名与错误页面底部提示,就需要通过修改源码实现了,没办法通过开关设置。
以 Nginx 为例,找到 src/http/ngx_http_header_filter_module.c
:
static char ngx_http_server_string[] = "Server: nginx" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
和 src/core/nginx.h
:
#define NGINX_VER "nginx/" NGINX_VERSION
以及 src/http/ngx_http_special_response.c
:
static u_char ngx_http_error_tail[] =
"<hr><center>nginx</center>" CRLF
"</body>" CRLF
"</html>" CRLF
如果启用 HTTP2,包括 src/http/v2/ngx_http_v2_filter_module.c
:
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0,
"http2 output header: \"server: nginx\"");
}
很明显可以看出,我们将其中的 nginx
改为自己想要设置的名称就可以达到隐藏的目的,比如改为 vircloud.net
,则两个文件分别改为:
static char ngx_http_server_string[] = "Server: vircloud.net" CRLF;
static char ngx_http_server_full_string[] = "Server: vircloud.net" CRLF;
和
#define NGINX_VER "vircloud.net/" NGINX_VERSION
以及
static u_char ngx_http_error_tail[] =
"<hr><center>vircloud.net</center>" CRLF
"</body>" CRLF
"</html>" CRLF
包括
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, fc->log, 0,
"http2 output header: \"server: vircloud.net\"");
}
重新编译(只要 make
即可,不要
make install),然后替换编译后的可执行文件 nginx
(如 cp src/objs/nginx sbin/nginx
)启动后,我们再来请求看看:
# curl -I https://exanple.net/
HTTP/1.1 200 OK
Date: Wed, 22 Aug 2018 11:55:01 GMT
Content-Length: 0
Connection: keep-alive
Server: vircloud.net
查看错误页:
Server 中正确的程序名已经被调换成我们指定的混淆字段了。
参考文章:
1、《隐藏 nginx 服务器信息》