CentOS 7 に Apache 対応版の ModSecurity 2.9 をインストールする手順を下記に示します。
Shell
# yum install -y httpd
# yum install -y epel-release
# yum install -y mod_security mod_security_crs
# systemctl enable httpd
# systemctl start httpd
下記の様な簡単なフォームから 「';」 を入力して送信してください。SQLインジェクション の疑いがあるとして、403 Forbidden エラーとなればテストは成功です。
HTML
<form method="POST" action="test_page.html">
<input type="text" name="data">
<button>OK</button>
</form>
監査ログは下記に記録されます。
- /var/log/httpd/modsec_audit.log
/var/log/httpd/modsec_audit.log
--bd796373-A--
[12/Apr/2020:02:22:13 +0000] XpJ7VZPq2O@DCdEaiF0OawAAAAM 169.254.127.84 53499 172.17.0.2 80
--bd796373-B--
POST /index.html HTTP/1.1
Host: www.example.com
Connection: keep-alive
Content-Length: 11
Cache-Control: max-age=0
Origin: http://www.example.com
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://www.example.com/
Accept-Encoding: gzip, deflate
Accept-Language: ja,en-US;q=0.9,en;q=0.8
--bd796373-C--
data=%27%3B
--bd796373-F--
HTTP/1.1 403 Forbidden
Content-Length: 212
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
--bd796373-E--
--bd796373-H--
Message: Access denied with code 403 (phase 2). Pattern match "(^[\"'`\xc2\xb4\xe2\x80\x99\xe2\x80\x98;]+|[\"'`\xc2\xb4\xe2\x80\x99\xe2\x80\x98;]+$)" at ARGS:data. [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "64"] [id "981318"] [rev "2"] [msg "SQL Injection Attack: Common Injection Testing Detected"] [data "Matched Data: '; found within ARGS:data: ';"] [severity "CRITICAL"] [ver "OWASP_CRS/2.2.9"] [maturity "9"] [accuracy "8"] [tag "OWASP_CRS/WEB_ATTACK/SQL_INJECTION"] [tag "WASCTC/WASC-19"] [tag "OWASP_TOP_10/A1"] [tag "OWASP_AppSensor/CIE1"] [tag "PCI/6.5.2"]
Apache-Error: [file "apache2_util.c"] [line 271] [level 3] [client 169.254.127.84] ModSecurity: Access denied with code 403 (phase 2). Pattern match "(^[\\\\"'`\\\\xc2\\\\xb4\\\\xe2\\\\x80\\\\x99\\\\xe2\\\\x80\\\\x98;]+|[\\\\"'`\\\\xc2\\\\xb4\\\\xe2\\\\x80\\\\x99\\\\xe2\\\\x80\\\\x98;]+$)" at ARGS:data. [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "64"] [id "981318"] [rev "2"] [msg "SQL Injection Attack: Common Injection Testing Detected"] [data "Matched Data: '; found within ARGS:data: ';"] [severity "CRITICAL"] [ver "OWASP_CRS/2.2.9"] [maturity "9"] [accuracy "8"] [tag "OWASP_CRS/WEB_ATTACK/SQL_INJECTION"] [tag "WASCTC/WASC-19"] [tag "OWASP_TOP_10/A1"] [tag "OWASP_AppSensor/CIE1"] [tag "PCI/6.5.2"] [hostname "www.example.com"] [uri "/index.html"] [unique_id "XpJ7VZPq2O@DCdEaiF0OawAAAAM"]
Action: Intercepted (phase 2)
Stopwatch: 1586658133894961 2946 (- - -)
Stopwatch2: 1586658133894961 2946; combined=1662, p1=850, p2=732, p3=0, p4=0, p5=79, sr=76, sw=1, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.9.2 (http://www.modsecurity.org/); OWASP_CRS/2.2.9.
Server: Apache/2.4.6 (CentOS)
Engine-Mode: "ENABLED"
--bd796373-Z--
監査ログは、ひとつのトランザクションに対して A~Z のセクションが記録されます。SecAuditLogParts でどのセクションをロギングするかを制御できます。
- Aセクション
- 監査ログのヘッダ情報。発生時刻や接続元IPアドレス情報などを含みます。
- Bセクション
- リクエストヘッダ。
- Cセクション
- リクエストボディ。
- Dセクション
- 中間的なレスポンスヘッダ。ModSecurity によって変更される前のレスポンスヘッダだと思いますが、未実装です。
- Eセクション
- 中間的なレスポンスボディ。ModSecurity によって変更される前のレスポンスボディだと思いますが、未実装です。
- Fセクション
- 最終的なレスポンスヘッダ。
- Gセクション
- 最終的なレスポンスボディ。未実装。
- Hセクション
- 監査の要約情報。id にはルールID、msg にはルール名、severity には重要度が記録されます。
- Iセクション
- リクエストボディ。Cセクションとほぼ同様ですが、アップロードファイルの中身をロギングしない点が異なります。ただ、現状の実装では、C を指定しても、I を指定しても、ファイルの中身をロギングしない Cセクションが記録されるようです。
- Jセクション
- multipart/form-data で送信されるアップロードファイルに関する情報。
- Kセクション
- 監査でマッチしたルール情報。
- Zセクション
- ひとつのトランザクションに関する監査ログの終了を示す。