使用Nginx隐藏响应头的一部分的方法
首先
在未安装扩展模块的Nginx中,可以隐藏版本信息,但无法隐藏使用Nginx的事实。
在响应头中,除了所使用的服务器(如Apache/Nginx)外,还包含了各种其他信息。其中可能包含一些安全方面的问题信息(例如,默认情况下,Apache会显示OpenSSL的版本)。
尽管Nginx采用默认配置时不会存在重大安全问题,但响应头可能成为攻击者有用的素材,因此最好隐藏不必要的信息。
在这里,我们将解释如何使用Nginx尽可能隐藏响应头信息的方法。根据情况,请在以下说明中添加sudo。
简而言之
$ wget https://nginx.org/download/nginx-X.XX.X.tar.gz
$ tar -xzvf nginx-X.XX.X.tar.gz
$ wget https://github.com/openresty/headers-more-nginx-module/archive/vX.XX.tar.gz
$ tar -xzvf vX.XX.tar.gz
$ cd nginx-X.XX.X
$ ./configure --add-dynamic-module=拡張モジュールをインストールしたディレクトリのパス/headers-more-nginx-module-X.XX --with-http_ssl_module --with-http_v2_module
$ make
$ sudo make install
每个X.XX.X和X.XX版本都包含Nginx和扩展模块的不同版本。关于Nginx版本,请参考官方网站的下载页面;关于扩展模块版本,请参考GitHub页面。
load_module /usr/local/nginx/modules/ngx_http_headers_more_filter_module.so;
http {
server_tokens off;
more_clear_headers Server;
more_clear_headers ETag;
more_clear_headers Transfer-Encoding;
more_clear_headers Date;
more_clear_headers Status;
more_clear_headers X-Request-Id;
more_clear_headers X-Runtime;
more_clear_headers X-UA-Compatible;
more_clear_headers Cache-Control;
more_clear_headers Connection;
more_clear_headers X-Powered-By;
# 以下省略
}
export PATH="/usr/local/nginx/sbin:$PATH"
$ source ~/.bashrc
$ sudo visudo
- Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
+ Defaults secure_path = /sbin:/bin:/usr/local/nginx/sbin:/usr/sbin:/usr/bin
$ sudo nginx # すでに起動している場合は $ sudo nginx -s reload
$ curl -I ドメイン名
HTTP/1.1 200 OK
Content-Type: text/html
... # 指定のレスポンスヘッダが隠蔽されていればOK
从源代码进行构建。
要在Nginx中编辑响应头,需要使用扩展模块作为前提条件。而这个扩展模块需要从源代码构建和添加到Nginx中。
从官方网站下载。
$ wget https://nginx.org/download/nginx-X.XX.X.tar.gz
请在X.XX.X的位置指定Nginx的版本。您可以从官方网站的下载页面确认版本。请选择稳定版或主线版本中的任一版本。
解压缩下载的压缩文件。
$ tar -xzvf nginx-X.XX.X.tar.gz
下一步,下载一个用于编辑响应头的扩展模块。使用的是 headers-more-nginx-module。
$ wget https://github.com/openresty/headers-more-nginx-module/archive/vX.XX.tar.gz
请将最新版本的扩展模块放入名为 vX.XX.tar.gz 的文件中。您可以从GitHub页面上确认最新版本的编号,比如 v0.31.tar.gz。
将下载的压缩文件解压缩。
$ tar -xzvf vX.XX.tar.gz
切换到Nginx所在的文件夹。
$ cd nginx-X.XX.X
当您移动后,请执行以下命令。这适用于不使用SSL/TLS通信(HTTPS通信)的用户。
$ ./configure --add-dynamic-module=拡張モジュールをインストールしたディレクトリのパス/headers-more-nginx-module-X.XX
这是适用于使用SSL/TLS通信的人的选项。
$ ./configure --add-dynamic-module=拡張モジュールをインストールしたディレクトリのパス/headers-more-nginx-module-X.XX --with-http_ssl_module --with-http_v2_module
不使用HTTP/2的人可以移除–with-http_v2_module,但既然已经支持SSL/TLS,还是建议同时支持HTTP/2,这样更划算。
顺便说一句,在上述命令中,Nginx将被安装在/usr/local目录下。如果你不需要更改位置,可以不进行任何修改,但如果希望更改安装位置,请添加–prefix=所需安装路径。需要注意的是,如果将其安装到其他位置,则在后续添加模块时,每次都需要加上–prefix选项。在下面的说明中,我们将假设已将其安装在/usr/local目录下。
执行上述命令后,接着执行以下命令。
$ make
$ sudo make install
这样,Nginx将以带有扩展模块的方式安装在/usr/local目录下。顺便说一下,扩展模块会被放置在/usr/local/nginx/modules目录下。
参考:headers-more-nginx-module – GitHub
隐藏响应头
我们将在Nginx的配置文件中添加隐藏响应头的设置。首先,我们需要加载一个扩展模块,所以我们在指令的外部(即没有被{}包围的部分)添加以下一行。指令的外部可以放在任何位置,但最好将其放在文件的开头附近,以便于理解。
load_module /usr/local/nginx/modules/ngx_http_headers_more_filter_module.so;
如果您安装在/usr/local之外的位置,请相应地更改路径。
我們隨之新增一個功能,可以隱藏回應標頭。回應標頭中包含不同的站點資訊,因此實際上有許多其他設定可用。以下是一個範例,詳細內容請參考存儲庫。同時,請注意有些回應標頭資訊可能會導致應用程式無法正常運作,因此請謹慎隱藏。在Rails中,添加more_clear_headers Content-Type;並不能正常運作,請根據您的環境進行適當的編輯。
在http指令(位于http {}之间的某处)中添加以下内容。
http {
server_tokens off;
more_clear_headers Server;
more_clear_headers ETag;
more_clear_headers Transfer-Encoding;
more_clear_headers Date;
more_clear_headers Status;
more_clear_headers X-Request-Id;
more_clear_headers X-Runtime;
more_clear_headers X-UA-Compatible;
more_clear_headers Cache-Control;
more_clear_headers Connection;
more_clear_headers X-Powered-By;
# more_clear_headers Content-Type;
# 以下省略
}
参考:[Nginx] 删除响应头的方法
使用more_clear_headers可以隐藏每个响应头信息。server_tokens用于显示Nginx的版本。请注意,无需从源代码进行构建(也无需使用扩展模块),即可使用server_tokens。
允许通过路径
如果已经使用yum或apt安装了Nginx,则通常情况下nginx命令将参考该路径。
$ which nginx
/usr/sbin/nginx # パッケージからインストールしたNginxを参照してしまっている
因此,我們將使用此次安裝的nginx命令。如果刪除現有的Nginx,將減少意外操作原始的Nginx的可能性。
# 実行しない!!
$ sudo yum -y remove nginx
# 実行しない!!
$ sudo apt -y purge nginx
请注意,如果删除了,设置文件等也将一同被删除,因此需要事先备份设置文件等。
此外,如果从源代码构建的Nginx存在问题,如果先删除现有的Nginx可能会引起各种麻烦。
此外,即使删除了现有的Nginx,路径仍然无法访问,因此最终还是需要添加路径。
$ which nginx
# パスが見つからない!
因此,只要完成所有工作,删除现有的Nginx就足够了。
无论是否已经安装了Nginx,都需要设置路径。请确保将/usr/local/nginx/sbin路径设置在$PATH之前,以避免引用现有的Nginx。
export PATH="/usr/local/nginx/sbin:$PATH"
如果进行追加操作,将会应用更改后的设置。
$ source ~/.bashrc
如果nginx的路径为/usr/local/nginx/sbin/nginx,那么就可以了。
$ which nginx
/usr/local/nginx/sbin/nginx # OK!
另外,由于nginx命令通常需要root权限来执行,所以在使用sudo时也需要确保路径正确。您可以使用以下命令以root权限来修改设置。
$ sudo visudo
请打开像 Vim 这样的编辑器,并找到以下一行。
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
密码可能因操作系统的不同而有所差异。
对于已经存在的路径,在原来的Nginx路径(/usr/sbin)之前,添加/usr/local/nginx/sbin。如果原来的Nginx不存在(未安装),也可以将其添加到末尾而没有问题。
Defaults secure_path = /sbin:/bin:/usr/local/nginx/sbin:/usr/sbin:/usr/bin
由于这个文件是非常特别的文件,请务必小心不要出现打字错误。尤其是不要忘记冒号!
通过这种方式,即使使用sudo命令,也能使/usr/local/nginx/sbin路径通行。参考:【Linux】解决“sudo: service: command not found”错误的方法。
启动Nginx
那么,现在要开始启动了。这是一份常用命令列表。
$ sudo nginx # 起動
$ sudo nginx -s reload # リロード
$ sudo nginx -s stop # 終了
如果没有显示任何消息,则表示启动成功。
确认
由于仅仅启动服务器无法确定是否隐藏了响应头,所以让我们实际确认一下。在这里,我们介绍两种确认方法。
使用开发者工具
以下以 Google Chrome 为例进行介绍。如果使用其他浏览器,您可以自行进行检索。在 Windows 上打开开发者工具的快捷键是 F12,而在 Mac 上是 command + option + i。您也可以通过右键点击然后选择「检查」来打开开发者工具。
打开开发者工具后,切换到网络选项卡。切换后,需要先重新加载页面一次。重新加载后,左侧应该会显示很多文件名,选择最顶上的文件(如example.com、index.html或URL的路径名)进行点击。

