前置き
昔Xoops Cubeで作ったサイト(しばらく放置していた)が「なんか最近重たいな〜」と思って調べると、MySQL DBのコメントテーブルが大量のダミーデータで埋め尽くされていて、そいつがサーバ全体のパフォーマンスをダウンさせていた。
しかもそのコメント欄は非表示にしてあったから、気付かなかった。
(非表示にはなっていたが、投稿は受け付けられる仕組みになっていた)
とりあえずその大量のダミーデータを消し去ることで解決したが、どうせならBotとかDOSアタックを弾こう、とちょっとしたスクリプトを書いてみた。
簡易DenyHosts
ApacheのHTTPDのログを見ていると、公開していないURLに対してPOSTしてくる奴らが居る。
ipアドレスから調べると、ロシアとか中国とか・・・。
ということで、そいつらをまとめて /etc/hosts.deny
に放り込む。
Bashスクリプトは下のような感じ。
bash
# !/bin/bash
LIST=$(grep "POST /modules/x_movie/" /var/log/httpd/access_log| awk '{print$1}'| uniq)
result=$(grep "POST /phpmyadmin/scripts/setup.php" /var/log/httpd/access_log| awk '{print$1}'| uniq)
LIST="${LIST} ${result}"
for ip in $LIST; do
if [ "$(grep $ip /etc/hosts.deny)" = "" ]; then
echo "# /root/auto_deny.sh" >> /etc/hosts.deny
echo "ALL EXCEPT sshd : $ip : DENY" >> /etc/hosts.deny
fi
done
このスクリプトをcronで1分ごとに実行しておけばOK。
ALL EXCEPT sshd
にしたのは、もし自分がテストをしていてDenyされてしまったら、手も足も出ないから、sshdだけ外した。
sshdはDenyHostsでカバーしている。
簡易的だけど効果テキメン!