CentOS7

ログ監視ツール導入(SWATCH)

システムのログファイル(/var/log/messages等任意のログファイル)を監視し、特定のメッセージを検知してリアルタイムに任意のアクションを実行することができるSWATCHを導入して、不正アクセス元からのアクセスを即ブロックする。

なお、該当IPアドレスは動的IPアドレスの場合もあり、該当IPアドレスが正当なユーザーに割当てられた場合に正当なユーザーがアクセスできなくなってしまうので、24時間後にアクセス制限を自動的に解除するようにする。

SWATCHインストール

EPELリポジトリ導入(EPEL)を参照してEPELリポジトリを導入する
[root@localhost ~]# yum -y install perl-File-Tail ← SWATCH動作に必要なPerlモジュールインストール
[root@localhost ~]# yum -y install swatch ← SWATCHインストール

SWATCH設定

SWATCHアクションスクリプト作成

SWATCHが検知したIPアドレスからの累積不正アクセス数が3回ごとまたは、引数でblock※と指定された場合、該当IPアドレスからのアクセスを24時間規制するシェルスクリプトを作成する

※Ping of Death等悪意のあるアクセスを即規制するためのオプション

[root@localhost ~]# vi /usr/local/bin/swatch_action.sh ← SWATCHアクションスクリプト作成
#!/bin/bash

# SWATCHアクションスクリプト
#
# 引数1:ログ区切り文字を指定
# 引数2:ログ内IPアドレス位置を指定
# 引数3:該当IPアドレスからのアクセスを規制する場合blockを指定


PATH=/bin:/sbin:/usr/bin

# 規制IPアドレス情報メール通知先設定
# ※メール通知しない場合は下記をコメントアウト

mail=root

# 異常終了処理関数定義
error_exit () {
(echo From: root@`hostname -d`
echo "Subject: `basename ${0}` aborted."
echo
echo ${LOG}) | \
`which sendmail` -t root
exit 1
}

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

# ログからIPアドレスを抽出
IPADDR=`echo $LOG | awk -F "$1" "{print $"$2"}"`
echo "$IPADDR" | grep "^[0-9]*\." > /dev/null 2>&1
if [ $? -eq 0 ]; then
# IPアドレスから始まる場合
IPADDR=`echo "$IPADDR" | sed -e 's/\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d`
else
# IPアドレス以外から始まる場合
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アドレスチェック※取得失敗時はroot宛にメール通知して終了
expr "${addr1}" + 1 > /dev/null 2>&1 ; [ $? -ge 2 ] && error_exit
expr "${addr2}" + 1 > /dev/null 2>&1 ; [ $? -ge 2 ] && error_exit
expr "${addr3}" + 1 > /dev/null 2>&1 ; [ $? -ge 2 ] && error_exit
expr "${addr4}" + 1 > /dev/null 2>&1 ; [ $? -ge 2 ] && error_exit

# 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

# ホスト名取得
dig -x $IPADDR | grep "ANSWER SECTION:" > /dev/null 2>&1
if [ $? -eq 0 ]; then
HOST=`dig -x $IPADDR | grep -A 1 "ANSWER SECTION:" | tail -n 1 | awk '{print $5}'`
else
HOST="unknown"
fi

# 不正アクセスログメッセージをIPアドレス別ログファイルに記録
echo $LOG >> /var/log/swatch/$IPADDR

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

