ModSecurity をインストールして Apache に適用するまでの備忘録(Ubuntu 24.04 LTS)
こんにちは
脳みそは既に EOL
システムソリューション部のかわです。
ちょっと前の話ですが、6月に Micro Hardening という、セキュリティ堅牢化のチーム競技大会である Hardening Project の小規模版に参加してきました。
淡路島の開催で、ハードな演習ではあったんですが、天候も良く海と山に囲まれた自然の中で取り組めたので、すごく充実した時間を過ごせました。
(夕日がきれいかった)
演習は45分1セット(計6セット)でECサイトを攻撃から守りつつ、仮にダウンした際の SLA もスコア算定され、チーム単位で最終的な売上+スコアを競います。
常に何かしらの攻撃が来るんですが、うちのチームは今回特に SQLインジェクション に苦しめられました。
▼ 詳しくは弊社一木の記事を参照されたし ▼
どうやって防ごうと思案していたところ、ModSecurity を使ってみようとなり、結果的にこれが功を奏して高得点を獲得できました。
今回は、ModSecurity のインストール方法と、その付随する CRS ルールの導入について備忘録として残します。
そもそも ModSecurity とは?
(ご存知の方はすっ飛ばしてもらえれば!)
ModSecurity とは、OWASP が所有する OSS の WAF(Web Application Firewall)エンジンで、各種 CMS を使用して提供されるWebサイト等を攻撃から守ってくれます。
CRS ルールというルールセット(定義ファイル的な)と組み合わせて使用し、WordPress や Drupal などの主要な CMS、ミドルウェアでは Apache や Nginx・IIS などに対応しています。インストール後少し設定すれば使えるようになるので、スタンドアロンで稼働している環境で簡単に導入できます。
ただし、False Positive(誤判定)のチューニングが少し難しいので、本番環境に導入・運用するのは時間がかかる作業になるかと思います。
また、AWS WAF や WAFCharm などのクラウドWAFが前段に配置されている環境では、守備範囲が重複するので導入メリットは薄いです。
環境
Ubuntu 24.04 LTS Apache/2.4.58
インストールと初期設定
sudo apt update sudo apt install libapache2-mod-security2 sudo a2enmod security2 # モジュール有効化
以下、インストール後の基本的な設定です。
サンプルコンフィグが作成されるので、ファイル名を変更して一部編集します。
cd /etc/modsecurity/ sudo mv modsecurity.conf-recommended modsecurity.conf sudo nano /etc/modsecurity/modsecurity.conf SecRuleEngine DetectionOnly #デフォルトは検知のみになっているので有効化 ↓ SecRuleEngine On SecAuditLogParts ABIJDEFHZ # Dは「中間的レスポンスヘッダ」の意味だが、予約語で未実装の模様 ↓ SecAuditLogParts ABCEFHJKZ # Iを削除、DをC(リクエストボディ)に変更 sudo systemctl restart apache2
これで一旦の設定は完了です。
次は CRS ルールをダウンロードします。
ルールセットのダウンロード(v4.3.0)
※ 本記事の執筆中に、v4.4.0 がリリースされたようですが、基本的に本手順はバージョン違いでも同様です。最新版は以下を参照されたし。
https://github.com/coreruleset/coreruleset/releases
GitHub からファイルをダウンロードし解凍、その後 Apache ディレクトリ以下に移動しておきます。
cd /tmp/ sudo wget -p /tmp/ https://github.com/coreruleset/coreruleset/archive/refs/tags/v4.3.0.tar.gz tar xvf v4.3.0.tar.gz sudo mkdir /etc/apache2/modsecurity-crs/ sudo mv coreruleset-4.3.0/ /etc/apache2/modsecurity-crs/ cd /etc/apache2/modsecurity-crs/coreruleset-4.3.0/ sudo mv crs-setup.conf.example crs-setup.conf
コアルールセットを認識させるため include します。
/etc/apache2/mods-enabled/security2.conf … # Include OWASP ModSecurity CRS rules if installed #IncludeOptional /usr/share/modsecurity-crs/*.load IncludeOptional /etc/apache2/modsecurity-crs/coreruleset-4.3.0/crs-setup.conf IncludeOptional /etc/apache2/modsecurity-crs/coreruleset-4.3.0/rules/*.conf … sudo apache2ctl -t # シンタックスチェックでおそらくエラーになると思います。 AH00526: Syntax error on line 818 of /etc/apache2/modsecurity-crs/coreruleset-4.3.0/crs-setup.conf: ModSecurity: Found another rule with the same id /etc/apache2/modsecurity-crs/coreruleset-4.3.0/rules # → REQUEST-922-MULTIPART-ATTACK.confのルールでエラーが出ているので3件該当箇所削除、もしくは922をリネームし回避します。
後半のエラーについてですが、ModSecurity のバージョンに依存して発生しているようです。
こちらの Closed になった issue で報告されているように、
https://github.com/coreruleset/coreruleset/issues/3129
ModSecurity バージョンを上げれば発生しなくなるようですが、非公式リポジトリのようなので、本記事では取り扱いません。
本番運用する前に...
前述のように、WAF をはじめとする IPS やエンドポイントセキュリティ製品は、False Positive が発生する可能性があります。
なので、導入前のタイミングでIDSモード(検知のみ)で動かし、ログを収集するのが第一歩になるかと思います。
ModSecurity の場合は、error.log を確認し、どのような内容で検出があったか調べ、除外するルールや閾値が設定されている部分で、緩和を検討する必要があります。
まとめ
クラウド型を含め WAF は便利ですが、本番運用に落とし込む前に、実環境に影響が及ぶことがあるので、チューニングが必要になります。
少し運用は大変ですが、この点さえクリアできれば、スタンドアロン型で動作していてもセキュリティを強化できるので、エンドポイント製品も加えれば、多重防御に繋がり堅牢性が更に高められます。
完