默认情况下,不管是 Apache 还是 Nginx,亦或是 Tengine 等 WEB 服务器软件,在访客请求数据时都会返回服务器软件、版本等信息。虽然在一定程度上方便维护,但是安全性上却大打折扣,比如说某个版本的 Nginx 曝出有 BUG,当恶意访客发现服务器的 Nginx 恰好是这个版本,就很有可能针对性发起攻击。这样一来我们就会想办法隐藏服务器回复的信息,降低安全风险。
# curl -I https://www.example.com/ 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
expose_php = Off
重启下再看看请求标头:
# curl -I https://www.example.com/ 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 已经被隐藏。
ServerSignature Off ServerTokens Prod
Nginx
修改 nginx.conf 配置,将 server_tokens 设为 off:
server_tokens off;
重启程序后,我们再来看下请求:
# curl -I https://www.example.com/ HTTP/1.1 200 OK Date: Wed, 22 Aug 2018 11:52:01 GMT Content-Length: 0 Connection: keep-alive Server: Tengine
可以看到版本号已经被隐藏,但是web服务程序名还在。
彻底隐藏或修改:
程序名与错误页面底部提示,就需要通过修改源码实现了,没办法通过开关设置。以 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
我们可以看出,我们将其中的 nginx 改为自己想要设置的名称就可以达到隐藏的目的,比如改为 podipod,则两个文件分别改为:podipod
static char ngx_http_server_string[] = "Server: podipod" CRLF; static char ngx_http_server_full_string[] = "Server: podipod" CRLF;
和
#define NGINX_VER "podipod" NGINX_VERSION
以及
static u_char ngx_http_error_tail[] = "<hr><center>podipod</center>" CRLF "</body>" CRLF "</html>" CRLF
重新编译(只要 make 即可,不要 make install),然后替换编译后的 nginx (如 cp src/objs/nginx sbin/nginx)启动后,我们再来请求看看:
# curl -I https://www.example.com/ HTTP/1.1 200 OK Date: Wed, 22 Aug 2018 11:55:01 GMT Content-Length: 0 Connection: keep-alive Server: podipod
查看错误页:
Server 信息中正确的web服务程序名已经被成我们指定为“podipod”了。
本文由 podipod软库网 作者:DevOps 发表,转载请注明来源!