リアルタイムでアクセス拒否するシェル(β版)を作ってみた(Debian)

最近また多くなってきた感じのする「ZmEu」で色々やってくる方々は他のことも色々やっちゃいそうなので、これらのIPアドレスは全ての通信をお断りする対応を取らせていただく。
でも、当たり前だけど串とか踏み台使ってたりするんできりがない気がする・・・けど、何もしないよりはいいと思う。

そんで、ファイルシステムの監視「inotify」を利用してリアルタイムにアクセス制御を試してみようと思う。
今回はシェルのみで作っているけど、そのうち、気が向いたら「シャア専用(C言語版)」でも作ってみよ。

「inotify」はファイルシステムの更新、読取、作成があった場合に操作内容を通知してくれて、カーネルが2.6.13 以降であれば利用できる。

僕のDebianには「inotify」がインストールされていないのでインストールする

apt-get install inotify-tools

ますは、「inotify-tools」を使ってみる。

使い方:
その1:特定のディレクトリを監視

inotifywait -r -m /hoge/hoge/tool
 
/hoge/hoge/tool/ ACCESS .bash_history
/hoge/hoge/tool/ CLOSE_NOWRITE,CLOSE .bash_history
/hoge/hoge/tool/ OPEN,ISDIR
/hoge/hoge/tool/ CLOSE_NOWRITE,CLOSE,ISDIR
/hoge/hoge/tool/ OPEN,ISDIR
/hoge/hoge/tool/ CLOSE_NOWRITE,CLOSE,ISDIR
/hoge/hoge/tool/ OPEN,ISDIR
/hoge/hoge/tool/ CLOSE_NOWRITE,CLOSE,ISDIR
/hoge/hoge/tool/ OPEN,ISDIR tools
/hoge/hoge2/ OPEN,ISDIR
/hoge/hoge/tool/ CLOSE_NOWRITE,CLOSE,ISDIR tools
/hoge/hoge2/ CLOSE_NOWRITE,CLOSE,ISDIR

OPENとかCLOSEとか色々通知してくれる。

その2:特定のファイルを監視

inotifywait -m /var/log/apache2/access.log

で、ほぼリアルタイムでアクセス拒否するシェルβ版を作ってみた。
処理内容は、下のシェルのコメントにも書いてあるけど、こんな感じ。

①Apacheのログファイルを監視して、拒否したいアクセスをしてきたIPアドレスを「iptables」に登録して、通信を拒否する。
②アクセス拒否IPを累積する※1
③アクセス拒否IP登録メールをroot宛に送信する

※1:iptablesの内容は再起動で消えてしまうので、下にある「iptables-setup3.sh」でIPアドレスを再登録する

システムの起動時に実行させておく場合は
/etc/rc.localの「exit 0」の前に「/hoge/hoge2/inotifywait-apache2.sh &」を記載する

inotifywait-apache2.sh

#!/bin/sh
#--------------------------------------------------------------------
#リアルタイムアクセス拒否β(Apacheログ専用)
#
#処理概要:
#①Apacheのログファイルを(ほぼ)リアルタイムで監視して、拒否したいアクセスをしてきたIPアドレスを
#「iptables」に登録して、全ての通信を拒否する。
#②アクセス拒否IPを累積する
#③アクセス拒否IP登録メールをroot宛に送信する
#
#注意:
#β版なので、期待しない。
#「iptables」を使用しているのでその使い方は知っていたほうがいい。
#
#使用条件:
#ファイルの更新監視には「inotify」を使用しているので、inotifyがインストールされていること。
#Debian、Ubuntuの場合、「apt-get install inotify-tools」でインストール!
#
#使用方法:
#実行例1:バックグラウンドで実行
#./inotifywait-apache2.sh &
#
#実行例2:フォアグラウンドで実行
#./inotifywait-apache2.sh
#
#--------------------------------------------------------------------
#----------------------------------------
# 初期設定
#----------------------------------------
#Apacheログファイル
chkLogFile=/var/log/apache2/access.log
#アクセス拒否IP累積リスト
denyIpFile=/var/log/apache2/denyIP
#アクセス拒否判定文字列:エージェント「ZmEu」でアクセスしてきて「HTTP 404」出したヤツのIP取得
chkStr='.+GET.+HTTP/1\.1" 404.+"ZmEu"'
#----------------------------------------
touch $denyIpFile
 
while inotifywait -e modify $chkLogFile;
do
   #アクセス拒否判定文字列の検索(累積リストにあるものは対象外)
   cnt=`grep -f $denyIpFile -v $chkLogFile|egrep "$chkStr"|wc -l|cut -d " " -f 1`
   #引っかかった場合
   if [ "$cnt" != "0" ];
   then
      #作業リストとしてIPアドレスを保持する
      grep -f $denyIpFile -v $chkLogFile|egrep "$chkStr" |awk '{print $1}'|sort|uniq>;$denyIpFile$$
 
      #累積リストと今回のリストを比較して新規をiptablesに登録
      for inIp in `comm -23 $denyIpFile$$ $denyIpFile`;
      do
         iptables -I INPUT -s $inIp -j DROP
      done
 
      #IPを標準出力に表示
      echo `date`
      cat $denyIpFile$$
 
      #累積リストに追加
      cat $denyIpFile>>;$denyIpFile$$
      cat $denyIpFile$$|sort|uniq>;$denyIpFile
      #メール通知
      cat $denyIpFile$$|mail -s "inotifywait-apache2 LOCK IP!!" "root"
      #作業リストを削除
      rm $denyIpFile$$
   else
      echo "Normal Access!!:"`date`
   fi
done

iptablesの設定はシステムの再起動でクリアされてしまうので、累積リストから登録するシェルを作成しておく。
iptables-setup3.sh

#!/bin/sh
#--------------------------------------------------------------------
#iptables-setup3
# ファイアウォール初期設定スクリプト
# アクセス拒否IPアドレスの登録を行う
#----------------------------------------
# 初期設定
#----------------------------------------
#アクセス拒否IP累積リスト
denyIpFile=/var/log/apache2/denyIP
#----------------------------------------
#累積リストと今回のリストを比較して新規をiptablesに登録
for inIp in `$denyIpFile`;
do
   iptables -I INPUT -s $inIp -j DROP
done
 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です