ModSecurityの動作確認例【Plesk12以降】

本ガイドでは2016年4月にリリースされた Plesk12 搭載のVPSプランのModSecurityの動作確認の例について紹介しています。
実際にエラーを出させてみて、本当にModSecurityが動いているかどうか、を確認する方法の例です。
お客様の設定環境によっても異なると思いますので、参考例として紹介いたします。

ModSecurityの設定方法についてはModSecurity【Plesk12】をご参照ください。

例1test.phpを使ったテスト(phpの引数に=http://異なるホスト名 が含まれる例)

「●●●●.ex-cloud.biz」というテスト用ドメインで検証した例を紹介します。(2016年3月検証)

【環境】

ホスト名
●●●●.ex-cloud.biz(”●●●●”は仮で、実際にDNSはアクセス可能なアルファベットのホスト名が設定されています)
プラン
VPS (Plesk12.5.30、Cent OS 6搭載)
ウェブサーバ構成
nginx有効(80番ポート)、Apache有効(7080番ポート)。Plesk12でのデフォルト状態
ウェブサーバ構成
nginx有効(80番ポート)、Apache有効(7080番ポート)。Plesk12でのデフォルト状態
ツールと設定での設定
ウェブアプリケーションファイアウォール(ModSecurity)有効化済。採用ルール:Atomic Basic ModSecurity

1.【ドメイン側で、ModSecurityが無効な状態での閲覧確認】

ドメイン:「●●●●.ex-cloud.biz」>「ウェブアプリケーションファイアウォール」については
無効な状態にしておきます。

1-1.「http://●●●●.ex-cloud.biz/test/php/test.php 」
および
1-2.「http://●●●●.ex-cloud.biz/test/php/test.php?foo=http://ex-cloud.jp 」
にアクセスします。
※「/test/php/test.php」はPleskのデフォルトで設置されているテストスクリプトです。

1-1. は一般的なアクセスなので何も問題なく表示されます。

1-1 http://my_domain_tld /test/php/test.php の実行結果

1-1 http://my_domain_tld /test/php/test.php の実行結果

1-2. についても 何事もないように1-1.と同様の結果が表示されます。

1-2.  http://my_domain_tld /test/php/test.php?foo=http://external_domain.tld  の実行結果 (ModSecurity無効時)

1-2. http://my_domain_tld /test/php/test.php?foo=http://external_domain の実行結果 (ModSecurity無効時)

1-1、1-2、いずれもウェブサーバのアクセスログには200番のステータスコードが記され、エラーとは認識しないのでエラーログは出ません。またModSecurityはこのドメインで有効でないため、ModSecurityの監査ログも更新されません。

2.【ドメイン側で、ModSecurityが有効な状態での閲覧確認】

ドメイン:「●●●●.ex-cloud.biz」>「ウェブアプリケーションファイアウォール」については
有効な状態にしておきます。
2-1.「http://●●●●.ex-cloud.biz/test/php/test.php 」
および
2-2.「http://●●●●.ex-cloud.biz/test/php/test.php?foo=http://ex-cloud.jp 」
にアクセスします。

2-1.は1-1.と同様、一般的なアクセスなので何も問題なく表示されます。

2-1 http://my_domain_tld /test/php/test.php の実行結果(ModSecurity有効時)

2-1 http://my_domain_tld /test/php/test.php の実行結果(ModSecurity有効時)

2-2.ブラウザ上にエラーメッセージが表示されます。

1-2では問題なかったものが、2-2ではエラーがでるようになっているため、制限がかかっていることがわかります。

3.【ログの確認】

サーバ側の監査ログの例(適宜改行をいれています)

--28b4dd58-A--
[30/Mar/2016:14:47:31 +0900] Vvtoc38AAAEAAASJDlUAAAAA ◎.◎.◎.◎(接続元IP) 49417 ○.○.○.○(サーバIP) 7080
--28b4dd58-B--
GET /test/php/test.php?foo=http://ex-cloud.jp HTTP/1.0
Host: ●●●●.ex-cloud.biz(my_domain_tld)
X-Real-IP: ◎.◎.◎.◎(接続元IP)
X-Forwarded-For: ◎.◎.◎.◎(接続元IP)
X-Accel-Internal: /internal-nginx-static-location
Connection: close
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Cookie: _ga=GA1.2.1266215020.1428541683; panel-web-mpcDomainsSection-hidden=1;
 sites-active-list-state-collapsed=%7B%7D; BarExpanded=True; psaContext=modules

--28b4dd58-F--
HTTP/1.1 403 Forbidden
Last-Modified: Tue, 23 Feb 2016 13:05:42 GMT
ETag: "18076a-406-52c6f9b582dcb"
Accept-Ranges: bytes
Content-Length: 1030
X-Powered-By: PleskLin
MS-Author-Via: DAV
Connection: close
Content-Type: text/html

--28b4dd58-H--
Message: Access denied with code 403 (phase 2). Match of "beginsWith %{request_headers.host}" against "TX:1" required. 
[file "/etc/httpd/conf/modsecurity.d/rules/tortix/modsec/50_plesk_basic_asl_rules.conf"] 
[line "207"] [id "340162"] [rev "294"] 
[msg "Protected by Atomicorp.com Basic Non-Realtime WAF Rules: URL detected as argument, possible RFI attempt detected"] 
[data "%TX:1,TX:1"] [severity "CRITICAL"]
Action: Intercepted (phase 2)
Stopwatch: 1459316851398209 3335 (- - -)
Stopwatch2: 1459316851398209 3335; combined=1842, p1=2, p2=1836, p3=0, p4=0, p5=4, sr=0, sw=0, l=0, gc=0
Producer: ModSecurity for Apache/2.9.0 (http://www.modsecurity.org/); 201603091934.
Server: Apache
Engine-Mode: "ENABLED"

--28b4dd58-Z--

ドメインのエラーログ上でも ModSecuriyのログには詳細が表示されます。

2-2.  http://my_domain_tld /test/php/test.php?foo=http://external_domain  の実行結果 (ModSecurity有効時)

2-2. http://my_domain_tld /test/php/test.php?foo=http://external_domainn.tld の実行結果 (ModSecurity有効時)


phpスクリプトの後に、他のサイトの( ex-cloud.jp は一例です )URLの引数を与えて
第三者サイトに誘導しようとするような 怪しいアクセスパターンですので、
ModSecurityにより アクセス禁止になります。

ドメインのエラーログの例:(適宜改行をいれています)

[Wed Mar 30 14:47:31 2016] [error] [client 接続元IPアドレス] 
ModSecurity: Access denied with code 403 (phase 2). 
Match of "beginsWith %{request_headers.host}" against "TX:1" required.
 [file "/etc/httpd/conf/modsecurity.d/rules/tortix/modsec/50_plesk_basic_asl_rules.conf"] 
[line "207"] [id "340162"] [rev "294"] 
[msg "Protected by Atomicorp.com Basic Non-Realtime WAF Rules: URL detected as argument, possible RFI attempt detected"] 
[data "%TX:1,TX:1"] [severity "CRITICAL"] [hostname "●●●●.ex-cloud.biz"] 
[uri "/test/php/test.php"] [unique_id "Vvtoc38AAAEAAASJDlUAAAAA"]