こちらの記事の続きとなります。
Torの出口ノードリストを抽出するスクリプトと、既に稼働済みの不審なIPアドレスをブロックするスクリプトを連携させます。
前提
こちらにあるように、
- Mod_Security導入済み
- エラー検知時にブロックする設定をバーチャルサイトに設定済み
となります。
また、先日の記事である、
- Tor出口ノードリストを抽出スクリプトがCron化されているものとします。
スクリプト
- negativelist.sh
#!/bin/bash
# 読み込むログのディレクトリとファイル名を変数指定
log_dir="/var/lib/redmine/log"
log_file="error.log"
# シェルスクリプトから抽出したTorの出口ノードリストを指定
tor_list_dir="/path/to/directory" # tor_list.txtのディレクトリを指定
tor_list_file="sorted_ip_addresses$(date +%Y%m%d).txt"
# 除外するIPアドレスをファイルで指定
# 自分のNWなど、偽陽性を防ぐために記載したアドレスのリストです。
exclude_ips_file="/path/to/directory/exclude_ips.txt"
# ログファイルからIPアドレスを抽出して重複を排除し、ファイルに保存します。
cd "$log_dir"
awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { print substr($0, RSTART, RLENGTH) }' "$log_file" | sort -u > "$log_dir/suspicious_ip/suspicious_ip.$(date +%Y%m%d)"
chown www-data:www-data "$log_dir/suspicious_ip/suspicious_ip.$(date +%Y%m%d)"
# 過去のIPアドレスを読み込んで重複を排除し、ファイルに保存します。
cat "$log_dir/suspicious_ip/suspicious_ip."2* | sort -u > "$log_dir/suspicious_ip_all.txt"
chown www-data:www-data "$log_dir/suspicious_ip_all.txt"
# 新たにリストに書き起こすと同時にTorの出口ノードリストを読み込んで重複を排除し、negativelist.txtに追加します。
cat "$log_dir/suspicious_ip_all.txt" "$tor_list_dir/$tor_list_file" | sort -u > /etc/apache2/sites-available/negativelist.txt
# 除外するIPアドレスをファイルから削除します。
while IFS= read -r exclude_ip; do
sed -i "/$exclude_ip/d" /etc/apache2/sites-available/negativelist.txt
done < "$exclude_ips_file"
# Apacheを再起動します。
systemctl restart apache2.service
あとはこちらをroot権限でCron登録。
設定後の動き
以下のように動きます。
- 指定のログファイルからエラーとなったIPアドレスのみを抽出します。
- 全てのIPアドレスを統合し、重複を排除してsuspicous_ip_all.txtとして抽出します。
- suspicous_ip_all.txtとtor_list_fileを統合し、negativelist.txtとして作成します。(これらのIPアドレスからのアクセスに対しては全て403を返します)
- negativelist.txtから除外IPアドレスを取り除きます。
- Webサービスを再起動します。
ひとまず、WAFとの連携ができました。