Ubuntu 26.04 の Apache で公開サービスを運用する場合、ModSecurity と OWASP Core Rule Set を使って、HTTP リクエストをアプリケーションの前段で検査できます。
この記事では、Apache の基本設定、TLS、リバースプロキシができている前提で、WAF の導入、DetectionOnly での観察、監査ログの確認、誤検知時の切り分け方をまとめます。
- Apache で ModSecurity / CRS を使う位置づけ
DetectionOnlyとOnの違い- WAF パッケージ、モジュール、基本設定
- 監査ログの確認と誤検知の切り分け
- リバースプロキシ環境での最小限の除外方針
| 対象 OS | Ubuntu 26.04 Server |
|---|---|
| Web サーバー | Apache HTTP Server |
| WAF | ModSecurity / OWASP Core Rule Set |
| 主なモジュール | security2、unique_id |
| 監査ログ | /var/log/apache2/modsec_audit.log |
WAF の位置づけを確認する
WAF は、Web アプリケーションの脆弱性を消すものではなく、前段で危険なリクエストを検知または遮断する防御層です。アプリケーション修正、認証、TLS、ログ監視、バックアップと組み合わせて考えます。
- まず
DetectionOnlyで誤検知を観察する - 監査ログを読める状態にしてから
Onを検討する - 除外は URI やパラメータ単位で最小限にする
- リバースプロキシやアプリケーションの仕様を把握しておく
- WAF を有効化した後もアプリケーション側の対策を続ける
パッケージをインストールする
Apache 用の ModSecurity と CRS を導入します。パッケージ名は Ubuntu のリポジトリや構成により異なる場合があるため、導入前に候補を確認します。
apt-cache search modsecurity
sudo apt update
sudo apt install -y libapache2-mod-security2 modsecurity-crsApache モジュールを有効化する
ModSecurity では security2 モジュールを使います。リクエスト単位の識別に unique_id を使う構成もあるため、あわせて有効化します。
sudo a2enmod security2
sudo a2enmod unique_id
sudo apache2ctl -M
sudo apache2ctl -t
sudo systemctl reload apache2.serviceModSecurity の基本設定を確認する
SecRuleEngine は WAF の動作モードを決めます。導入直後は DetectionOnly で検知だけを行い、監査ログを見てから遮断モードの On を検討します。
sudo tee /etc/modsecurity/modsecurity.conf >/dev/null <<'EOF'
SecRuleEngine DetectionOnly
SecRequestBodyAccess On
SecResponseBodyAccess Off
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
SecAuditLogParts ABDEFHIJZ
SecAuditLogType Serial
SecAuditLog /var/log/apache2/modsec_audit.log
SecStatusEngine Off
EOF
sudo apache2ctl -t
sudo systemctl reload apache2.service
sudo tail -n 100 /var/log/apache2/error.logJSON と XML の request body を扱う
API や Webhook を扱う環境では、JSON や XML の request body を WAF が正しく解析できることが重要です。Content-Type に応じて request body processor を指定します。
sudo tee /etc/modsecurity/request-body-processors.conf >/dev/null <<'EOF'
SecRule REQUEST_HEADERS:Content-Type "^(?:application(?:/soap\+|/)|text/)xml" \
"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML"
SecRule REQUEST_HEADERS:Content-Type "^application/json" \
"id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON"
SecRequestBodyLimit 13107200
SecRequestBodyNoFilesLimit 131072
SecRequestBodyInMemoryLimit 131072
SecRequestBodyLimitAction Reject
EOF
sudo apache2ctl -t
sudo systemctl reload apache2.serviceCRS の読み込みを確認する
OWASP Core Rule Set を使う場合は、CRS の setup ファイルとルール群が読み込まれていることを確認します。Ubuntu パッケージでは配置先が環境により異なるため、実際のパスを確認します。
dpkg -L modsecurity-crs
sudo apache2ctl -M
sudo apache2ctl -t
sudo grep -R "IncludeOptional" /etc/apache2/mods-enabled /etc/apache2/conf-enabledDetectionOnly でログを観察する
DetectionOnly では、ルールに一致しても基本的には遮断せず、監査ログに記録します。公開前に通常操作、ログイン、API、ファイルアップロードなどを通し、誤検知がないか確認します。
sudo tail -f /var/log/apache2/modsec_audit.log
sudo tail -n 100 /var/log/apache2/error.log
curl -I https://www.example.com/
curl -I https://www.example.com/login監査ログで見る項目
WAF が検知した場合は、監査ログから URI、リクエストメソッド、パラメータ、ルール ID、メッセージ、該当データを確認します。リバースプロキシ環境では、バックエンドに届く前に止まっているのかも切り分けます。
- 対象 URI と HTTP メソッド
- 検知したルール ID
- 対象パラメータや request body の場所
- ステータスコードと Apache error log
- リバースプロキシ先の access log に届いているか
誤検知時の除外方針
誤検知が出た場合は、WAF 全体や CRS 全体を無効化するのではなく、対象 URI、対象パラメータ、対象ルール ID に絞って除外します。除外は目的と根拠を残し、広げすぎないようにします。
sudo tee /etc/apache2/conf-available/modsecurity-local-exceptions.conf >/dev/null <<'EOF'
<IfModule security2_module>
<LocationMatch "^/api/example$">
SecRuleRemoveTargetById 942100 "ARGS:search"
</LocationMatch>
</IfModule>
EOF
sudo a2enconf modsecurity-local-exceptions
sudo apache2ctl -t
sudo systemctl reload apache2.service遮断モードへ切り替える
DetectionOnly で通常操作を確認し、必要な除外を最小限にしたら、SecRuleEngine On を検討します。切り替え後は、重要な画面や API を再確認します。
sudo sed -i 's/^SecRuleEngine .*/SecRuleEngine On/' /etc/modsecurity/modsecurity.conf
sudo apache2ctl -t
sudo systemctl reload apache2.service
sudo tail -f /var/log/apache2/modsec_audit.log公開前の確認ポイント
sudo apache2ctl -tが成功するsecurity2とunique_idが有効になっているDetectionOnlyで通常操作を確認している/var/log/apache2/modsec_audit.logを確認できる- 誤検知除外を URI、パラメータ、ルール ID で絞っている
Onに切り替えた後にログイン、検索、API、アップロードを再確認している
まとめ
Ubuntu 26.04 の Apache WAF 設定では、ModSecurity と CRS を導入し、まず DetectionOnly で監査ログを観察します。誤検知を確認してから、必要最小限の除外を入れ、遮断モードを検討します。
WAF は公開サービスの前段に置く防御層ですが、アプリケーション修正やログ監視の代わりにはなりません。リバースプロキシ、TLS、アプリケーションログと合わせて確認できる状態にしておくことが大切です。

