使用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的路径名)进行点击。

network_information.png

然后将显示如下内容。

response_headers.png

这里的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 上的情况是这样的。

qiita_wappalyzer.png

与其确认响应头,更多是一种检查所使用的应用程序的工具,但如果没有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」というエラーが出た場合の対処法
广告
将在 10 秒后关闭
bannerAds