rewritemap.pl - Apache の RewriteMap や CustomLog を使って BlockCIDR を呼び出すプログラム
RewriteLock /path/to/rewritemap.lock
RewriteMap firewall-map prg:/path/to/rewritemap.pl
RewriteCond おかしなアクセスを検知する条件1 [OR]
RewriteCond おかしなアクセスを検知する条件2 [OR]
:
RewriteCond おかしなアクセスを検知する条件n
RewriteRule ^.*$ ${firewall-map:%{REMOTE_ADDR}\ rewritemap} [R=301,L]
or
LogFormat "%a customlog" firewall_log
SetEnvIf おかしなアクセスを検知する条件1 firewall
SetEnvIf おかしなアクセスを検知する条件2 firewall
:
SetEnvIf おかしなアクセスを検知する条件n firewall
CustomLog "|/path/to/rewritemap.pl" firewall_log env=firewall
rewritemap.pl は、Apache HTTP サーバの RewriteMap または CustomLog を利用して BlockCIDR を呼び出す外部プログラムです。
rewritemap.pl , BlockCIDR.pm , BlockCIDR.pm の設定ファイルを適当なディレクトリに配置してください。
BlockCIDR.pm はできれば perl のインクルードパスが通っている所(/usr/local/lib/site_perlなど)に配置してください。
perl の標準のインクルードパスを調べるには perl -e 'use no-module;' という感じで存在しないモジュールを use してみて、エラーメッセージを見れば確認できます。
rewritemap.pl と BlockCIDR.pm の設定ファイルはどこでもいいですが、同じディレクトリに配置した方が分かりやすいと思います。 rewritemap.pl には実行権限を与えてください。(chmod +x rewritemap.pl)
設定ファイルで BlockCIDR の設定を行ってください。 詳細は BlockCIDR のドキュメントを参照してください。 Linux と iptables を利用するサンプルとして config-rewritemap.sample を用意していますので参考にしてください。
設定ファイルの script で指定した位置にパケットフィルタルール追加用のスクリプトを配置し、実行権限を与えてください。(chmod +x firewall_script) Linux と iptables を利用するサンプルとして firewall_script.sample を用意していますので参考にしてください。
rewritemap.pl を以下のように修正してください。
BlockCIDR.pm を perl の標準インクルードパス以外の場所に配置した場合は、
1行目に BlockCIDR.pm を配置したディレクトリの情報を追加します。
例えば /usr/local/etc に配置した場合は以下のようにします。
#! /usr/bin/perl -I/usr/local/etc
$config_file に設定ファイルのフルパスを指定してください。
RewriteMap で利用する場合は、 $destination に誘導先のURLを指定してください。
以下、firewall_script.sample を利用していることを前提に、 動作確認の手順を説明します。
まず最初に、Apache の本体(最初に起動されるプロセスのこと。リクエストを受け付けるためにたくさん起動される子プロセスではない)がどのユーザで動作しているかを確認してください。 root で動作していれば rewritemap.pl も root で動作するので、特に問題はありません。 root 以外の場合は確認や設定にいくらか追加の作業が発生します。
root 権限で /path/to/rewritemap.pl を実行し(/path/toは設置したディレクトリに置き換えてください)、
「適当なIPアドレス customlog」と入力します。
正しく動作すれば、scriptで指定したスクリプトが実行されて挿入されるルールが表示されます。
また file で指定したファイルにルールが追記されます。
customlog の代わりに rewritemap と入力した場合は、 さらに $destination で指定した URL が表示されます。
問題がある場合はメッセージが表示されるので、それを元に設定や環境を修正し、 何も表示されなくなるようにしてください。
Apache 本体が root 以外で動作している場合は以下のように実行します。
su (Apacheプロセスのユーザ) -c /path/to/rewritemap.pl
firewall_script の先頭の E=echo を E="/usr/bin/logger --" に変更します。
(loggerのフルパスは確認してください)
Apache の設定に RewriteMap または CustomLog のルールを追加し、 条件にマッチしたアクセスがあった場合に rewritemap.pl にデータが渡されるようにします。
apachectl configtest などで Apache の設定が正しいことを確認し、
apachectl graceful などで設定を反映させます。
Apache が rewritemap.pl を起動していることを ps auxw | grep rewritemap.pl などで確認してください。
パケットフィルタのルール追加に root 権限が必要だが、Apache 本体が root 以外で動作している場合は、root 権限で script_file を実行するための設定をしてください。 sudo を利用する場合は以下の設定が必要です。
script_format の先頭に /usr/bin/sudo 等と sudo のフルパスを追加してください。
/etc/sudoersに以下のような設定を追加してください。 (www-dataは自分の環境に合わせてください)
www-data ALL = (root) NOPASSWD: /path/to/firewall_script
RewriteMap や CustomLog で設定した条件に合うアクセスを行い、 IPアドレス情報が rewritemap.pl に渡されて処理されることを確認してください。
パケットフィルタにルールを挿入するコマンド列が syslog に記録されていること。
file で指定したファイルにルールが追加されていること。
ここまで確認できたら firewall_script の「E=」の行をコメントアウトし、 実際にパケットフィルタのルールが挿入されるようにします。
HIRAMOTO Kouji (http://flatray.com/)
あったら報告していただけると嬉しいです。
著作権は主張します。
Copyright 2007, HIRAMOTO Kouji. All Rights Reserved.
再配布や、コードやアルゴリズムなどの流用などは自由に行っていただいて構いませんし、特に連絡もいりません。 (でも連絡をいただけると多分喜びます :-)
しかし、丸々パクって自分の著作であると主張したりというような 恥ずかしい行為だけはご遠慮ください。
このプログラムは無保証です。 これを使用した如何なる結果についても当方では保証しませんし、責任を持ちません。