開発日誌

2007/12/5 水曜日

hosts.denyでアクセス制限

Filed under: お勧め — トマト @ 15:30:20

トマト@ネットワーク云々担当です。

サーバを運用していると、攻撃や、不正アクセスを受ける事はよく有ります。
今回は、SSHへの連続的な攻撃を、サーバで判断し、自動でアクセスを拒否するスクリプトを紹介します。

攻撃の判断基準は、存在しないユーザでのSSHアクセスと、存在するユーザ名での、パスワード間違いによるSSHアクセスの2種類です。

スクリプトの内容的には、crontabを使用し、一定間隔でログファイルをチェック、指定回数以上の攻撃を検知すると、hosts.denyファイルにて、該当IPからのSSH接続を拒否すると言う物です。
その他、メールによる報告機能も付いています。

ssh-check.sh

CODE:
  1. #!/bin/sh
  2.  
  3.  #------------------------------------------------------------------------------#
  4.  # Date     :2007/10/18
  5.  # Version  :0.9
  6.  # Copyright:KeyPoint,Inc.
  7.  # Author   :tomato
  8.  #------------------------------------------------------------------------------#
  9.  
  10.  
  11.  #------------------------------------------------------------------------------#
  12.  # 環境設定
  13.  #------------------------------------------------------------------------------#
  14.  # 攻撃判断回数(デフォルト10回以上でアクセスを拒否)
  15.  NG="10"
  16.  
  17.  # メール送信先
  18.  MAIL="admin@example.com"
  19.  #------------------------------------------------------------------------------#
  20.  # メールコマンドのパス
  21.  MAIL_PAHT="/bin/mailx"
  22.  #MAIL_PAHT="/usr/bin/mailx"
  23.  
  24.  # ログファイルのパス
  25.  LOG_PATH="/var/log/secure"
  26.  #LOG_PATH="/var/log/auth.log"
  27.  
  28.  # HOST名の取得
  29.  HOST=`grep ^HOSTNAME /etc/sysconfig/network|cut -b 10-`
  30.  #HOST=`cat /etc/hostname`
  31.  #------------------------------------------------------------------------------#
  32.  
  33.  
  34.  #------------------------------------------------------------------------------#
  35.  # スクリプト本体
  36.  #------------------------------------------------------------------------------#
  37.  #攻撃のあったIPアドレス
  38.  LIST=`grep "Invalid user" $LOG_PATH|awk '{print $10}'|uniq ; grep "Failed password for" $LOG_PATH|awk '{print $11}'|uniq`
  39.  
  40.  for IP in $LIST
  41.  do
  42.     #攻撃回数をカウントする
  43.     COUNT1=`grep "Invalid user" $LOG_PATH|grep "$IP"|wc -l`
  44.     COUNT2=`grep "Failed password for" $LOG_PATH|grep "$IP"|wc -l`
  45.     COUNT=`expr $COUNT1 + $COUNT2`
  46.  
  47.     #既に登録されているか確認
  48.     if test `grep "$IP" /etc/hosts.deny`
  49.     then
  50.        echo "登録済み:"$IP
  51.     else
  52.        #攻撃回数のチェック
  53.        if [ $COUNT -ge $NG ]
  54.        then
  55.           #回数オーバーで、hosts.denyに追記する
  56.           echo "回数オーバー:"$COUNT "回 ["$IP"]"
  57.           echo "sshd:"$IP>> /etc/hosts.deny
  58.  
  59.           #メールで報告
  60.           echo "Server:"$HOST "["$COUNT"]times SSH attack from ["$IP"] Add [hosts.deny] File"|$MAIL_PAHT -s "[SSH Attack Alert]:$HOST" $MAIL
  61.        fi
  62.     fi
  63.  done
  64.  #------------------------------------------------------------------------------#

スクリプトの作成と、実行権限の付加

# 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アドレスからの接続は拒否出来ます。

コメント (6) »

  1. はじめまして。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

  2. shusakuさん

    上記をコピペしただけでは、一部、文字が変わってしまうところがあるかもしれません。

    最新版を公開しますので、ご利用頂ければと思います。(UTF-8/環境設定をお忘れなく)
    https://www.webfile.jp/dl.php?i=377450&s=7c8e1f2b17bef2662a2d

    また、上記でも、エラー等が出る場合、どの行に問題があるのかを調査してみて下さい。
    怪しそうな行を、#(コメントアウト)して、おかしな所を探してみて下さいませ。

    「line 57」とありますが、絶対に、57行目がエラーになっているとは限りません。
    前後の行に、問題があるかもしれませんので。

    コメント by トマト — 2008/7/28 月曜日 @ 3:40:53

  3. 真夜中のご返信ありがとうございます。

    どうも >> の部分が文字化けしていたようでおっかしなことになってたみたいです。

    >>みたいになってましたからw

    この部分を消したらとりあえず動きそうな感じだったんですが、

    echo “sshd:”$IP>> /etc/hosts.deny’

    echo “sshd:”$IP /etc/hosts.deny’

    にしてしまったんで空表示だけしてたみたいですw

    おかげさまで無事に動作確認ができましたw

    ありがとうございました。

    勉強にもなりました。また機会があれば勉強させてください。

    では、お仕事頑張ってください。

    コメント by shusaku — 2008/7/28 月曜日 @ 5:07:19

  4. 最新バージョン@1.0.0
    https://www.webfile.jp/dl.php?i=388544&s=8a65299935320347ad61

    コメント by トマト — 2008/8/22 金曜日 @ 16:35:07

  5. 最新バージョン@1.0.1
    https://www.webfile.jp/dl.php?i=444346&s=7ca44a4dafd4141b6d51

    コメント by トマト — 2008/12/9 火曜日 @ 15:22:37

  6. こちらが最新バージョン@1.0.1
    https://www.webfile.jp/dl.php?i=444462&s=fada852559668e5f24c9

    コメント by トマト — 2008/12/9 火曜日 @ 18:44:39

コメント RSS TrackBack URI

コメントをどうぞ