sshd への攻撃

朝,何気なくハブを見るとアクセスランプが怪しげな点滅をしていたので,サーバのログを見てみた.何か,ユーザ名とパスワードを決め打ちで ssh で侵入を試みているようだ.既に何日か前から同様の攻撃を受けていたみたいだけど….


/var/log/messages

Sep  2 07:12:52 miko sshd[22467]: Invalid user cristi from 62.109.136.119
Sep  2 07:12:55 miko sshd[22487]: Invalid user cristi from 62.109.136.119
Sep  2 07:12:57 miko sshd[22489]: Invalid user cristian from 62.109.136.119
Sep  2 07:13:00 miko sshd[22491]: Invalid user cristian from 62.109.136.119
Sep  2 07:13:02 miko sshd[22493]: Invalid user cristinel from 62.109.136.119
Sep  2 07:13:05 miko sshd[22509]: Invalid user cristinel from 62.109.136.119
Sep  2 07:13:07 miko sshd[22511]: Invalid user cristina from 62.109.136.119
Sep  2 07:13:10 miko sshd[22513]: Invalid user cristina from 62.109.136.119
Sep  2 07:13:13 miko sshd[22515]: Invalid user cris from 62.109.136.119
Sep  2 07:13:15 miko sshd[22531]: Invalid user cris from 62.109.136.119


とりあえず,対策として以下のようなスクリプトを即席で書いて,cron で 10 分おきに実行している."Invalid user 〜" のエラーを出したホストが5回連続で同じなら,そのホストを /etc/hosts.deny に放り込むもの.


invalid-user.sh

#!/bin/sh

LIMIT=5

grep 'Invalid user' /var/log/messages | tail -n $LIMIT | awk '{ print $10 }' > invalid-users
cat invalid-users | uniq > invalid-user
if [ `cat invalid-user | wc -l` -eq 1 ]; then
if [ `cat invalid-users | wc -l` -eq $LIMIT ]; then
    INVALID=`cat invalid-user`
    if [ $INVALID ]; then
        grep $INVALID /etc/hosts.deny > /dev/null
        if [ $? -eq 1 ]; then
            echo "ALL: $INVALID" >> /etc/hosts.deny
        fi
    fi
fi
fi

awk の $10 ってのは,エラーメッセージ中の IP アドレスの位置を決め打ちしている.invalid-users の行数を確かめているのは,log_rotate が /var/log/messages を一新したタイミングで運悪く hosts.deny に誤登録されることを防ぐため.もっとうまく書けないだろうか.後,cron じゃなくて,エラーメッセージが追記されるのをトリガーにこのスクリプトを呼べるといいなあ.


ちなみに,しばらく待っているとこうなる.


/var/log/messages

Sep  2 07:52:21 miko sshd[28474]: refused connect from evo-app-1.mpservers.net (::ffff:62.109.136.119)


後で似たような事例を探してみたけれど,根本的な解決方法が見つからなかったので,今もこのスクリプトを回している.