dropip

Download: zip dropip.2.1.zip

Description

Webサーバーのアクセスログをスキャンして、不審なアクセス元のIPを探し出し、.htaccessに登録して今後のアクセスを拒否するツールです。
ブルートフォースアタックを有効にブロックします。

Files

dropip.py    本体スクリプト
denywords    拒否する単語を登録しておきます。
allowip      許可するIPを登録しておきます。
allowwords   許可する単語を登録しておきます。

Options

dropip.py -h または dropip.py --help で表示されます。
-s --server     apache または nginx を指定します。(apache)
-l --accesslog  スキャンするログファイルを指定します。(/var/log/httpd/access_log)
-o --outfile    出力するファイルを指定します。(./deny.conf)
-i --insertfile 出力するファイルに挿入するファイルを指定します。
-t --threshold  エラー(4xx、5xx)をカウントして拒否する閾値を指定します。(10)

Install

cron で定期的に実行することを想定しています。
適当な場所にファイル一式をコピーします。
例:
/usr/local/bin/dropip/
  +-- dropip.py
  +-- allowip
  +-- allowwords
  +-- denywords

Configration

allowip
ここに記載されたIPは無条件にアクセスを許可します。 サーバー管理者のIPなどを登録しておきます。
allowwords
ここに記載された文字列を含むアクセスは無条件に許可されます。 正規表現で記述します。(後述)
denywords
ここに記載された文字列を含むアクセスのアクセス元IPは拒否リストに登録されます。 以降、拒否リストに登録されたIPからは、すべてのアクセスを拒否します。 正規表現で記述します。(後述)

実行後に生成されるファイル

dropip.db   拒否IPを格納しているSQLite3データベース
deny.conf   .htaccess(for apache)、nginx confファイル(for nginx)
exec.log    今回の実行で拒否したIPと、日別のエラーカウントのリスト
pass.log    今回の実行で拒否されなかったアクセスログ

Execution

実際に運用する際は、次のようなバッチファイルを cron に登録すると管理が楽になります。
apache の場合
dropip.sh を作成します。
#!/bin/bash
DROPIP_PATH="/usr/local/bin/dropip"
/bin/python3 $DROPIP_PATH/dropip.py -s apache -l /var/log/httpd/access_log
cat exec.log
cp $APP_PATH/deny.conf /var/www/SITE_NAME/html/.htaccess
crontab に dropip.sh を登録します。
DROPIP_PATH=/usr/local/bin/dropip
51 * * * * /usr/bin/python3 $DROPIP_PATH/dropip.sh
nginx の場合
dropip.sh を作成します。 拒否リストを出力後、nginx をリロードする必要があります。
#!/bin/bash
DROPIP_PATH="/usr/local/bin/dropip"
/bin/python3 $DROPIP_PATH/dropip.py -s nginx -l /var/log/httpd/access_log
cat exec.log
systemctl reload nginx
crontab に dropip.sh を登録します。
DROPIP_PATH=/usr/local/bin/dropip
51 * * * * /usr/bin/python3 $DROPIP_PATH/dropip.sh
出力ファイル(deny.conf)を nginx の設定ファイルとして読み込むように設定しておきます。 例: ln -s /usr/local/bin/dropip/deny.conf /etc/nginx/conf.d/deny.conf
いずれも、exec.log を標準出力に出力して、メールで結果が届くようにしています。
pass.log を開いて、怪しいアクセスを探してください。 あるはずのないディレクトリやファイルへのアクセスはブルートフォースアタックの可能性があります。キーワードとして正規表現(後述)で denywords に追加しておきましょう。

How to

apache で wordpress が生成した .htaccess があるなど、予め設定した .htaccess がある場合は、.htaccess をリネーム(例:.htaccess.x)しておき、オプション -i で読み込むようにします。出力ファイル(deny.conf)に拒否リストを出力する前に、.htaccess.x の内容を出力します。
例: dropip.py -i .htaccess.x

予めダウンロードした海外のIPリスト(foreign_ip.conf)などがある場合は、オプション -i で読み込むことで、海外のIPリストと dropip が出力した拒否リストを一つのファイルにまとめることができます。
例: dropip.py -i foreign_ip.conf

cat コマンドを使って、dropip.py の出力ファイル(deny.conf)に設定済みのファイルを結合しても構いません。
例: cat .htaccess.x deny.conf foreign_ip.conf > .htaccess

正規表現

allowwords、denywords に記述する正規表現は、'/' 以外のメタ文字を '\' でエスケープした文字列です。
例:"GET /class.api.php を拒否する場合
denywords には、"GET /class\.api\.php を登録します。

更新履歴

ver. 2.1 2026.01.23
起動時に allowip、allowwords、denywords がなければ空のファイルを作成するようにしました。
ver. 2.0 2023.09.13
以前の php cli版を python3 で書き換えて公開しました。
Buy me a coffee