mod_securityのホワイトリスト、ブラックリストのメモです。

■mod_securityインストールについて
http://www.kurobuti.com/blog/?p=3732
http://www.kurobuti.com/blog/?p=3766

上記2サイトの手順でインストールされていることを前提とします。

(1)許可の設定をしてみる。
ここで設定するのは以下のものとします。

ソースIPアドレスごとに許可
URIごとに許可

◎ソースIPアドレスごとに許可する方法

[root@example ~]# vi /etc/httpd/conf/mod_security.d/modsecurity_crs_10_config.conf
# White IP
SecRule REMOTE_ADDR "192.168.0.1" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"


◎URIごとに許可する方法
[root@example ~]# vi /etc/httpd/conf/mod_security.d/modsecurity_crs_10_config.conf
# White URI
SecRule REQUEST_URI "/blog/index.html" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"


この方法だと、いちいち許可するものを「SecRule hogehoge “hogehogehoge” “acction”」と書かなくちゃいけないのでめんどうです。

そこで、ホワイトリストファイルを作成してそれを読み込ませる設定を行います。

(2)ホワイトリストの設定をしてみる。
◎ソースIPアドレスごとに許可するホワイトリスト設定
[root@example ~]# vi /etc/httpd/conf/mod_security.d/modsecurity_crs_10_config.conf
# White List IP
SecRule REMOTE_ADDR "@pmFromFile /etc/httpd/conf/mod_security.d/whitelist_ip.txt" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"

この方法だと、「/etc/httpd/conf/mod_security.d/whitelist_ip.txt」にIPを記述していけばそれが全て許可されます。

「/etc/httpd/conf/mod_security.d/whitelist_ip.txt」の記述例
[root@example ~]# vi /etc/httpd/conf/mod_security.d/whitelist_ip.txt
192.168.0.1
192.168.0.2
192.168.0.3


◎URIごとに許可するホワイトリスト設定
[root@example ~]# vi /etc/httpd/conf/mod_security.d/modsecurity_crs_10_config.conf
# White List URI
SecRule REQUEST_URI "@pmFromFile /etc/httpd/conf/mod_security.d/whitelist_uri.txt" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"


「/etc/httpd/conf/mod_security.d/whitelist_uri.txt」の記述例
[root@example ~]# vi /etc/httpd/conf/mod_security.d/whitelist_uri.txt
/blog/index.html
/hogehoge/index.html


設定後は必ずapacheを再起動してください:D
[root@example ~]# service httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]


(3)ブラックリストの設定をしてみる。
mod_securityのbase_ruleですが、てっきりXSSやSQL Injectionとかにひかかった場合はアクセス拒否になっているものかと思っていたのですがデフォルトではそうなっていないみたいですね。
※)ルールは、2.1.2

検知しても拒否してないというメッセージがログに出ていたのでブラックリストを作成してみました。
# もちろん、「SecRuleEngine On」の状態ですXD

さて、検知した対象のファイル一つ一つにいちいちアクセス拒否設定するのは大変だったので、あからさまにこれは攻撃だろうというものについてはidで拒否することにしました。

idとは、各ルールに付与されている番号です。Audit.logには検知した文字列がどのファイルで指定されているものか(ファイル名)とidが出力されます。そのidを利用します。

◎ブラックリストの設定
[root@example ~]# vi /etc/httpd/conf/mod_security.d/modsecurity_crs_10_config.conf
# Black List
SecRuleUpdateActionById "000001" "phase:2,deny,log,auditlog,status:406"
「”000001″」がidの番号です。
残念ながら、「SecRuleUpdateActionById」ではホワイトリストのようにファイルを指定してそのファイルの中にidを書いていく方法はうまくいきませんでした。
# 俺のやり方が間違っている?

なので、id指定の場合は「SecRuleUpdateActionById」を一つずつかかなくちゃいけないっぽいです。

ちなみに、「SecRule REMOTE_ADDR」とかだと問題ない。

もう少しうまいやり方があるかもしれないが、しばらくはこのやり方でやっていってしまいそう。。。。

参考文献
1. http://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Reference
_Manual


5月 3, 2011 at 10:08 pm by 黒ぶちメガネ
Category: Apache, Linux, mod_security