Ubuntu 22.04 の Apache に WAF を入れる場合、ModSecurity を有効化するだけでなく、OWASP CRS の検知内容、audit log、誤検知時の例外設定まで確認する必要があります。WAF は入れた瞬間に安全になる部品ではなく、ログを読みながら運用する防御層です。
この記事では、libapache2-mod-security2 と modsecurity-crs を導入し、検知モードから遮断モードへ進める流れ、audit log の見方、URI 単位の例外設定を扱います。Ubuntu 22.04 の既存環境を保守するための確認記事です。
- ModSecurity と OWASP CRS の位置づけ
- パッケージ導入と有効化
- 検知モードと遮断モードの使い分け
- audit log の読み方
- URI 単位の例外設定
書籍
Advanced Ubuntu Administration and Management Best Practices
Ubuntu Server の運用項目を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
WAF の位置づけ
ModSecurity は Apache に組み込む Web Application Firewall です。OWASP CRS は、SQL injection、XSS、protocol anomaly などを検知する汎用ルールセットです。
- WAF はアプリケーションの脆弱性修正の代わりではない
- 初期導入では検知モードでログを見る
- 遮断モードへ切り替える前に通常通信を確認する
- 例外設定は URI、parameter、rule id を絞って行う
- 広すぎる除外は防御効果を落とす
WordPress や REST API を使うサイトでは、正常な JSON、検索文字列、管理画面の POST が CRS に反応することがあります。まず audit log で rule id と対象 URI を確認します。
パッケージをインストールする
Apache 用の ModSecurity モジュールと OWASP CRS を導入します。
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y libapache2-mod-security2 modsecurity-crs
apache2ctl -M | grep security || true検知モードで有効化する
初回は DetectionOnly でログを見ます。いきなり遮断モードにすると、通常アクセスや管理操作が止まることがあります。
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sudo sed -i 's/^SecRuleEngine DetectionOnly/SecRuleEngine DetectionOnly/' /etc/modsecurity/modsecurity.conf
grep '^SecRuleEngine' /etc/modsecurity/modsecurity.confCRS を読み込む
Apache の security2 モジュール設定で ModSecurity 設定と CRS を読み込みます。
sudo tee /etc/apache2/mods-available/security2.conf >/dev/null <<'EOF'
<IfModule security2_module>
SecDataDir /var/cache/modsecurity
IncludeOptional /etc/modsecurity/*.conf
IncludeOptional /usr/share/modsecurity-crs/*.load
</IfModule>
EOF
sudo a2enmod security2
sudo apache2ctl configtest
sudo systemctl reload apache2サービス状態を確認する
Apache が起動していること、ModSecurity モジュールが読み込まれていることを確認します。
apache2ctl -M | grep security
sudo systemctl status apache2 --no-pager
sudo journalctl -u apache2 -n 80 --no-pageraudit log を確認する
ModSecurity の判断は audit log で確認します。rule id、message、uri、matched data を見て、通常通信か攻撃らしい通信かを判断します。
sudo tail -n 200 /var/log/apache2/modsec_audit.log
sudo grep -E 'Message:|id "[0-9]+"|uri|Matched Data' /var/log/apache2/modsec_audit.log | tail -n 120テストリクエストを送る
検知モードで、WAF が反応することを確認します。テストは自分の検証環境で行い、公開サービスでは影響の少ない時間に実施します。
curl -i 'http://server.example.local/?q=%3Cscript%3Ealert%281%29%3C%2Fscript%3E'
sudo grep -E 'Message:|id "[0-9]+"|uri|Matched Data' /var/log/apache2/modsec_audit.log | tail -n 80遮断モードへ切り替える
通常アクセスと管理操作を確認したあと、必要に応じて SecRuleEngine On に切り替えます。切り替え後は 403 の発生状況を必ず見ます。
sudo sed -i 's/^SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/modsecurity/modsecurity.conf
grep '^SecRuleEngine' /etc/modsecurity/modsecurity.conf
sudo apache2ctl configtest
sudo systemctl reload apache2例外設定の考え方
誤検知が出た場合、ModSecurity 全体や CRS 全体を無効化するのではなく、影響範囲を小さくします。基本は rule id、URI、parameter を絞ります。
- まず audit log で rule id と URI を確認する
- 特定 URI だけで除外できるか確認する
- 特定 parameter だけで除外できるか確認する
- 除外理由を運用メモに残す
- CRS 更新後に例外がまだ必要か見直す
URI 単位でルールを除外する
Apache の設定として、特定 URI に対して rule id を除外する例です。実際には audit log で確認した rule id に置き換えます。
sudo tee /etc/apache2/conf-available/modsecurity-local-exceptions.conf >/dev/null <<'EOF'
<LocationMatch "^/wp-json/">
SecRuleRemoveById 949110
</LocationMatch>
EOF
sudo a2enconf modsecurity-local-exceptions
sudo apache2ctl configtest
sudo systemctl reload apache2上の例は考え方を示すものです。/wp-json/ 全体で除外してよいか、特定 endpoint や parameter まで絞れるかを検討します。
ルール ID を確認してから調整する
例外設定を入れる前に、どの rule id が、どの URI と値に反応しているかを確認します。
sudo awk '/Message:|id "[0-9]+"|uri|Matched Data/ {print}' /var/log/apache2/modsec_audit.log | tail -n 160WordPress で注意すること
WordPress では、管理画面、REST API、検索、ブロックエディタ、プラグインの Ajax 通信が CRS に反応することがあります。管理操作が 403 になった場合は、ユーザーやアプリケーションの問題と決めつけず、audit log を確認します。
- REST API の POST / PUT が 403 になっていないか確認する
- 検索文字列が rule に反応していないか確認する
- 管理画面だけでなく公開ページへの影響も見る
- 除外設定はサイト全体ではなく URI と rule id で絞る
- WAF 変更後はキャッシュや reverse proxy の挙動も確認する
運用上の注意
- 検知モードで通常通信を観察してから遮断モードへ進む
- 403 が出たら audit log を先に見る
- 例外設定を広げすぎない
- ルール更新後に誤検知が変わることを想定する
- Apache、reverse proxy、アプリケーションのログを合わせて確認する
WAF は、導入したら終わりではありません。通常通信、攻撃らしい通信、誤検知を audit log で見分け、必要最小限の例外にとどめることが運用の中心です。
まとめ
Ubuntu 22.04 の Apache に ModSecurity と OWASP CRS を入れる場合は、検知モード、audit log、遮断モード、例外設定の順に進めます。いきなり遮断すると通常操作を止める可能性があるため、ログを見ながら段階的に進めます。
誤検知が出た場合は、WAF を丸ごと無効化せず、rule id、URI、parameter を確認して範囲を絞ります。WordPress や REST API を使う環境では、この確認手順が特に重要です。

