こんにちは、tahara です。
Web Application Firewall の定番(?) ModSecurity を nginx + passenger でセットアップしてみました。
ModSecurity をコンパイル
cd /home/foo/src wget http://www.modsecurity.org/tarball/2.7.3/modsecurity-apache_2.7.3.tar.gz tar xvf modsecurity-apache_2.7.3.tar.gz cd modsecurity-apache_2.7.3 ./configure --enable-standalone-module make
nginx のソースを準備
cd /home/foo/src wget http://nginx.org/download/nginx-1.2.8.tar.gz tar xvf nginx-1.2.8.tar.gz
passenger で nginx + ModSecurity をコンパイル
passenger-install-nginx-module Enter your choice (1 or 2) or press Ctrl-C to abort: 2 Please specify the directory: /home/foo/src/nginx-1.2.8 Extra arguments to pass to configure script: --add-module=/home/foo/src/modsecurity-apache_2.7.3/nginx/modsecurity
—add-module=/home/foo/src/modsecurity-apache_2.7.3/nginx/modsecurity がポイントです。
設定ファイルの準備ですが、ModSecurity を nginx で使う場合は Apache の場合と違い、
設定ファイルを1ファイルに結合してやる必要があります。
ルールは https://github.com/SpiderLabs/owasp-modsecurity-crs から git clone して持ってきます。
あと *.data
ファイルは modsecurity.conf と同じディレクトリに置いておきます。
cd /home/foo/src git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git mkdir /opt/nginx/conf/modsecurity cat /home/foo/src/modsecurity-apache_2.7.3/modsecurity.conf-recommended \ /home/foo/src/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example \ /home/foo/src/owasp-modsecurity-crs/base_rules/*.conf \ > /opt/nginx/conf/modsecurity/modsecurity.conf cp /home/foo/src/owasp-modsecurity-crs/base_rules/*.data /opt/nginx/conf/modsecurity
nginx の設定です。
server { listen 80; root /var/www/example/public; server_name foo.example.com; #### ModSecurity # ModSecurity を使う時は passenger_buffers を指定しないと、レスポンスが返らない。 passenger_buffers 1024 1024k; location / { ModSecurityEnabled on; ModSecurityConfig modsecurity/modsecurity.conf; passenger_enabled on; rails_env production; } }
十分な大きさの passenger_buffers を指定してやらないと、うまくレスポンスが返りません。 どのくらいの大きさがいいのかは調査中です。
passenger を使わない場合はプロキシーとして次のように設定します。 この場合も proxy_buffers の指定が必要なようです。
location / { ModSecurityEnabled on; ModSecurityConfig modsecurity/modsecurity.conf; proxy_pass http://localhost:40080; proxy_buffers 80 8k; }
だいたいこんな感じでできあがりだと思います。
ModSecurity の nginx はまだ RC だし、passenger と同時使用してもいいものかも不明です。 とりあえず、動くようですが、ときどき nginx のプロセスが CPU 100% 持っていってしまいます。
/opt/nginx/conf/modsecurity/modsecurity.conf の中もちゃんと精査する必要もあります。
ひまを見付けてつめていきたいと思います。
最後に、ひき続きエンジニアを募集していますので、よろしくお願いします!