はじめに
Apache + mod_wsgi + Flaskの構成を運用する中で、デフォルト設定のままでは「バージョン情報の漏洩」「DoS攻撃」「クリックジャッキング」等のリスクが残ることに気づきました。本記事では、備忘録として httpd.conf に書くべき設定を 「IP・基本設定」「セキュリティ対策」 の2軸で整理します。
ログ設定(フォーマット・ローテーション)は内容が多くなるため後編に分割しました。
| 記事 | 内容 |
|---|---|
| 前編(本記事) | IP設定、サーバー基本設定、セキュリティ対策 |
| 後編 | ログフォーマット、ログローテーション(Linux/Windows) |
検証環境
| 項目 | バージョン・値 |
|---|---|
| Apache HTTP Server | 2.4.68(2026年6月8日リリース/最新の安定版) |
| 対象OS | Windows Server / Linux 共通で記載 |
| 設定ファイル | httpd.conf(Linuxは apache2.conf または sites-available 配下) |
1. IPアドレス・リスニング設定
1.1 Listenディレクティブ
# 全てのIPの80番ポートで待ち受け
Listen 80
# 特定IPのみ待ち受け(マルチホームサーバー等)
Listen 192.168.1.10:80
Listen 192.168.1.10:443
複数NICを持つサーバーで「特定セグメントからのみ受け付けたい」場合、Listen にIPを明示することで意図しないインターフェースでのリクエスト受付を防げます。
1.2 IPベースのアクセス制限
Apache 2.4からは2.2系の Order / Allow / Deny が廃止され、mod_authz_core の Require 構文に統一されています。
<Directory "/var/www/html/admin">
# 社内LANからのみアクセス許可
Require ip 192.168.1.0/24
Require ip 10.0.0.0/8
</Directory>
複数条件をAND/ORで組み合わせる場合は <RequireAll> / <RequireAny> を使用します。
<RequireAll>
Require ip 192.168.1.0/24
Require not ip 192.168.1.100
</RequireAll>
2. サーバー基本設定
2.1 KeepAlive設定
| ディレクティブ | 推奨値 | 役割 |
|---|---|---|
| KeepAlive | On | TCP接続を再利用しコネクション確立コストを削減 |
| MaxKeepAliveRequests | 100 | 1接続あたりの最大リクエスト数(0は無制限) |
| KeepAliveTimeout | 5 | 次のリクエストを待つ秒数 |
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
KeepAliveTimeoutを長くしすぎると、接続維持中のワーカープロセス/スレッドが増え続けます。同時接続数の少ない小規模サーバーほどリソース枯渇のリスクが高いため、3〜5秒程度が無難です。
2.2 エラーページへのメールアドレス表示
Apacheが自動生成する404・500等のエラーページ下部に管理者メールアドレスを表示するかは ServerSignature で制御します。
ServerAdmin admin@example.com
ServerSignature Email
| 設定値 | 動作 |
|---|---|
| Off | 署名行を表示しない(外部公開サーバー推奨) |
| On | バージョン情報込みの署名行を表示(非推奨) |
| バージョン情報なしでmailtoリンクのみ表示 |
社内システムなど利用者を限定できる場合は Email、外部公開サーバーでは Off を推奨します。バージョン情報を含む On は後述のセキュリティ対策と矛盾するため避けてください。
2.3 タイムアウト設定
Timeout 60
クライアントとの送受信が完全に停止してから切断までの秒数です。デフォルト60秒で問題ないケースが多いですが、応答が遅延しがちな機器(IoT/RFIDリーダー等)が接続元にある場合は実測の上で調整してください。
3. セキュリティ対策
3.1 バージョン情報の非表示
レスポンスヘッダーとエラーページからApacheのバージョン・OS情報を排除し、攻撃者に既知の脆弱性を推測する材料を与えないようにします。
ServerTokens Prod
ServerSignature Off
| ServerTokens設定値 | レスポンスヘッダー例 |
|---|---|
| Full(デフォルト) | Apache/2.4.68 (Win64) PHP/8.3.0 |
| OS | Apache/2.4.68 (Win64) |
| Major | Apache/2 |
| Prod(推奨) | Apache |
3.2 DoS(サービス拒否攻撃)対策
mod_reqtimeout でヘッダー・ボディの受信完了までの時間を制限し、低速通信を維持して接続を専有する攻撃(Slowloris等)を防ぎます。
<IfModule reqtimeout_module>
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>
リクエストサイズ自体も制限します。
# リクエストボディの最大サイズ(バイト)。例: 10MB
LimitRequestBody 10485760
# ヘッダーのフィールド数・サイズ制限
LimitRequestFields 50
LimitRequestFieldSize 8190
LimitRequestLine 8190
| ディレクティブ | デフォルト | 用途 |
|---|---|---|
| LimitRequestBody | 0(無制限) | POSTボディの最大サイズ。アップロード機能の有無に応じて調整 |
| LimitRequestFields | 100 | ヘッダーフィールド数の上限 |
| LimitRequestFieldSize | 8190 | 1ヘッダーあたりの最大サイズ |
| LimitRequestLine | 8190 | リクエストライン全体の最大サイズ |
より高度な「同一IPからの過剰アクセス遮断」が必要な場合はサードパーティモジュール mod_evasive の併用も選択肢ですが、社内ネットワーク限定運用であれば標準モジュールの設定で十分なケースが多いです。
3.3 HTTPoxy対策
2016年に報告されたHTTPoxy(CVE-2016-5385等)は、クライアントから Proxy ヘッダーを注入することでCGI/PHP等の環境変数 HTTP_PROXY を汚染し、意図しないプロキシ経由通信を発生させる脆弱性です。言語ランタイム側は対策済みのものが多いですが、多層防御としてサーバー側でも無効化します。
<IfModule mod_headers.c>
RequestHeader unset Proxy early
</IfModule>
3.4 クリックジャッキング対策
自サイトを他サイトの <iframe> に埋め込み、ユーザーに見えない形でクリックを誘導される攻撃を防ぎます。
<IfModule mod_headers.c>
Header always set X-Frame-Options "SAMEORIGIN"
</IfModule>
| 設定値 | 動作 |
|---|---|
| DENY | iframe表示を全面禁止 |
| SAMEORIGIN | 同一オリジンのみ許可(推奨) |
| ALLOW-FROM uri | 指定オリジンのみ許可(非推奨・廃止予定) |
より柔軟に制御したい場合は、後述のCSPの frame-ancestors ディレクティブへ移行するのが現在の標準的なアプローチです。
3.5 XSS対策
かつて主要ブラウザに搭載されていたXSSフィルタを制御する X-XSS-Protection ヘッダーは、Chromeの XSS Auditor 廃止(Chrome 78以降)に伴い非推奨です。Firefoxはそもそも実装していません。誤検知によって逆にXSSを誘発するケースもあるため、現在は明示的に無効化した上でCSPに一本化するのが推奨構成です。
<IfModule mod_headers.c>
# 旧フィルタは明示的に無効化(誤検知によるリスク回避)
Header always set X-XSS-Protection "0"
# 実質的なXSS対策はCSPで行う
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self'; base-uri 'self'"
</IfModule>
CSPは適用直後に既存ページが壊れるケースが多いため、Content-Security-Policy-Report-Only で一定期間レポートのみ収集し、違反がないことを確認してから本適用すると安全です。
3.6 MIMEスニッフィング対策
ブラウザがレスポンスの Content-Type を無視し内容から型を推測する「MIMEスニッフィング」を無効化します。画像としてアップロードされたファイルがスクリプトとして実行される等の被害を防ぎます。
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
</IfModule>
3.7 HTTP経由でアクセス可能なフォルダの制限
「ドキュメントルート以下は原則すべて拒否」を起点に、必要なディレクトリだけを明示的に許可する構成が安全です。
# ルートはまず全拒否
<Directory />
Options None
AllowOverride None
Require all denied
</Directory>
# 公開したいディレクトリだけ明示的に許可
<Directory "/var/www/html">
Options -Indexes -ExecCGI
AllowOverride None
Require all granted
</Directory>
Options -Indexes はファイル一覧(ディレクトリインデックス)の自動表示を無効化します。index.html等が存在しないディレクトリへ直接アクセスされた際に、内部のファイル構成を晒さないために必須です。
設定ファイル・隠しファイル・バックアップファイルは拡張子やパターンで個別に遮断します。
# .htaccess, .htpasswd, .env, .git等への直接アクセスを禁止
<FilesMatch "^\.">
Require all denied
</FilesMatch>
<FilesMatch "\.(bak|config|sql|fla|psd|ini|log|sh|inc|swp|dist)$">
Require all denied
</FilesMatch>
<DirectoryMatch "/\.git">
Require all denied
</DirectoryMatch>
まとめ
| カテゴリ | 設定ディレクティブ | 目的 |
|---|---|---|
| IP制御 | Listen, Require ip | 待ち受けIP・アクセス元の制限 |
| KeepAlive | KeepAlive, KeepAliveTimeout | コネクション再利用とリソース保護 |
| エラーページ | ServerSignature, ServerAdmin | 管理者連絡先の表示制御 |
| バージョン秘匿 | ServerTokens Prod, ServerSignature Off | 攻撃の足がかりとなる情報を排除 |
| DoS対策 | mod_reqtimeout, LimitRequest* | 低速攻撃・過大リクエストの遮断 |
| HTTPoxy対策 | RequestHeader unset Proxy | CGI環境変数汚染の防止 |
| クリックジャッキング | X-Frame-Options / CSP frame-ancestors | iframe埋め込みの制限 |
| XSS対策 | CSP(X-XSS-Protectionは非推奨) | スクリプト注入の防止 |
| MIMEスニッフィング | X-Content-Type-Options: nosniff | Content-Type偽装の防止 |
| フォルダ制限 | Options -Indexes, Require all denied | 内部構成・機密ファイルの非公開化 |
後編では「ログフォーマットの設計」と「ログローテーション(Linux/Windows両対応)」を扱います。
さいごに
セキュリティ系のヘッダー設定は一つずつ見ると小さな変更ですが、まとめて適用することで攻撃対象領域(Attack Surface)を大きく減らせます。
今後、Apacheの設定を行なうことがあれば、
「たしか、こういう設定があったよな。」
と、すぐに調べられるように備忘録としてまとめました。