これは何?
セキュリティに関連するnginxの設定ミスをまとめました。
GitHub Repository
脆弱な設定とその対処方
GitHub Repository
サンプルリポジトリを作成したのでこれをベースに説明します。
cd vulnerable_server_settings
docker compose up
ディレクトリリスティング
http://localhost:8080/list/にアクセスするとディレクトリリスティングされているのがわかります。これにより,攻撃者はディレクトリ配下にあるファイルすべてのパスがわかってしまうため,万が一ユーザに公開する予定のないファイルが公開されている場合にアクセスされやすくなってしまいます。
(ディレクトリリスティングが無効な場合パスがわからない限りは当該ファイルを閲覧されない)
How to fix
nginx.confの以下の部分を削除します。
# FIXME: ディレクトリリスティング
autoindex on;
autoindex_exact_size off; # ファイルサイズを簡易表示
autoindex_localtime on; # ファイルのタイムスタンプをローカルタイムで表示
エラー画面からnginxのバージョンがわかる
http://localhost:8080/hogeにアクセスするとversion情報が見えます。version情報がわかることで攻撃者はそのバージョンに対応した脆弱性を探しやすくなります。
How to fix
nginx.confに設定を追加します。
server_tokens off; # エラーページ,レスポンスのServerヘッダにnginxのバージョンを表示しない
レスポンスヘッダからバージョン情報がわかる
ブラウザの開発者機能やcurl等でレスポンスを見るとServer: openresty/1.21.4.1
が確認できます。
curl -v http://localhost:8080 2>&1 | grep '< '
< HTTP/1.1 200 OK
< Server: openresty/1.21.4.1
< Date: Sat, 21 Dec 2024 10:22:30 GMT
< Content-Type: text/html
< Content-Length: 601
< Last-Modified: Sat, 21 Dec 2024 10:14:57 GMT
< Connection: keep-alive
< ETag: "67669521-259"
< Accept-Ranges: bytes
How to fix
nginx.confに設定を追加します。
server_tokens off; # FIXME: エラーページ,レスポンスのServerヘッダにnginxのバージョンを表示しない
robots.txtからパス構成がわかる。 (参考)
http://localhost:8080/robots.txtにアクセスすることで管理者ページadmin.html
のパスが存在することがわかります。これにより,攻撃者にヒントを与える可能性があります。
How to fix
公開したくないファイルパスはrobots.txtの代わりに以下の設定をすることでクローラーからのアクセスを拒否できます。
- 代替策1: htmlにmeta情報を追加する
<meta name="robots" content="noindex"> <!--robots.txtの代わり-->
- 代替策2: レスポンスに
X-Robots-Tag: noindex
を追加する
location = /admin.html {
add_header X-Robots-Tag "noindex";
}
# check
curl -v http://localhost:8080/admin.html 2>&1 | grep '< '
< HTTP/1.1 200 OK
< Server: openresty/1.21.4.1
< Date: Sat, 21 Dec 2024 11:02:34 GMT
< Content-Type: text/html
< Content-Length: 93
< Last-Modified: Sat, 21 Dec 2024 10:52:36 GMT
< Connection: keep-alive
< ETag: "67669df4-5d"
< X-Robots-Tag: noindex
< Accept-Ranges: bytes