久しぶりに最近ネットセキュリティについて触れることが多くなり、 iptables だの chkrootkit だの snort だの tripwire だの nessus だのと色々いじってる。しかも結構楽しい。
今後のブログネタはしばらくこの線で行こうかな。
その第一弾ってことで mod_security のインストールから設定までのメモ。
modsecurity はフリーの Web アプリケーションファイアーウォールで、 Apache のモジュールとしてインストールする。
Apache のリバースプロクシにインストールしてもいいし、 Web サーバと共存させて動作させてもいいっぽい。
とりあえず今回は Web サーバと共存の形で CentOS 4 にパッケージでインストールした。あとで CentOS 5 にもソースからインストールする予定。
環境
とりあえずソースからインストールは面倒なので、パッケージで全部やる方法でやってみた。
yum レポジトリを構築してくれてる人がいるんだけど、どうも httpd も入れ替えないとだめらしく、うちの環境だと subversion の依存関係でエラーが出て入れられないので、以下から RPM を落として入れた。
他に libxml2 と lua のインストールが必要。 libxml2 は centOS が管理してるので、 yum でインストール。 lua は rpmforge にあるので、 yum レポジトリに追加しておけば yum でインストール可能。 rpmforge の yum レポジトリの追加方法は CentOS 5 で DAG(rpmforge) の yum repository 追加を参考。
# yum install libxml2 lua # rpm -ivh modsecurity-apache2-2.1.6-1.i386.rpm
次に mod_security が有効になるように apache を設定する。 httpd.conf に libxml2 と mod_unique をロードするように以下の設定を追加する。
# vi /etc/httpd/conf/httpd.conf
LoadFile /usr/lib/libxml2.so LoadModule unique_id_module modules/mod_unique_id.so
次に modsecurity.conf の先頭に modsecurity をロードするように設定。
# vi /etc/httpd/conf.d/subversion.conf
LoadModule security2_module modules/mod_security2.so
そして apache を再起動。
さっそくうまく apache に組み込まれてるかテストしてみる。コアルールファイルは /etc/httpd/conf.d/modsecurity2/ にインストールされている。
とりあえずルールはちょっと複雑っぽくてざっと見てすぐ使いこなせるって感じではなかったので、とりあえずきちんとログを書き出すかだけテスト。 telnet から ルールに引っかかる http リクエストを投げてみる。
$ telnet blog.enjoitech.jp 80 GET / HTTP/1.1 Host: blog.enjoitech.jp Content-Length: abc
で、書き出されたログが以下。
# vi /var/log/httpd/modsec_audit.log
[12/May/2008:04:25:41 +0900] ZQTmrH8AAAEAAB04YG0AAAAH xxx.xx.xxx.xxx 60719 yyy.yyy.y.yyy zz --55391775-B-- GET / HTTP/1.1 Host: blog.enjoitech.jp Content-Length: abc --55391775-F-- HTTP/1.1 413 Request Entity Too Large --55391775-H-- Message: Error reading request body: HTTP Error 413 - Request entity too large. (Most likely.) Message: Access denied with code 403 (phase 2). Match of "eq 0" against "REQBODY_PROCESSOR_ERROR" required. [msg "Failed to parse request body."] [severity "CRITICAL"] Apache-Error: [file "http_protocol.c"] [line 787] [level 3] Invalid Content-Length Action: Intercepted (phase 2) Stopwatch: 1210533932230316 9377282 (9376942 9377049 -) Producer: ModSecurity v2.1.6 (Apache 2.x) Server: Apache --55391775-Z--
うまくいってるっぽい。