CentOS 7
 

mod_security を利用する
2015/10/27
 
mod_security モジュールを有効にして、Web Application Firewall (WAF) を設定します。
[1] mod_security をインストールします。
[root@www ~]#
yum -y install mod_security
[2] インストールすると mod_security がブロックモードが有効な状態で設定ファイルが配置されます。 最低限のルールはデフォルトで記述されていますが、ルールの追加は「IncludeOptional」で指定されたディレクトリ配下に配置した conf ファイルで可能な設定となっています。
[root@www ~]#
cat /etc/httpd/conf.d/mod_security.conf

<IfModule mod_security2.c>
    # ModSecurity Core Rules Set configuration
        IncludeOptional modsecurity.d/*.conf
        IncludeOptional modsecurity.d/activated_rules/*.conf

    # Default recommended configuration
    SecRuleEngine On
    SecRequestBodyAccess On
    SecRule REQUEST_HEADERS:Content-Type "text/xml" \
         "id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML"

.....
.....

# 設定ルールにマッチした際に、ブロックせずにロギングのみ行う検知モードに
# 設定する場合は「SecRuleEngine DetectionOnly」を指定する
[3]
セキュリティルールの書式は以下のようになっています。
    ⇒ SecRule VARIABLES OPERATOR [ACTIONS]
各パラメータの種類は非常に多いため、詳細は以下の公式ドキュメントを参照ください。
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual
[4] セキュリティルールの設定例を以下に示します。
[root@www ~]#
vi /etc/httpd/modsecurity.d/activated_rules/rules-01.conf
# ルールにマッチした時のデフォルトアクションを定義

# レスポンスボディフェーズで処理を停止しログを記録して 406 を返す

SecDefaultAction "phase:2,deny,log,status:406"
# リクエスト URI に「etc/passwd」が含まれる

SecRule REQUEST_URI "etc/passwd" "id:'500001'"
# リクエスト URI に「../」が含まれる

SecRule REQUEST_URI "\.\./" "id:'500002'"
# 引数に「<SCRIPT」(小文字含む) が含まれる

SecRule ARGS "<[Ss][Cc][Rr][Ii][Pp][Tt]" "id:'500003'"
# 引数に「SELECT FROM」(小文字含む) が含まれる

SecRule ARGS "[Ss][Ee][Ll][Ee][Cc][Tt][[:space:]]+[Ff][Rr][Oo][Mm]" "id:'500004'"
[root@www ~]#
systemctl restart httpd
[5] 設定した文字列を含めてアクセスし、動作確認してください。
[6] mod_security のログは以下の場所に保管されています。パターンマッチした場合は以下のようなログが記録されます。
[root@www ~]#
cat /var/log/httpd/modsec_audit.log

--75d36531-A--
[28/Oct/2015:13:52:52 +0900] VjBUpAKZ9yAFgyhKj8zyyAAAAAE 10.0.0.108 53545 10.0.0.31 80
--75d36531-B--
GET /?../../etc/passwd HTTP/1.1
Host: www.srv.world
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

--75d36531-F--
HTTP/1.1 406 Not Acceptable
Content-Length: 251
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

--75d36531-E--

--75d36531-H--
Message: Access denied with code 406 (phase 2). Pattern match "etc/passwd" 
at REQUEST_URI. [file "/etc/httpd/modsecurity.d/activated_rules/rules-01.conf"] [line "3"] [id "500001"]
Action: Intercepted (phase 2)
Stopwatch: 1446007972909468 1333 (- - -)
Stopwatch2: 1446007972909468 1333; combined=418, p1=395, p2=17, p3=0, p4=0, p5=6, sr=116, sw=0, l=0, gc=0
Response-Body-Transformed: Dechunked
Producer: ModSecurity for Apache/2.7.3 (http://www.modsecurity.org/); OWASP_CRS/2.2.6.
Server: Apache/2.4.6 (CentOS)
Engine-Mode: "ENABLED"

--75d36531-Z--
[7] ちなみに、自身でルールを作成しなくとも、一般的なルール設定は別途パッケージが用意されています。 ただ、全て適用すると必要なリクエストまで拒否してしまう可能性もあるため、自サイトに合わせたカスタマイズが必要かもしれません。
[root@www ~]#
yum -y install mod_security_crs
# ルールの実態は以下に配置される

# /etc/httpd/modsecurity.d/activated_rules 配下には下記ファイルへのリンクが配置される

[root@www ~]#
ll /usr/lib/modsecurity.d/base_rules

total 332
-rw-r--r-- 1 root root  1980 Jun 10  2014 modsecurity_35_bad_robots.data
-rw-r--r-- 1 root root   386 Jun 10  2014 modsecurity_35_scanners.data
-rw-r--r-- 1 root root  3928 Jun 10  2014 modsecurity_40_generic_attacks.data
-rw-r--r-- 1 root root  2610 Jun 10  2014 modsecurity_41_sql_injection_attacks.data
-rw-r--r-- 1 root root  2224 Jun 10  2014 modsecurity_50_outbound.data
-rw-r--r-- 1 root root 56714 Jun 10  2014 modsecurity_50_outbound_malware.data
-rw-r--r-- 1 root root 22861 Jun 10  2014 modsecurity_crs_20_protocol_violations.conf
-rw-r--r-- 1 root root  6915 Jun 10  2014 modsecurity_crs_21_protocol_anomalies.conf
-rw-r--r-- 1 root root  3792 Jun 10  2014 modsecurity_crs_23_request_limits.conf
-rw-r--r-- 1 root root  6933 Jun 10  2014 modsecurity_crs_30_http_policy.conf
-rw-r--r-- 1 root root  5394 Jun 10  2014 modsecurity_crs_35_bad_robots.conf
-rw-r--r-- 1 root root 19157 Jun 10  2014 modsecurity_crs_40_generic_attacks.conf
-rw-r--r-- 1 root root 43961 Jun 10  2014 modsecurity_crs_41_sql_injection_attacks.conf
-rw-r--r-- 1 root root 87470 Jun 10  2014 modsecurity_crs_41_xss_attacks.conf
-rw-r--r-- 1 root root  1795 Jun 10  2014 modsecurity_crs_42_tight_security.conf
-rw-r--r-- 1 root root  3660 Jun 10  2014 modsecurity_crs_45_trojans.conf
-rw-r--r-- 1 root root  2253 Jun 10  2014 modsecurity_crs_47_common_exceptions.conf
-rw-r--r-- 1 root root  2787 Jun 10  2014 modsecurity_crs_48_local_exceptions.conf.example
-rw-r--r-- 1 root root  1835 Jun 10  2014 modsecurity_crs_49_inbound_blocking.conf
-rw-r--r-- 1 root root 22314 Jun 10  2014 modsecurity_crs_50_outbound.conf
-rw-r--r-- 1 root root  1448 Jun 10  2014 modsecurity_crs_59_outbound_blocking.conf
-rw-r--r-- 1 root root  2674 Jun 10  2014 modsecurity_crs_60_correlation.conf
 
Tweet