0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ApacheとNginxで書き漏れがちなセキュリティ設定まとめ

0
Posted at

はじめに

本番サーバーを立てたとき、アプリの動作確認はするがサーバー自体の設定を後回しにしがち

デフォルトのまま公開すると、こんなレスポンスが返る:

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 だけでは不十分で、エラーページのカスタマイズも必要
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?