Swatchで不正アクセス遮断(Swatch+iptables)

このページでは、SWATCHで各システムのログファイルを監視し、特定のパターンにマッチした場合iptablesと連係しアクセスを遮断させます。

※iptablesにてアクセスをブロックするまでの回数や、動的IP対策としてアクセス制限を行う時間は任意で設定が可能

Swatchのインストール


swatchに必要なperlモジュールをインストール

必要なのが下記モジュール

Bit::Vector
Date::Calc
File::Tail
Time::HiRes
TimeDate ←TaimDateに関してはDate::Parseのインストールで補った。

cpanで下記モジュールをインストールします。

# cpan ← cpan起動

cpan> install Bit::Vector ← 途中色々と聞かれるのでそのまま「Enter」
cpan> install Date::Calc
cpan> install File::Tail
cpan> install Time::HiRes
cpan> install Date::Parse

それぞれ結構時間が掛かります。。。

cpan> exit ← 終了


最新版はこちらで確認
# wget http://downloads.sourceforge.net/swatch/swatch-3.2.3.tar.gz ← SWATCHをダウンロード

# tar fvxz swatch-3.2.3.tar.gz ← 展開

# cd swatch-3.2.3 ← 移動

# perl Makefile.PL

# make

# make test

# make install ← インストール

# rm -rf swatch-3.2.3.tar.gz ← DLファイル削除


# apt-get install jwhois ← whoisコマンドのインストール
                  (不正IP連絡時にwhois情報をメール通知するので必要)

アクセス遮断スクリプトの作成

不正アクセスの累計回数が、スクリプトで指定した回数に達した場合、iptablesにて24時間アクセスを遮断する


# vi /usr/bin/swatch.sh ← スクリプト作成

 i キー(入力モード)
#!/bin/bash

PATH=/bin:/sbin:/usr/bin
LANG=C

# IPブロック時メール送信先(送信しない場合はコメントアウト)
mail=root

# 不正アクセスをブロックするまでの回数
max=3

# ログを標準入力から取得
read LOG

# ログからIPアドレスを抽出
IPADDR=`echo $LOG|cut -d " " -f $1`
echo "$IPADDR"|grep "^[0-9]*\." > /dev/null 2>&1
if [ $? -eq 0 ]; then
    IPADDR=`echo "$IPADDR"|sed -e 's/\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d`
else
    IPADDR=`echo "$IPADDR"|sed -e 's/.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d`
fi

# IPアドレス分割
addr1=`echo $IPADDR|cut -d . -f 1`
addr2=`echo $IPADDR|cut -d . -f 2`
addr3=`echo $IPADDR|cut -d . -f 3`
addr4=`echo $IPADDR|cut -d . -f 4`

# IPアドレスがプライベートIPアドレスの場合は動作させない
if [ "$IPADDR" = "127.0.0.1" ]; then
    exit
elif [ $addr1 -eq 10 ]; then
    exit
elif [ $addr1 -eq 172 ] && [ $addr2 -ge 16 ] && [ $addr2 -le 31 ]; then
    exit
elif [ $addr1 -eq 192 ] && [ $addr2 -eq 168 ]; then
    exit
fi
# 不正IPアドレス別にログファイル作成
echo $LOG >> /var/log/swatch/$IPADDR

# 不正IPアドレス別ログファイルから累積不正アクセス数取得
cnt=`cat /var/log/swatch/$IPADDR | wc -l`

# 該当IPアドレスが指定した累積不正アクセス数に達した時と
# 引数でBlockと指定された場合アクセス規制
if [ "$cnt" -ge "$max" ] || [ $# -eq 2 -a  "$2" = "Block" ]; then

    # 該当IPアドレスからのアクセスを拒否するルールを挿入
    iptables -I INPUT -s $IPADDR -j DROP

    # 上記ルールを24時間後に削除するスケジュールを登録
    echo "iptables -D INPUT -s $IPADDR -j DROP > /dev/null 2>&1" | \
    at now+24hour > /dev/null 2>&1

    # アクセス規制IPアドレス情報をメール通知
    [ "$mail" != "" ] && (cat /var/log/swatch/$IPADDR ; \
                echo ; whois $IPADDR) | \
                mail -s "IP Block!" $mail
    # ブロック済不正IPアドレス別ログファイル削除
    rm -f /var/log/swatch/$IPADDR

    echo "`date` $IPADDR $cnt Block!"
else
    echo "`date` $IPADDR $cnt"

fi
編集したら Esc キー(コマンドモード):wqで保存


# chmod 700 /usr/bin/swatch.sh ← スクリプトに実行権限を与えます

Swatchの設定


# mkdir /etc/swatch ← 設定ファイル用ディレクトリ作成

# vi /etc/logrotate.d/swatch ← ログローテーション設定ファイル作成
i キー(入力モード)
/var/log/swatch/swatch.log {
    missingok
    notifempty
    sharedscripts
    postrotate
        /etc/rc.d/init.d/swatch restart > /dev/null || true
    endscript
}      
編集したら Esc キー(コマンドモード):wqで保存

FTPサーバー(ProFTPd)の不正接続を監視する

ログインに失敗した場合この様な(530)ログが出力されます。
[01/Mar/2009:22:46:40 +0900] : nobody 111.222.333.444 "PASS (hidden)" 530

このログのIPアドレスの場所を設定ファイルで指定して、アクセス遮断スクリプトへ渡します。
IPアドレスの場所は、左側からスペースを区切りに数えた場所です。

※下記設定内容は当サイトのProFTPd編のログ設定(auth.logの出力)を行っている事が前提


# vi /etc/swatch/proftpd-auth.conf ← ProFTPd用の設定ファイルを作成

 i キー(入力モード)
#監視ログの場所を指定
# logfile /var/log/proftpd/auth.log

#監視したい文字列を記載
watchfor /530$/

#ログのIPアドレスの場所を指定し、アクセス遮断スクリプトへ渡す
    pipe "/usr/bin/swatch.sh 5"

編集したら Esc キー(コマンドモード):wqで保存

この他のサーバーに関しては今後、更新していくつもりです。
まずはFTPサーバーのみとさせていただきます。

Swatchの起動スクリプトDLと自動起動設定


# cd /etc/rc.d/init.d/ ← 起動スクリプトDL先へ移動

# wget http://vine.1-max.net/rpm/swatch ← 当サイトから起動スクリプトDL

# cd ← 戻る

# chmod +x /etc/rc.d/init.d/swatch ← 実行権付加

# /etc/rc.d/init.d/swatch start ← SWATCH起動

# chkconfig --add swatch ← SWATCH起動スクリプトをcheconfigへ登録

# chkconfig swatch on ← SWATCH自動起動設定

# chkconfig --list swatch ← SWATCH自動起動設定確認
swatch   0:off  1:off  2:on  3:on  4:on  5:on  6:off ← ランレベル2〜5がonか確認


動作確認

ネットで「FTP接続テスト」で検索すれば色々とテスト環境を公開されていますので、そういったテスト環境を利用してテストを行います。

ユーザー名、パスワードは実在しないものを設定してアクセス遮断スクリプトで指定したブロック回数までテストを行ってください。
次にテストを行ってアクセスが遮断されれば成功です。


次に件名が「IP Block!」でログの情報とWhois情報が記載されたメールがroot宛に送信されていると思います。

これら2つが確認できれば問題なく動作しています。




Copyright c Vine Linuxで自宅サーバー. 2004 All Rights Reserved.