然后将显示如下内容。

这里的Response Headers部分就是指的响应头部信息。这是从服务器发送到客户端的服务器信息。如果这里没有显示出在Nginx中设置的响应头部,那就表示成功了!
使用cURL
使用curl命令可以查看服务器的响应信息。
$ curl -I ドメイン名
如果您设定了当请求的网址是以”http://”开头时,重定向到”https://”的情况,那么您需要明确地输入”https://”。
$ curl -I https://noraworld.jp
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 2915
Connection: keep-alive
Cache-Control:
Strict-Transport-Security: max-age=31536000; includeSubDomains;
只要返回的结果与在浏览器中确认的结果相似即可。如果在这里没有显示设置在Nginx中的响应头,则表示正常!
使用浏览器插件
这并不是用来检查响应头的,所以只是作为参考而已。但由于个人喜欢这个扩展功能,所以作为额外附加内容提供。
使用Wappalyzer,您可以轻松查看该网站使用了哪些服务器、应用程序等信息。
您可以在Google Chrome中通过Chrome Web Store进行安装。
安装后,图标将添加到扩展栏中。访问要查询的网站时,显示的内容将是该网站所使用的服务器或应用程序。
例如, Qiita 上的情况是这样的。

与其确认响应头,更多是一种检查所使用的应用程序的工具,但如果没有Nginx的标记,那么服务器将被隐藏。另外,使用Express等的网站可以通过隐藏X-Powered-By来防止解析(不会显示)。
话虽这么说,但如果在这里显示版本等信息的话,就需要稍微注意一下。
其他
如果从现有的Nginx中复制配置文件,则需要注意路径等。例如,我个人在使用SSL/TLS通信时,没有注意到使用的DH密钥(ssl_dhparam)的路径已更改,导致错误。还有可能会更改其他例如404错误页面的HTML路径,因此在继承现有的Nginx配置时,请注意。
请查阅以下网站
-
- headers-more-nginx-module – GitHub
-
- [Nginx] レスポンスヘッダを限りなく消す
- 【Linux】「sudo: service: command not found」というエラーが出た場合の対処法