# 該当IPアドレスからの累積不正アクセス数が3回ごとまたは
# 引数でblockと指定された場合アクセス規制
if [ $(( $cnt % 3 )) -eq 0 ] || [ $# -eq 3 -a "$3" = "block" ]; then
# 該当IPアドレスからのアクセスを拒否するルールを挿入
iptables -I INPUT -s $IPADDR -j DROP
# https://centossrv.com/iptables.shtmlのiptables再起動対応
[ -f /root/deny_ip ] && echo $IPADDR >> /root/deny_ip

# 上記ルールを24時間後に削除するスケジュールを登録
echo "iptables -D INPUT -s $IPADDR -j DROP > /dev/null 2>&1" | \
at now+24hour > /dev/null 2>&1
# https://centossrv.com/iptables.shtmlのiptables再起動対応
[ -f /root/deny_ip ] && \
echo "sed -i '/^$IPADDR$/d' /root/deny_ip > /dev/null 2>&1 ; \
sed -i '/ $IPADDR /d' /etc/sysconfig/iptables > /dev/null 2>&1" | \
at now+24hour > /dev/null 2>&1

# アクセス規制IPアドレス情報をメール通知
[ "$mail" != "" ] && \
(echo From: root@`hostname -d`
echo "Subject: Blocked access from $IPADDR($HOST)"
echo
cat /var/log/swatch/$IPADDR
echo
whois $IPADDR) | \
`which sendmail` -t $mail

echo "`date` $IPADDR($HOST) $cnt Blocked!"
else
echo "`date` $IPADDR($HOST) $cnt"
fi
[root@localhost ~]# chmod 700 /usr/local/bin/swatch_action.sh ← SWATCHアクションスクリプトへ実行権限付加

SWATCH設定

[root@localhost ~]# mkdir /etc/swatch ← SWATCH設定ファイル格納ディレクトリ作成
[root@localhost ~]# vi /etc/logrotate.d/swatch ← SWATCHログ切替え設定ファイル作成
/var/log/swatch/swatch.log {
missingok
notifempty
sharedscripts
postrotate
/etc/rc.d/init.d/swatch restart > /dev/null || true
endscript
}

/var/log/secure監視設定

[root@localhost ~]# vi /etc/swatch/secure.conf ← /var/log/secure監視用設定ファイル作成
# logfile /var/log/secure

# アクセス無許可ホストからのSSHログイン失敗を検知したら該当ホストからのアクセスを24時間規制
# (Jan 23 19:50:37 centos sshd[15862]: refused connect from xxxxxxxxx (XXX.XXX.XXX.XXX))
# ※/etc/hosts.deny、/etc/hosts.allowでアクセス許可ホストを制限していることが前提
watchfor /sshd.*refused/
pipe "/usr/local/bin/swatch_action.sh '\\\\(|\\\\)' 2 block"
threshold track_by=/sshd.*refused/,type=limit,count=1,seconds=10

# アクセス許可ホストからのユーザー名誤りによるSSHログイン失敗を3回検知するごとに該当ホストからのアクセスを24時間規制
# (Feb 2 17:51:26 centos sshd[6982]: Failed password for invalid user xxxxxxxx from XXX.XXX.XXX.XXX port 34464 ssh2)
watchfor /sshd.*Failed password for invalid user/
pipe "/usr/local/bin/swatch_action.sh ' ' 13"
threshold track_by=/sshd.*Failed password for invalid user/,type=limit,count=3,seconds=10

# アクセス許可ホストからのパスワード誤りによるSSHログイン失敗を3回検知するごとに該当ホストからのアクセスを24時間規制
# (Jan 28 04:56:56 centos sshd[1849]: Failed password for root from XXX.XXX.XXX.XXX port 56558 ssh2)
watchfor /sshd.*Failed password for/
pipe "/usr/local/bin/swatch_action.sh ' ' 11"
threshold track_by=/sshd.*Failed password for/,type=limit,count=3,seconds=10

# アクセス許可ホストからのDovecotログイン失敗を3回検知するごとに該当ホストからのアクセスを24時間規制
# (Jan 28 05:16:20 centos auth: pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=xxxxxxxx rhost=XXX.XXX.XXX.XXX)
# ※メールサーバー構築済であること
watchfor /auth: pam_unix\(dovecot:auth\): authentication failure/
pipe "/usr/local/bin/swatch_action.sh '=' 7"
threshold track_by=/auth: pam_unix\(dovecot:auth\): authentication failure/,type=limit,count=3,seconds=10

/var/log/maillog監視設定

[root@localhost ~]# vi /etc/swatch/maillog.conf ← /var/log/maillog監視用設定ファイル作成
# logfile /var/log/maillog

# メールサーバーへの不正中継アクセスを検知したら該当ホストからのアクセスを24時間規制
# (Jan 23 06:27:02 centos postfix/smtpd[16659]: NOQUEUE: reject: RCPT from unknown[XXX.XXX.XXX.XXX]: 454 4.7.1 <xxxxxxxx@xxxxxxxx>: Relay access denied; from=<xxxxxxxx@xxxxxxxx> to=<xxxxxxxx@xxxxxxxx> proto=ESMTP helo=<xxxxxxxx>)
# ※メールサーバー構築済であること
watchfor /postfix\/smtpd.*Relay access denied;/
pipe "/usr/local/bin/swatch_action.sh '\\\\[|\\\\]' 4 block"
threshold track_by=/postfix\/smtpd.*Relay access denied;/,type=limit,count=1,seconds=10

# メールサーバーのSASL認証失敗を3回検知するごとに該当ホストからのアクセスを24時間規制
# (Jan 23 08:52:55 centos postfix/smtpd[19694]: warning: xxxxxxxx[XXX.XXX.XXX.XXX]: SASL LOGIN authentication failed: authentication failure)
# ※メールサーバー構築済であること
watchfor /postfix\/smtpd.*SASL .* authentication failed:/
pipe "/usr/local/bin/swatch_action.sh '\\\\[|\\\\]' 4"
threshold track_by=/postfix\/smtpd.*SASL .* authentication failed:/,type=limit,count=3,seconds=10

SWATCH起動

[root@localhost ~]# vi /etc/rc.d/init.d/swatch ← SWATCH起動スクリプト作成
#!/bin/bash
#
# swatch
#
# chkconfig: 2345 90 35
# description: swatch start/stop script

# Source function library.
. /etc/rc.d/init.d/functions

PATH=/sbin:/usr/local/bin:/bin:/usr/bin

mkdir -p /var/log/swatch

start() {
# Start daemons.
ls /var/run/swatch_*.pid > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo -n "Starting swatch"
pno=0
for conf in /etc/swatch/*.conf
do
pno=`expr $pno + 1`
WATCHLOG=`grep "^# logfile" $conf | awk '{ print $3 }'`
swatch --config-file $conf --tail-file $WATCHLOG \
--script-dir=/tmp --awk-field-syntax --use-cpan-file-tail --daemon \
--pid-file /var/run/swatch_$pno.pid \
>> /var/log/swatch/swatch.log 2>&1
RETVAL=$?
[ $RETVAL != 0 ] && return $RETVAL
done
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/swatch
return $RETVAL
else
echo "swatch is already started"
fi
}

stop() {
# Stop daemons.
ls /var/run/swatch_*.pid > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo -n "Shutting down swatch"
for pid in /var/run/swatch_*.pid
do
kill $(cat $pid)
rm -f $pid
done
echo
rm -f /var/lock/subsys/swatch /tmp/.swatch_script.*
else
echo "swatch is not running"
fi
}

status() {
ls /var/run/swatch_*.pid > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo -n "swatch (pid"
for pid in /var/run/swatch_*.pid
do
echo -n " `cat $pid`"
done
echo ") is running..."
else
echo "swatch is stopped"
fi
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: swatch {start|stop|restart|status}"
exit 1
esac

exit $RETVAL
[root@localhost ~]# chmod +x /etc/rc.d/init.d/swatch ← SWATCH起動スクリプトへ実行権限付加
[root@localhost ~]# /etc/rc.d/init.d/swatch start ← SWATCH起動
Starting swatch
[root@localhost ~]# chkconfig --add swatch ← SWATCH起動スクリプトをchkconfigへ登録
[root@localhost ~]# chkconfig swatch on ← SWATCH自動起動設定
[root@localhost ~]# chkconfig --list swatch ← SWATCH自動起動設定確認
swatch 0:off 1:off 2:on 3:on 4:on 5:on 6:off ← ランレベル2~5のonを確認

SWATCH運用

設定に従って各種ログファイルを監視し、不正アクセスを検知して該当ホストからのアクセスを24時間規制した場合、該当IPアドレスのwhois情報がメール通知されてくる。

※SWATCHアクションスクリプト(swatch_action.sh)で規制IPアドレス情報通知先メールアドレスを指定した場合

同一IPアドレスからの不正アクセスが繰り返される場合、該当IPアドレスからのアクセス規制解除予約を削除して、該当IPアドレスからのアクセスを永久に規制するようにする。

[root@localhost ~]# vi swatchatrm ← アクセス規制解除予約削除処理スクリプト作成
#!/bin/sh

# アクセス規制解除予約削除処理
#
# 引数で指定した回数以上の不正アクセスを記録したIPアドレスのアクセス規制解除予約を削除して
# 該当IPアドレスからのアクセスを永久に規制する
# 引数に0を指定した場合は不正アクセス記録回数のみ表示して規制解除予約の削除は行わない


[ $# -ne 1 ] && echo "usage is ${0} cnt" && exit 1
for atq in `atq|awk '{print $1}'`
do
at -c ${atq}|grep "iptables -D INPUT -s " > /dev/null 2>&1 || continue
ip=`at -c ${atq}|grep "iptables -D INPUT -s "|sed -e 's/.*iptables -D INPUT -s \([^ ]*\) -j DROP.*/\1/p' -e d`
if [ ${1} -eq 0 ];then
echo -e "${ip}\t`cat /var/log/swatch/${ip}|wc -l`"
else
cnt=`cat /var/log/swatch/${ip}|wc -l`
[ ${cnt} -ge ${1} ] && \
atrm ${atq} && echo -e "${ip}\\t`cat /var/log/swatch/${ip}|wc -l`"
fi
done
[root@localhost ~]# sh swatchatrm 0|sort -n -k 2 -r ←  不正アクセス記録回数の多い順にアクセス規制解除待ちIPアドレスを表示
YYY.YYY.YYY.YYY 18
XXX.XXX.XXX.XXX 12
ZZZ.ZZZ.ZZZ.ZZZ 5
[root@localhost ~]# sh swatchatrm 10 ←  例として10回以上の不正アクセスを記録したIPアドレスからのアクセス規制解除予約を削除=永久に規制
XXX.XXX.XXX.XXX 12
YYY.YYY.YYY.YYY 18
[root@localhost ~]# sh swatchatrm 0|sort -n -k 2 -r ←  不正アクセス記録回数の多い順にアクセス規制解除待ちIPアドレスを表示

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-09-08 (土) 22:37:14