手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 26.04 Apache WAF の基本設定 – ModSecurity と CRS を導入する

関連する記事

Ubuntu 26.04 の Apache で公開サービスを運用する場合、ModSecurity と OWASP Core Rule Set を使って、HTTP リクエストをアプリケーションの前段で検査できます。

この記事では、Apache の基本設定、TLS、リバースプロキシができている前提で、WAF の導入、DetectionOnly での観察、監査ログの確認、誤検知時の切り分け方をまとめます。

この記事で扱うこと
  • Apache で ModSecurity / CRS を使う位置づけ
  • DetectionOnlyOn の違い
  • WAF パッケージ、モジュール、基本設定
  • 監査ログの確認と誤検知の切り分け
  • リバースプロキシ環境での最小限の除外方針
対象 OSUbuntu 26.04 Server
Web サーバーApache HTTP Server
WAFModSecurity / OWASP Core Rule Set
主なモジュールsecurity2unique_id
監査ログ/var/log/apache2/modsec_audit.log
参考書籍
参考書籍
Web Application Security
Web アプリケーション防御、WAF、ログ監視、脆弱性対策を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見る
このリンクは Amazon アソシエイトリンクです。

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-crs

Apache モジュールを有効化する

ModSecurity では security2 モジュールを使います。リクエスト単位の識別に unique_id を使う構成もあるため、あわせて有効化します。

コマンド
sudo a2enmod security2
sudo a2enmod unique_id
sudo apache2ctl -M
sudo apache2ctl -t
sudo systemctl reload apache2.service

ModSecurity の基本設定を確認する

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.log

JSON と 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.service

CRS の読み込みを確認する

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-enabled

DetectionOnly でログを観察する

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
WAF によるブロックが発生した場合は、無理に回避せず、監査ログでルール ID、対象 URI、対象パラメータを確認してから調整します。広い除外は防御範囲を下げるため避けます。

遮断モードへ切り替える

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 が成功する
  • security2unique_id が有効になっている
  • DetectionOnly で通常操作を確認している
  • /var/log/apache2/modsec_audit.log を確認できる
  • 誤検知除外を URI、パラメータ、ルール ID で絞っている
  • On に切り替えた後にログイン、検索、API、アップロードを再確認している

まとめ

Ubuntu 26.04 の Apache WAF 設定では、ModSecurity と CRS を導入し、まず DetectionOnly で監査ログを観察します。誤検知を確認してから、必要最小限の除外を入れ、遮断モードを検討します。

WAF は公開サービスの前段に置く防御層ですが、アプリケーション修正やログ監視の代わりにはなりません。リバースプロキシ、TLS、アプリケーションログと合わせて確認できる状態にしておくことが大切です。

関連する記事
Ubuntu 26.04 Apache WAF の基本設定 – ModSecurity と CRS を導入する

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る