以下のスクリプトを修正しました。
このスクリプトの主な動き
- Mod_Securityが検知したエラーログからIPアドレスのみを抜き出す。
- 重複を排除した上でsuscpicious_ip.YYYYMMDD形式で保存。
- 全てのsuscpicious_ip.YYYYMMDDを統合する。
- ここからnegativelist.txtを作成する。
- negativelist.txtの中に疑陽性(自身のアクセス元)のIPを排除する。
- Webサービスを再起動する。
そうして、「一度でもMod_Securityが疑わしいと検知すれば、次回以降のアクセスを許さない」という、言わば“ONE OUTS”システムを採用しています。
この可読性を高めました。
スクリプトが動く前提
- ApacheとMod_Securityを運用している。
- 以下のように、「negativelist.txt」に記録されたIP全てをブロックするようにしている。
apacheバーチャルサイト設定の抜粋
# Mod Security
SecRuleEngine On
## ModSecurity有効化
SecRequestBodyInMemoryLimit 524288000
SecRequestBodyLimit 524288000
## ファイルのアップロードをできるようにします。
# ネガティブリスト
SecRule REMOTE_ADDR "@pmFromFile negativelist.txt" "phase:1,id:2,deny,msg:'Negativelisted IP address'"
修正したスクリプト
※ 教義・信仰に沿ったエディタで記載します。
- negativelist.sh
#!/bin/bash
# このシェルスクリプトは、変数で定義したエラーログからIPアドレスを抽出し、
# suspicious_ipディレクトリに保存し、その後、特定のIPアドレスを削除して
# /etc/apache2/sites-available/negativelist.txtに書き込むものです。
# 読み込むログのディレクトリとファイル名を変数指定
log_dir="/var/lib/redmine/log"
log_file="error.log"
# 除外するIPアドレスをファイルで指定
exclude_ips_file="/path/to/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 | uniq > "$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 | uniq > "$log_dir/suspicious_ip_all.txt"
chown www-data:www-data "$log_dir/suspicious_ip_all.txt"
# 新たにリストに書き起こす
cat "$log_dir/suspicious_ip_all.txt" > /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
- 除外するIPアドレスリスト
※ 教義・信仰に沿ったエディタで作成します。
- exclude_ips.txt 記載例
192.168.0.1
172.28.0.1
# 一行ずつ記載
記載後の設定
- スクリプトの所有者変更
sudo chown root:root negativelist.sh
- スクリプトの実行権付与
sudo chmod 744 negativelist.sh
- cron登録
sudo crontab -e -u root
- cron内容
0 6 * * * /home/manualmaton/bin/negativelist.sh
これによって、スクリプトを変数化。他のサーバへの転用を行いやすくしました。