🛡️

【WEBセキュリティ】OSSのWAFで攻撃を防ぐ選択肢

に公開

まえがき

こんにちはニシパ(21)です🫡
皆さん、WAFと聞いて、何を思い浮かべますか?

AWS WAFや、セキュリティベンダーのWAFナドナド。。
運用コストの低さや、セキュリティの高さが魅力的ですよね!

ただ、要件によっては、
「コスト」「柔軟な設定」 については考える必要がありそうです。

「やっすく済ませたいけど、セキュリティも最低限考えたいなあ。」
「柔軟な設定ができるWAFはないかしら。」

ということで、

今回はOSSのWAF「Mod Securiry」について記事にしてみました!

WAFの概要を理解し、OSS WAFの特性ついて知りましょう🔥

概要

WAFとModSecurityについて解説します。

WAF(Web Application Firewall)

Webアプリケーションを狙った攻撃から、HTTPレベルで保護するセキュリティレイヤー

例えば?

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のインストール

  1. インストール(必要ならUbuntuを更新しておく)
sudo apt install libapache2-mod-security2 -y
  1. 設定ファイルをコピーして有効化
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sudo vi /etc/modsecurity/modsecurity.conf
#modsecurity.conf
-SecRuleEngine DetectionOnly
+SecRuleEngine On
  1. OWASP CRSの導入
cd /etc/modsecurity
sudo git clone https://github.com/coreruleset/coreruleset.git
  1. 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