アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

ModSecurity を nginx + passenger で

こんにちは、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 の中もちゃんと精査する必要もあります。

ひまを見付けてつめていきたいと思います。

最後に、ひき続きエンジニアを募集していますので、よろしくお願いします!