2007/12/5 水曜日
hosts.denyでアクセス制限
トマト@ネットワーク云々担当です。
サーバを運用していると、攻撃や、不正アクセスを受ける事はよく有ります。
今回は、SSHへの連続的な攻撃を、サーバで判断し、自動でアクセスを拒否するスクリプトを紹介します。
攻撃の判断基準は、存在しないユーザでのSSHアクセスと、存在するユーザ名での、パスワード間違いによるSSHアクセスの2種類です。
スクリプトの内容的には、crontabを使用し、一定間隔でログファイルをチェック、指定回数以上の攻撃を検知すると、hosts.denyファイルにて、該当IPからのSSH接続を拒否すると言う物です。
その他、メールによる報告機能も付いています。
ssh-check.sh
CODE:
-
#!/bin/sh
-
-
#------------------------------------------------------------------------------#
-
# Date :2007/10/18
-
# Version :0.9
-
# Copyright:KeyPoint,Inc.
-
# Author :tomato
-
#------------------------------------------------------------------------------#
-
-
-
#------------------------------------------------------------------------------#
-
# 環境設定
-
#------------------------------------------------------------------------------#
-
# 攻撃判断回数(デフォルト10回以上でアクセスを拒否)
-
NG="10"
-
-
# メール送信先
-
MAIL="admin@example.com"
-
#------------------------------------------------------------------------------#
-
# メールコマンドのパス
-
MAIL_PAHT="/bin/mailx"
-
#MAIL_PAHT="/usr/bin/mailx"
-
-
# ログファイルのパス
-
LOG_PATH="/var/log/secure"
-
#LOG_PATH="/var/log/auth.log"
-
-
# HOST名の取得
-
HOST=`grep ^HOSTNAME /etc/sysconfig/network|cut -b 10-`
-
#HOST=`cat /etc/hostname`
-
#------------------------------------------------------------------------------#
-
-
-
#------------------------------------------------------------------------------#
-
# スクリプト本体
-
#------------------------------------------------------------------------------#
-
#攻撃のあったIPアドレス
-
LIST=`grep "Invalid user" $LOG_PATH|awk '{print $10}'|uniq ; grep "Failed password for" $LOG_PATH|awk '{print $11}'|uniq`
-
-
for IP in $LIST
-
do
-
#攻撃回数をカウントする
-
COUNT1=`grep "Invalid user" $LOG_PATH|grep "$IP"|wc -l`
-
COUNT2=`grep "Failed password for" $LOG_PATH|grep "$IP"|wc -l`
-
COUNT=`expr $COUNT1 + $COUNT2`
-
-
#既に登録されているか確認
-
if test `grep "$IP" /etc/hosts.deny`
-
then
-
echo "登録済み:"$IP
-
else
-
#攻撃回数のチェック
-
if [ $COUNT -ge $NG ]
-
then
-
#回数オーバーで、hosts.denyに追記する
-
echo "回数オーバー:"$COUNT "回 ["$IP"]"
-
echo "sshd:"$IP>> /etc/hosts.deny
-
-
#メールで報告
-
echo "Server:"$HOST "["$COUNT"]times SSH attack from ["$IP"] Add [hosts.deny] File"|$MAIL_PAHT -s "[SSH Attack Alert]:$HOST" $MAIL
-
fi
-
fi
-
done
-
#------------------------------------------------------------------------------#
スクリプトの作成と、実行権限の付加
# vim ssh-check.sh # chmod +x ssh-check.sh
※「環境設定」部分は、環境に合わせて設定して下さい
メールコマンドのパス(MAIL_PAHT)の調べ方
# which mail /bin/mail
# which mailx /usr/bin/mailx
スクリプトの実行例
# ./ssh-check.sh 回数オーバー:100 回 [111.111.111.111] 回数オーバー:200 回 [222.222.222.222]
※攻撃回数が、指定回数を越えた場合に、「hosts.deny」ファイルに、アクセス制限情報が追記されます
警告メールのサンプル
件名:[SSH Attack Alert]:www.example.com 本文:Server:www.example.com [100]times SSH attack from [111.111.111.111] Add [hosts.deny] File
crontabの設定例(5分間隔の場合)
*/5 * * * * root /root/bin/ssh-check.sh > /dev/null 2>&1
※「/etc/hosts.deny」ファイルを編集するので、root権限で実行します
これで、該当IPアドレスからの接続は拒否出来ます。
TrackBack URI : http://www.key-p.com/blog/staff/archives/94/trackback/

はじめまして。hosts.denyでアクセス制限を試してみたんですが、
以下のようなエラーが吐かれてしまいます。
Debianbox:~/bin# /bin/sh ./ssh-check.sh
./ssh-check.sh: line 57: syntax error near unexpected token `&’
./ssh-check.sh: line 57: ` echo “sshd:”$IP>> /etc/hosts.deny’
構文がおかしいようなのですが、どのあたりがおかしいんでしょうか?
ご教示願います。
コメント by shusaku — 2008/7/28 月曜日 @ 3:11:57
shusakuさん
上記をコピペしただけでは、一部、文字が変わってしまうところがあるかもしれません。
最新版を公開しますので、ご利用頂ければと思います。(UTF-8/環境設定をお忘れなく)
https://www.webfile.jp/dl.php?i=377450&s=7c8e1f2b17bef2662a2d
また、上記でも、エラー等が出る場合、どの行に問題があるのかを調査してみて下さい。
怪しそうな行を、#(コメントアウト)して、おかしな所を探してみて下さいませ。
「line 57」とありますが、絶対に、57行目がエラーになっているとは限りません。
前後の行に、問題があるかもしれませんので。
コメント by トマト — 2008/7/28 月曜日 @ 3:40:53
真夜中のご返信ありがとうございます。
どうも >> の部分が文字化けしていたようでおっかしなことになってたみたいです。
>>みたいになってましたからw
この部分を消したらとりあえず動きそうな感じだったんですが、
echo “sshd:”$IP>> /etc/hosts.deny’
が
echo “sshd:”$IP /etc/hosts.deny’
にしてしまったんで空表示だけしてたみたいですw
おかげさまで無事に動作確認ができましたw
ありがとうございました。
勉強にもなりました。また機会があれば勉強させてください。
では、お仕事頑張ってください。
コメント by shusaku — 2008/7/28 月曜日 @ 5:07:19
最新バージョン@1.0.0
https://www.webfile.jp/dl.php?i=388544&s=8a65299935320347ad61
コメント by トマト — 2008/8/22 金曜日 @ 16:35:07
最新バージョン@1.0.1
https://www.webfile.jp/dl.php?i=444346&s=7ca44a4dafd4141b6d51
コメント by トマト — 2008/12/9 火曜日 @ 15:22:37
こちらが最新バージョン@1.0.1
https://www.webfile.jp/dl.php?i=444462&s=fada852559668e5f24c9
コメント by トマト — 2008/12/9 火曜日 @ 18:44:39