🛡️ Useful Service: ModSecurity (WAF)
概要
ModSecurity は、オープンソースの WAF (Web Application Firewall) エンジンです。 通常、Webサーバー(NGINXやApache)にモジュールとして組み込んで使用します。 これに OWASP Core Rule Set (CRS) という標準的な攻撃検知ルールのセットを組み合わせることで、Webアプリケーションに対する主要な攻撃を自動的に検知・遮断できます。
💡 なぜ必要なのか?(導入メリット)
WordPressには脆弱性が見つかることがあり、プラグインの脆弱性も頻繁に報告されます。 WAFを導入すると、アプリケーションの修正を待たずに、プロトコルレベルで怪しい通信を遮断(Virtual Patching)できます。
防御できる主な攻撃:
- SQLインジェクション: データベースを不正操作する攻撃。
- クロスサイトスクリプティング (XSS): 悪意のあるスクリプトを埋め込む攻撃。
- リモートファイルインクルード (RFI): 外部の不正ファイルを読み込ませる攻撃。
- Botアクセス: 悪質なクローラやスキャナ。
⚙️ 仕組みとアーキテクチャ
Docker Infrastructureの構成では、リバースプロキシとして動作している NGINXコンテナ に ModSecurity モジュールを組み込みます。 すべてのリクエストはまずNGINX(ModSecurity)を通り、安全と判断されたものだけがWordPressに転送されます。
実装のポイント
- NGINXのビルド: 公式のNGINXイメージにはModSecurityが含まれていないため、
DockerfileでソースコードからNGINXとModSecurityモジュールをコンパイルしてビルドする必要がある(難易度高)。- または、ModSecurity組み込み済みのコミュニティイメージを活用する。
- ルールの設定:
OWASP Core Rule Set (CRS)をダウンロードし、有効化する。 - 検知モード: 最初は
DetectionOnly(検知のみ、遮断しない)で動作確認し、誤検知がないことを確認してからOn(遮断モード)にするのが一般的。
✅ 動作確認方法 (レビュー用)
正常アクセス: 普通にWordPressサイトが見られることを確認。
攻撃シミュレーション(検知テスト): ブラウザのアドレスバーに、わざとSQLインジェクションのような文字列を入力してアクセスする。
texthttps://local.dev/?param=<script>alert(1)</script>または
texthttps://local.dev/?id=1 AND 1=1ブロック確認: NGINXが 403 Forbidden エラーページを返すことを示す。 これで「WAFが攻撃を検知して遮断した」ことが証明できる。
攻撃シミュレーションの詳細手順
SQLインジェクション攻撃: ブラウザまたは
curlで以下のURLにアクセスします。bashcurl -I "https://local.dev/?id=1 AND 1=1"期待される結果:
textHTTP/2 403 server: nginx ...403 Forbiddenが返ってくれば成功です。ログ確認: NGINXのログファイル(
modsec_audit.log等)に、「XSS Attack Detected」といった記録が残っているのを見せる。ログ確認コマンド例
Dockerコンテナ内の監査ログを確認します。
bashdocker exec -it nginx cat /var/log/modsec_audit.log | tail -n 20出力の中に
Message: ... [id "942100"] ... [msg "SQL Injection Attack Detected via libinjection"]といった記述があれば検知されています。OWASP Core Rule Set (CRS) について:
Docker Infrastructureに関連するCRSの役割
OWASP CRS は、一般的なWeb攻撃を検知するための汎用的なルールセットです。 今回は以下のルールが特に有効に機能しています:
- REQUEST-942-APPLICATION-ATTACK-SQLI: SQLインジェクションを検知。WordPressのデータベースを守ります。
- REQUEST-941-APPLICATION-ATTACK-XSS: クロスサイトスクリプティングを検知。ユーザーへの攻撃を防ぎます。
- REQUEST-930-APPLICATION-ATTACK-LFI: ローカルファイルインクルージョンを防ぎ、設定ファイルの漏洩などを防ぎます。