SSHのログを監視して怪しいIPを止める

/var/log/secure(または/var/log/messages)をみると適当な名前でログインを試みられている形跡があるので、自動で監視してアクセスを禁止にする.

必要なもの

Swatchのインストール

Perl5はインストールしておく.
perlで必要なもの それぞれはtar.gzを解凍したフォルダで
perl Makefile.pl
make
make test
make install
    
でインストールする.swatch本体も同様にインストールする.

swatchの設定

http://www.atmarkit.co.jp/flinux/rensai/root04/root04b.htmlを参考に、
------------------- swatchrc ----------------
watchfor   /Failed/
        echo 
        exec /root/sshstop.sh
        mail=xxx@yyy.jp,subject=[swatch]sshd_Failed
--------------------------------------------
とした.これを適当なファイル(/etc/swatchrc)にして適当な場所に保存する. メールを送るためにpostfixを起動させておく(特に設定はいらない). exec /root/sshstop.shは後述.

IPtablesを書き換えてアクセスを禁止にするスクリプトを作成する

iptalbesの設定ファイルの上らへんを別のファイル(/etc/sysconfig/iptables.head)に保存しておく.
---------------iptables.head------------------
*mangle
:PREROUTING ACCEPT [28:2403]
:INPUT ACCEPT [28:2403]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [27:4374]
:POSTROUTING ACCEPT [27:4374]
COMMIT
# Completed on Tue Jan 17 23:06:18 2006
# Generated by iptables-save v1.2.10 on Tue Jan 17 23:06:18 2006
*nat
:PREROUTING ACCEPT [2:100]
:POSTROUTING ACCEPT [2:351]
:OUTPUT ACCEPT [2:351]
COMMIT
# Completed on Tue Jan 17 23:06:18 2006
# Generated by iptables-save v1.2.10 on Tue Jan 17 23:06:18 2006
*filter
:FORWARD ACCEPT [0:0]
:INPUT DROP [0:0]
:OUTPUT ACCEPT [0:0]
-------------------------------------------

スクリプト

#!/bin/sh

THRESHOLD=20
IPTABLES="/etc/sysconfig/iptables"
IPTABLES_HEAD="/etc/sysconfig/iptables.head"
DATE=`date "+%s"`
IPTABLES_TMP="/tmp/iptables.${DATE}"

cp $IPTABLES_HEAD $IPTABLES_TMP
cat /var/log/secure|grep "Failed password"|grep sshd|sed -e "s/ * / /g"|sed -e "s/invalid user //g"|cut -d" " -f11|sort|uniq -c|
while read COUNT IP
   do
   if [ $COUNT -ge $THRESHOLD ]
   then
     echo $COUNT $IP
     echo "-A INPUT -p tcp -m tcp -s $IP --dport 22 -j REJECT" >> $IPTABLES_TMP
   fi
done
echo "-A INPUT -j ACCEPT" >> $IPTABLES_TMP
echo "COMMIT" >> $IPTABLES_TMP

if ! cmp $IPTABLES $IPTABLES_TMP
then
   mv $IPTABLES_TMP $IPTABLES
   sleep 5
   ( /etc/init.d/network stop
   /etc/init.d/iptables restart
   /etc/init.d/network start )|nkf -j|
   cat - $IPTABLES|mail -s [sshstop]modified_iptables xxx@yyy.jp
else
   rm $IPTABLES_TMP
fi
-----------------------------------------------------
赤字はシステムによって変更が必要かもしれないところ. 同一IPからの失敗がTHRESHOLDの値を越えると自動的に アクセスを禁止する.これを/root/sshstop.shに保存して 実行権限をつける.

swatchの起動

swatch -c /etc/swatchrc -t /var/log/secure &
または
swatch -c /etc/swatchrc -t /var/log/messages &
で実行する(ログイン失敗のメッセージが/var/log/secureか/var/log/messagesのどちらにはいるのかよくわからない.同じシステムでも違う場合がある).起動時に有効にするには/etc/rc.localに記述する.
Last modified: Wed Jan 18 02:55:05 JST 2006