Apache で WAF を使う場合、Ubuntu 26.04 では ModSecurity と CRS を組み合わせる構成が基本になります。
WAF は入れるだけで安全になるものではなく、検知、ログ確認、除外設定、誤検知調整まで含めて運用するものです。この記事では導入と基本設定を扱います。
パッケージをインストールする
sudo apt update
sudo apt install -y libapache2-mod-security2 modsecurity-crsモジュールを有効化する
sudo a2enmod unique_id
sudo a2enmod security2ModSecurity の基本設定を確認する
sudo ls -l /etc/modsecurity
sudo sed -n '1,120p' /etc/modsecurity/modsecurity.conf-recommended 2>/dev/null || trueDetectionOnly で始める
最初から遮断モードにすると、アプリケーション通信を止める可能性があります。まずは DetectionOnly でログを見て、問題がなければ段階的に On にします。
sudo tee /etc/modsecurity/modsecurity.conf >/dev/null <<'EOF'
SecRuleEngine DetectionOnly
SecRequestBodyAccess On
SecResponseBodyAccess Off
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
SecAuditLog /var/log/apache2/modsec_audit.log
SecStatusEngine Off
EOF遮断モードにする場合
検証後に遮断する場合は SecRuleEngine On に変更します。運用中のサイトでは、まず検知ログを確認してから切り替えます。
sudo sed -i 's/^SecRuleEngine .*/SecRuleEngine On/' /etc/modsecurity/modsecurity.conf設定を検証して反映する
sudo apache2ctl -t
sudo systemctl restart apache2
systemctl status apache2 --no-pagerWAF ログを確認する
sudo tail -n 80 /var/log/apache2/modsec_audit.log 2>/dev/null || true
journalctl -u apache2 --since "1 hour ago" --no-pager除外設定を考える
WordPress の REST API や管理画面などでは、WAF ルールが本文や JSON を誤検知することがあります。除外は全体で無効化するのではなく、URI、phase、rule ID、target を絞って行います。
<IfModule security2_module>
SecRule REQUEST_URI "@rx ^/wp-json/wp/v2/posts(?:/.*)?$" \
"id:1002101,phase:1,pass,nolog,ctl:ruleRemoveTargetById=941160;ARGS:content"
</IfModule>まとめ
Apache WAF は ModSecurity と CRS の導入だけでなく、DetectionOnly での観察、ログ確認、誤検知除外まで含めて運用します。公開サービスに入れる場合は、遮断より先にログを読む段階を必ず作るのが安全です。
Ubuntu 26.04 Apache WAF の設定



