nginxプロキシでアップストリームのヘッダを消す

nginxプロキシでアップストリームサーバが返す一部のレスポンスヘッダを消したい。

アップストリーム側で出力しているヘッダがあり、nginxプロキシ側でも同様にadd_headerでヘッダを出力している場合にヘッダが重複してしまう。例えばmattermostのdocker版では、一部のページでX-Frame-Optionsが重複して出力されてしまう?ようだが、どのページかは言及されていない。ただパッと見た限りではloginページくらいか?ブラウザはエラーにはならないが、できれば取り除きたい。

https://github.com/mattermost/mattermost-docker/issues/468

$ curl -s -D- -o /dev/null -L http://localhost:8090/
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 05 Dec 2020 13:43:39 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 3091
Connection: keep-alive
Accept-Ranges: bytes
Cache-Control: no-cache, max-age=31556926, public
Content-Security-Policy: frame-ancestors 'self'; script-src 'self' cdn.rudderlabs.com
Last-Modified: Sat, 05 Dec 2020 12:22:43 GMT
X-Frame-Options: SAMEORIGIN
X-Ratelimit-Limit: 101
X-Ratelimit-Remaining: 100
X-Ratelimit-Reset: 1
X-Request-Id: 9aj5r69r8bbn5mjotwgf7xkg9w
X-Version-Id: 5.29.0.5.29.1.af2700671330c5f425f496fdaf9d92ab.false
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block

ソースを調査するかぎりでは、ソース内に直書きされているので管理画面で削除するといったことはできなさそうだった。

https://github.com/mattermost/mattermost-server/blob/3099128bbd4faa1cdcf716182e2cc43c294badfd/web/handlers.go#L171

mattermostのdocker版は、nginxコンテナでsecurity.confというファイルが読み込まれるようになっている。その中で以下の3つのヘッダがレスポンスヘッダに追加される。X-Frame-Options SAMEORIGIN;が追加されていることが分かる。

server_tokens off;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

proxy_hide_header

このディレクティブは、ngx_http_proxy_moduleというモジュールで使えるものだが、デフォルトで組み込まれているモジュールのため使用できる。以下のように指定する。

proxy_hide_header X-Frame-Options;

以下をconfに設定して反映してみよう。

nginxコンテナのconfをコピーしてきて、

docker cp mattermost-docker_web_1:/etc/nginx/conf.d/mattermost.conf .

以下のように編集する。オリジナルのconfとの差は以下のとおり。

$ diff -u mattermost.conf.org mattermost.conf
--- mattermost.conf.org 2020-12-05 21:31:56.000000000 +0900
+++ mattermost.conf 2020-12-05 22:05:41.000000000 +0900
@@ -7,6 +7,8 @@
     listen 80;
 
     location ~ /api/v[0-9]+/(users/)?websocket$ {
+        proxy_hide_header X-Frame-Options;
+
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         client_max_body_size 50M;
@@ -22,6 +24,7 @@
     }
 
     location / {
+        proxy_hide_header X-Frame-Options;
         gzip on;
 
         client_max_body_size 50M;

編集したconfを反映する。

$ docker cp mattermost.conf mattermost-docker_web_1:/etc/nginx/conf.d/mattermost.conf
$ docker exec -it mattermost-docker_web_1 chown root:root /etc/nginx/conf.d/mattermost.conf
$ docker-compose exec web nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ docker-compose kill -s SIGHUP web
Killing mattermost-docker_web_1 ... done

ページにアクセスしてみると重複は解消されている。

$ curl -s -D- -o /dev/null -L http://localhost:8090/
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 05 Dec 2020 13:47:36 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 3091
Connection: keep-alive
Accept-Ranges: bytes
Cache-Control: no-cache, max-age=31556926, public
Content-Security-Policy: frame-ancestors 'self'; script-src 'self' cdn.rudderlabs.com
Last-Modified: Sat, 05 Dec 2020 12:22:43 GMT
X-Ratelimit-Limit: 101
X-Ratelimit-Remaining: 100
X-Ratelimit-Reset: 1
X-Request-Id: h3jan8rdtidtpqy7kfojb8wyna
X-Version-Id: 5.29.0.5.29.1.af2700671330c5f425f496fdaf9d92ab.false
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block

他のアプローチとして、headers-more-nginx-moduleというモジュールがあるが、これは別途組み込みが必要なようだ。

https://www.nginx.com/resources/wiki/modules/headers_more/

参考リンク

byebyehaikikyou

日記やIT系関連のネタ、WordPressに関することなど様々な事柄を書き付けた雑記です。ITエンジニア経験があるのでプログラミングに関することなどが多いです。

シェアする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください