【WEBセキュリティ】OSSのWAFで攻撃を防ぐ選択肢
まえがき
こんにちはニシパ(21)です🫡
皆さん、WAFと聞いて、何を思い浮かべますか?
AWS WAFや、セキュリティベンダーのWAFナドナド。。
運用コストの低さや、セキュリティの高さが魅力的ですよね!
ただ、要件によっては、
「コスト」や「柔軟な設定」 については考える必要がありそうです。
「やっすく済ませたいけど、セキュリティも最低限考えたいなあ。」
「柔軟な設定ができるWAFはないかしら。」
ということで、
今回はOSSのWAF「Mod Securiry」について記事にしてみました!
WAFの概要を理解し、OSS WAFの特性ついて知りましょう🔥
概要
WAFとModSecurityについて解説します。
WAF(Web Application Firewall)
Webアプリケーションを狙った攻撃から、HTTPレベルで保護するセキュリティレイヤー
例えば?
- AWS WAF(ウェブアプリケーションファイアウォール)| AWS
- 攻撃遮断くん | 国内シェアNo.1のクラウド型WAF
- WAF スキュータム(Scutum) - クラウド型Webアプリケーションファイアウォール
FWとは違うの?
FW : IP,Portなどレイヤー3~4を保護対象とする。
WAF: URL,クエリ,Cookie,User-Agent,Postデータ等、レイヤー7を保護対象とする。
何から守ってくれるの?
- XSS(Cross-Site Scripting)
- SQLi(SQL injection)
- RFI/LFI
- その他アプリへの攻撃(多機能なものはレイヤをまたいで防ぐ)
Mod Security
Apache,Nginx,IIS などに組み込めるオープンソースのWAFモジュール
→ AWS WAFなどとは違い、サーバーにインストールして使う(ホスト型のWAFである)
- ルールベース :通信内容に基づいて評価
- オープンソース:自由に利用可能
- 拡張性がある :独自ルールも追加可能
- ログ詳細記録 :何がなぜどのルールでブロックされたか記録
ルールの中核:OWASP CRS
ModSecurity単体では空っぽだが、OWASP CRS(Core Rule Set)を追加することで強力になる。
OWASP CRSの特徴
- 豊富なセキュリティ対策ルールが用意
- 複数検知による評価、検出精度を段階設定可能
環境設定
使用環境
- 仮想環境 : VMware(NAT接続でセッティング、ブリッジ接続で検証)
- OS : 防御側⇒Ubuntu Server 22.04, 攻撃側⇒Kali linux
- Web : Apache2
- WAF : ModSecurity (libapache2-mod-security2)
- ルール : OWASP Core Rule Set(v4系、Github版)
ModSecurityのインストール
- インストール(必要ならUbuntuを更新しておく)
sudo apt install libapache2-mod-security2 -y
- 設定ファイルをコピーして有効化
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sudo vi /etc/modsecurity/modsecurity.conf
#modsecurity.conf
-SecRuleEngine DetectionOnly
+SecRuleEngine On
- OWASP CRSの導入
cd /etc/modsecurity
sudo git clone https://github.com/coreruleset/coreruleset.git
- Apacheの設定確認、再起動
sudo apachectl configtest
# => Syntax OK が出れば設定に問題なし!
sudo systemctl restart apache2
完成!🎉🥳
本当なら、
- UbuntuにApache入れてWebページを作成して、
- 攻撃側用意して、
- 疎通確認して、
みたいのもやりますが、カツアイ
こんな感じで、Ubuntu Server(WEB)のページが攻撃側からアクセスできるとOKです!
攻撃してみる
curlコマンドで簡単なXSSのテストをして、ステータスコードで攻撃の可能性を検証する。
- 200 → 防護していない。
- 403 → 防護されている。(ログを見て確認する。)
スクリプト実行
curl -s -o /dev/null -w "%{http_code}\n" "http://<サーバーのIP>/?q=<script>alert(1)</script>"
- 標準の出力を破棄、ステータスコードのみ出力する。
- クエリストリングにスクリプトを含める。
WAFがON(上)・OFF(下)の時のログ
しっかりと防護できているようです!ログを見てみましょう。
ModSecurityのログ
sudo tail -f /var/log/apache2/modsec_audit.log
?!..
....フニュゥ。
ログセクション
これはChatGPTにまとめてもらいました。
A : Request Headers クライアントから送信されたリクエストヘッダー
B : Request Body リクエストボディ(POSTデータなど)
C : Intervention ModSecurityによって即時介入(遮断など)した場合の詳細
D : Response Headers Apacheが生成したレスポンスヘッダー
E : Response Body Apacheが返すレスポンスボディ(HTMLなど)
F : Audit Log Trailer レスポンスボディのエンコーディング・変換情報など
H : Audit Log Alert ここが最重要!どのルール(id)が発動し、何が検出されたかの本体ログ
K : Producer Info ApacheやModSecurityのバージョン、CRSのバージョンなど
Z : Summary 全体の結果:ステータスコード、アノマリースコア、ユニークIDなど
基本的なセクションに加えて、
「どのルールが」、「全体の結果どうなのか」 がわかるのがとてもいいですね!
セキュリティインシデント対応の一時対応の速度が爆あがり💨
さっきのXSSのログを改めて見てみる
ルール発動ログ:通常の <script> タグ検知
Rule ID : 941100
Message : XSS Filter - Category 1: Script Tag Vector
Matched : <script>alert(1)</script>
Severity : CRITICAL
Rule File : REQUEST-941-APPLICATION-ATTACK-XSS.conf
Line : 82
Tags : [attack-xss], [OWASP_CRS], [paranoia-level/1]
内容:最も典型的な XSS 攻撃文字列を検知(JavaScriptのscriptタグ)
最終評価ルール(アノマリースコア判定)
Rule ID : 949110
Message : Inbound Anomaly Score Exceeded (Total Score: 18)
Severity : CRITICAL
Rule File : REQUEST-949-BLOCKING-EVALUATION.conf
Line : 93
Tags : [event-correlation], [OWASP_CRS]
内容:攻撃スコアが閾値を超過 → 最終的に 403 Forbidden を返すトリガー
(これでさっきの検証結果の403になる)
追加評価(個別スコア合計)
Rule ID : 980130
Message : Inbound Anomaly Score Exceeded (Total Inbound Score: 18)
Matched : SQLi=0, XSS=15, RFI=0, LFI=0, RCE=0, PHP=0, HTTP=0, SESS=0
Rule File : RESPONSE-980-CORRELATION.conf
Line : 91
内容:ModSecurityがXSSポイントを15と評価し、遮断対象とする。
検出結果
Intervention: Yes
HTTP Status : 403
Unique ID : aAmNBUx4E3F7AbBnYakbUwAAABg
Anomaly : Triggered phase 2 (blocking)
内容:リクエストはブロック対象とされ、403が返された!
ユニークIDはアクセスログ照合に使用可能
ログまとめ
ModSecurityによって<script>alert(1)</script>
を含むXSS攻撃がクリティカル として検出され、
ルールID 941100 と 941160 によりログ記録。
アノマリースコアが 18 に達し、ルール 949110 の評価で 403 により遮断された🙌
シュゴイ.
あとがき
お疲れ様でした🫡
今回はOSSホスト型WAFのModSecurityをWEBサーバーに導入して、
簡単なXSSを防いでログを確認してみました。
コストの低さ、柔軟なルール設定、詳細なログ記録など、ModSecurityの良さが面白かったですね!アツ
案件レベルで使用できないかもしれませんが、
使用するケースに出会いたいものです! 遊びでも楽しいけど。また検証した記事書きます!
では!
Discussion