はじめに
本番サーバーを立てたとき、アプリの動作確認はするがサーバー自体の設定を後回しにしがち。
デフォルトのまま公開すると、こんなレスポンスが返る:
curl -I https://example.com
HTTP/1.1 200 OK
Server: Apache/2.4.51 (Ubuntu)
X-Powered-By: PHP/8.1.2
...
👉 バージョン情報がそのまま外部に出てしまっている
攻撃者にとっては「どの脆弱性を使えばいいか」が一発でわかるヒントになる。
この記事では書き漏れやすい設定を5つのカテゴリにまとめる。
バージョン情報の漏洩
なぜ危険か
Server ヘッダーにバージョンが出ていると、そのバージョン固有の CVE を検索して攻撃に使われる。
Server: Apache/2.4.51 (Ubuntu)
^^^^^^^^^^^^ ここが危険
Apache
# /etc/apache2/apache2.conf または /etc/httpd/conf/httpd.conf
ServerTokens Prod
ServerSignature Off
| ディレクティブ | 推奨値 | 効果 |
|---|---|---|
ServerTokens |
Prod |
Server: Apache のみ出力(バージョン非表示) |
ServerSignature |
Off |
エラーページのフッターにサーバー情報を出さない |
設定後の確認:
curl -I http://localhost
# Server: Apache ← バージョンが消える
Nginx
# /etc/nginx/nginx.conf の http ブロック内
server_tokens off;
設定後の確認:
curl -I http://localhost
# Server: nginx ← バージョンが消える
ディレクトリリスティング
なぜ危険か
インデックスが有効だと、index.html がないディレクトリにアクセスしたときファイル一覧が表示される。
Index of /uploads
../
config.bak 2024-01-01
secret.txt 2024-01-01
👉 バックアップファイルや設定ファイルが丸見えになる
Apache
<Directory /var/www/html>
Options -Indexes
</Directory>
❌ Options Indexes が残っていると有効になる。明示的に -Indexes で無効化する。
設定後の確認:
curl -I http://localhost/uploads/
# HTTP/1.1 403 Forbidden ← 一覧が出なくなる
Nginx
# server ブロックまたは location ブロック内に記述
autoindex off;
👉 Nginx はデフォルトで無効だが、設定ファイルで autoindex on; にしていないか確認する。
ETag によるinode情報漏洩
なぜ危険か
Apache のデフォルトの ETag 値は inode番号・ファイルサイズ・更新日時 から生成される。
ETag: "1a2b3c-abc-def"
^^^^^^ inode番号が含まれることがある
inode 番号からサーバーの内部ファイルシステム構成が推測される場合がある。また、ロードバランサー配下で複数台構成のとき ETag が一致せず、キャッシュが無効化される問題も起きる。
Apache
# /etc/apache2/apache2.conf または httpd.conf のサーバー全体設定
FileETag None
# VirtualHost 単位で設定する場合
# <VirtualHost *:80>
# FileETag None
# </VirtualHost>
設定後の確認:
curl -I http://localhost/index.html
# ETag ヘッダーが消える
Nginx
標準の Nginx には ETag を無効化するディレクティブがない。
ngx_headers_more モジュールが使える環境では:
more_clear_headers ETag;
モジュールが使えない場合は、Apache 側で FileETag None を設定するか、
ロードバランサー(ALB など)でヘッダーを除去する。
👉 Nginx 単体では ETag を完全に消すのが難しいため、Apache の方が対処しやすい。
設定後の確認(ngx_headers_more を使った場合):
curl -I http://localhost/index.html
# ETag ヘッダーが消える
X-Powered-By ヘッダー
なぜ危険か
X-Powered-By: PHP/8.1.2 のように PHP バージョンやフレームワーク名が出ることがある。
X-Powered-By: PHP/8.1.2
^^^^^^^^^^^ PHPバージョンが露出
Apache(mod_headers で除去)
# mod_headers が有効になっていること
# a2enmod headers && systemctl restart apache2
Header always unset X-Powered-By
Nginx / PHP 共通(PHP 側で無効化)
👉 Nginx 自体は X-Powered-By ヘッダーを生成しない。このヘッダーは PHP やアプリケーションフレームワーク(Express など)が付加する。
PHP の設定で出力を止めるのが確実:
# /etc/php/8.x/fpm/php.ini または /etc/php/8.x/apache2/php.ini
expose_php = Off
設定後の確認:
curl -I http://localhost/
# X-Powered-By ヘッダーが消える
👉 expose_php = Off は Apache / Nginx どちらでも有効。まずこちらを設定する。
エラーページのデフォルト表示
なぜ危険か
設定しないとデフォルトのエラーページが表示され、サーバー情報が含まれる。
Not Found
The requested URL was not found on this server.
Apache/2.4.51 (Ubuntu) Server at example.com Port 80
👉 ServerSignature Off を設定していてもエラーページ自体は別途カスタマイズが必要。
Apache
ErrorDocument 400 /error/400.html
ErrorDocument 403 /error/403.html
ErrorDocument 404 /error/404.html
ErrorDocument 500 /error/500.html
Nginx
error_page 400 /error/400.html;
error_page 403 /error/403.html;
error_page 404 /error/404.html;
error_page 500 502 503 504 /error/500.html;
location ^~ /error/ {
internal;
root /var/www/html;
}
チェックリスト
| 設定項目 | Apache | Nginx | デフォルトの問題 |
|---|---|---|---|
| バージョン情報 |
ServerTokens Prod + ServerSignature Off
|
server_tokens off; |
バージョンが露出 |
| ディレクトリリスティング | Options -Indexes |
autoindex off(明示) |
ファイル一覧が丸見え |
| ETag | FileETag None |
more_clear_headers ETag(要モジュール) |
inode番号が漏洩する場合がある |
| X-Powered-By | Header always unset X-Powered-By |
PHP側 expose_php = Off
|
PHPバージョン等が露出 |
| エラーページ | ErrorDocument 404 /error/404.html |
error_page 404 /error/404.html |
サーバー情報がエラー画面に出る |
まとめ
- これらはすべてデフォルトが危険な設定。明示的に書かないと有効にならない
- 設定後は
curl -Iでヘッダーを確認する習慣をつける -
ServerSignature Offだけでは不十分で、エラーページのカスタマイズも必要