#author("2018-09-08T22:29:30+09:00","","") #author("2018-09-08T22:37:14+09:00","","") [[CentOS7]] *ログ監視ツール導入(SWATCH) [#u051d80a] システムのログファイル(/var/log/messages等任意のログファイル)を監視し、特定のメッセージを検知してリアルタイムに任意のアクションを実行することができる[[SWATCH>https://sourceforge.net/projects/swatch/]]を導入して、不正アクセス元からのアクセスを即ブロックする。 なお、該当IPアドレスは動的IPアドレスの場合もあり、該当IPアドレスが正当なユーザーに割当てられた場合に正当なユーザーがアクセスできなくなってしまうので、24時間後にアクセス制限を自動的に解除するようにする。 *SWATCHインストール [#f75d877d] |BGCOLOR(black):COLOR(white):|c |&color(lime){EPELリポジトリ導入(EPEL)を参照してEPELリポジトリを導入する};| |[root@localhost ~]# yum -y install perl-File-Tail &color(lime){← SWATCH動作に必要なPerlモジュールインストール};| |[root@localhost ~]# yum -y install swatch &color(lime){← SWATCHインストール};| *SWATCH設定 [#y6b2ff8f] **SWATCHアクションスクリプト作成 [#k94ad324] SWATCHが検知したIPアドレスからの累積不正アクセス数が3回ごとまたは、引数でblock※と指定された場合、該当IPアドレスからのアクセスを24時間規制するシェルスクリプトを作成する ※Ping of Death等悪意のあるアクセスを即規制するためのオプション |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /usr/local/bin/swatch_action.sh &color(lime){← SWATCHアクションスクリプト作成};| |#!/bin/bash &br; &br; &color(lime){# SWATCHアクションスクリプト &br; # &br; # 引数1:ログ区切り文字を指定 &br; # 引数2:ログ内IPアドレス位置を指定 &br; # 引数3:該当IPアドレスからのアクセスを規制する場合blockを指定}; &br; &br; PATH=/bin:/sbin:/usr/bin &br; &br; &color(lime){# 規制IPアドレス情報メール通知先設定 &br; # ※メール通知しない場合は下記をコメントアウト}; &br; mail=root &br; &br; &color(lime){# 異常終了処理関数定義}; &br; error_exit () { &br; (echo From: root@`hostname -d` &br; echo "Subject: `basename ${0}` aborted." &br; echo &br; echo ${LOG}) | \ &br; `which sendmail` -t root &br; exit 1 &br; } &br; &br; &color(lime){# ログを標準入力から取得}; &br; read LOG &br; &br; &color(lime){# ログからIPアドレスを抽出}; &br; IPADDR=`echo $LOG | awk -F "$1" "{print $"$2"}"` &br; echo "$IPADDR" | grep "^[0-9]*\." > /dev/null 2>&1 &br; if [ $? -eq 0 ]; then &br; &color(lime){# IPアドレスから始まる場合}; &br; IPADDR=`echo "$IPADDR" | sed -e 's/\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d` &br; else &br; &color(lime){# IPアドレス以外から始まる場合}; &br; IPADDR=`echo "$IPADDR" | sed -e 's/.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d` &br; fi &br; &br; &color(lime){# IPアドレスをピリオドで分割}; &br; addr1=`echo $IPADDR | cut -d . -f 1` &br; addr2=`echo $IPADDR | cut -d . -f 2` &br; addr3=`echo $IPADDR | cut -d . -f 3` &br; addr4=`echo $IPADDR | cut -d . -f 4` &br; &br; &color(lime){# IPアドレスチェック※取得失敗時はroot宛にメール通知して終了}; &br; expr "${addr1}" + 1 > /dev/null 2>&1 ; [ $? -ge 2 ] && error_exit &br; expr "${addr2}" + 1 > /dev/null 2>&1 ; [ $? -ge 2 ] && error_exit &br; expr "${addr3}" + 1 > /dev/null 2>&1 ; [ $? -ge 2 ] && error_exit &br; expr "${addr4}" + 1 > /dev/null 2>&1 ; [ $? -ge 2 ] && error_exit &br; &br; &color(lime){# IPアドレスがプライベートIPアドレスの場合は終了}; &br; if [ "$IPADDR" = "127.0.0.1" ]; then &br; exit &br; elif [ $addr1 -eq 10 ]; then &br; exit &br; elif [ $addr1 -eq 172 ] && [ $addr2 -ge 16 ] && [ $addr2 -le 31 ]; then &br; exit &br; elif [ $addr1 -eq 192 ] && [ $addr2 -eq 168 ]; then &br; exit &br; fi &br; &br; &color(lime){# ホスト名取得}; &br; dig -x $IPADDR | grep "ANSWER SECTION:" > /dev/null 2>&1 &br; if [ $? -eq 0 ]; then &br; HOST=`dig -x $IPADDR | grep -A 1 "ANSWER SECTION:" | tail -n 1 | awk '{print $5}'` &br; else &br; HOST="unknown" &br; fi &br; &br; &color(lime){# 不正アクセスログメッセージをIPアドレス別ログファイルに記録}; &br; echo $LOG >> /var/log/swatch/$IPADDR &br; &br; &color(lime){# IPアドレス別ログファイルから累積不正アクセス数取得}; &br; cnt=`cat /var/log/swatch/$IPADDR | wc -l` &br; &br; &color(lime){# 該当IPアドレスからの累積不正アクセス数が3回ごとまたは}; &br; &color(lime){# 引数でblockと指定された場合アクセス規制}; &br; if [ $(( $cnt % 3 )) -eq 0 ] || [ $# -eq 3 -a "$3" = "block" ]; then &br; &color(lime){# 該当IPアドレスからのアクセスを拒否するルールを挿入}; &br; iptables -I INPUT -s $IPADDR -j DROP &br; &color(lime){# https://centossrv.com/iptables.shtmlのiptables再起動対応}; &br; [ -f /root/deny_ip ] && echo $IPADDR >> /root/deny_ip &br; &br; &color(lime){# 上記ルールを24時間後に削除するスケジュールを登録}; &br; echo "iptables -D INPUT -s $IPADDR -j DROP > /dev/null 2>&1" | \ &br; at now+24hour > /dev/null 2>&1 &br; &color(lime){# https://centossrv.com/iptables.shtmlのiptables再起動対応}; &br; [ -f /root/deny_ip ] && \ &br; echo "sed -i '/^$IPADDR$/d' /root/deny_ip > /dev/null 2>&1 ; \ &br; sed -i '/ $IPADDR /d' /etc/sysconfig/iptables > /dev/null 2>&1" | \ &br; at now+24hour > /dev/null 2>&1 &br; &br; &color(lime){# アクセス規制IPアドレス情報をメール通知}; &br; [ "$mail" != "" ] && \ &br; (echo From: root@`hostname -d` &br; echo "Subject: Blocked access from $IPADDR($HOST)" &br; echo &br; cat /var/log/swatch/$IPADDR &br; echo &br; whois $IPADDR) | \ &br; `which sendmail` -t $mail &br; &br; echo "`date` $IPADDR($HOST) $cnt Blocked!" &br; else &br; echo "`date` $IPADDR($HOST) $cnt" &br; fi &br; | |[root@localhost ~]# chmod 700 /usr/local/bin/swatch_action.sh &color(lime){← SWATCHアクションスクリプトへ実行権限付加};| *SWATCH設定 [#sc39edc8] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# mkdir /etc/swatch &color(lime){← SWATCH設定ファイル格納ディレクトリ作成};| |[root@localhost ~]# vi /etc/logrotate.d/swatch &color(lime){← SWATCHログ切替え設定ファイル作成};| |/var/log/swatch/swatch.log { &br; missingok &br; notifempty &br; sharedscripts &br; postrotate &br; /etc/rc.d/init.d/swatch restart > /dev/null || true &br; endscript &br; } &br; | */var/log/secure監視設定 [#ta74087d] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /etc/swatch/secure.conf ← &color(lime){/var/log/secure監視用設定ファイル作成};| |# logfile /var/log/secure &br; &br; &color(lime){# アクセス無許可ホストからのSSHログイン失敗を検知したら該当ホストからのアクセスを24時間規制}; &br; &color(lime){# (Jan 23 19:50:37 centos sshd[15862]: refused connect from xxxxxxxxx (XXX.XXX.XXX.XXX))}; &br; &color(lime){# ※/etc/hosts.deny、/etc/hosts.allowでアクセス許可ホストを制限していることが前提}; &br; watchfor /sshd.*refused/ &br; pipe "/usr/local/bin/swatch_action.sh '\\\\(|\\\\)' 2 block" &br; threshold track_by=/sshd.*refused/,type=limit,count=1,seconds=10 &br; &br; &color(lime){# アクセス許可ホストからのユーザー名誤りによるSSHログイン失敗を3回検知するごとに該当ホストからのアクセスを24時間規制}; &br; &color(lime){# (Feb 2 17:51:26 centos sshd[6982]: Failed password for invalid user xxxxxxxx from XXX.XXX.XXX.XXX port 34464 ssh2)}; &br; watchfor /sshd.*Failed password for invalid user/ &br; pipe "/usr/local/bin/swatch_action.sh ' ' 13" &br; threshold track_by=/sshd.*Failed password for invalid user/,type=limit,count=3,seconds=10 &br; &br; &color(lime){# アクセス許可ホストからのパスワード誤りによるSSHログイン失敗を3回検知するごとに該当ホストからのアクセスを24時間規制}; &br; &color(lime){# (Jan 28 04:56:56 centos sshd[1849]: Failed password for root from XXX.XXX.XXX.XXX port 56558 ssh2)}; &br; watchfor /sshd.*Failed password for/ &br; pipe "/usr/local/bin/swatch_action.sh ' ' 11" &br; threshold track_by=/sshd.*Failed password for/,type=limit,count=3,seconds=10 &br; &br; &color(lime){# アクセス許可ホストからのDovecotログイン失敗を3回検知するごとに該当ホストからのアクセスを24時間規制}; &br; &color(lime){# (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)}; &br; &color(lime){# ※メールサーバー構築済であること}; &br; watchfor /auth: pam_unix\(dovecot:auth\): authentication failure/ &br; pipe "/usr/local/bin/swatch_action.sh '=' 7" &br; threshold track_by=/auth: pam_unix\(dovecot:auth\): authentication failure/,type=limit,count=3,seconds=10 &br; | */var/log/maillog監視設定 [#g3277e8b] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /etc/swatch/maillog.conf &color(lime){← /var/log/maillog監視用設定ファイル作成};| |# logfile /var/log/maillog &br; &br; &color(lime){# メールサーバーへの不正中継アクセスを検知したら該当ホストからのアクセスを24時間規制}; &br; &color(lime){# (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>)}; &br; &color(lime){# ※メールサーバー構築済であること}; &br; watchfor /postfix\/smtpd.*Relay access denied;/ &br; pipe "/usr/local/bin/swatch_action.sh '\\\\[|\\\\]' 4 block" &br; threshold track_by=/postfix\/smtpd.*Relay access denied;/,type=limit,count=1,seconds=10 &br; &br; &color(lime){# メールサーバーのSASL認証失敗を3回検知するごとに該当ホストからのアクセスを24時間規制}; &br; &color(lime){# (Jan 23 08:52:55 centos postfix/smtpd[19694]: warning: xxxxxxxx[XXX.XXX.XXX.XXX]: SASL LOGIN authentication failed: authentication failure)}; &br; &color(lime){# ※メールサーバー構築済であること}; &br; watchfor /postfix\/smtpd.*SASL .* authentication failed:/ &br; pipe "/usr/local/bin/swatch_action.sh '\\\\[|\\\\]' 4" &br; threshold track_by=/postfix\/smtpd.*SASL .* authentication failed:/,type=limit,count=3,seconds=10| *SWATCH起動 [#cf082ec7] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /etc/rc.d/init.d/swatch &color(lime){← SWATCH起動スクリプト作成};| |#!/bin/bash &br; # &br; # swatch &br; # &br; # chkconfig: 2345 90 35 &br; # description: swatch start/stop script &br; &br; # Source function library. &br; . /etc/rc.d/init.d/functions &br; &br; PATH=/sbin:/usr/local/bin:/bin:/usr/bin &br; &br; mkdir -p /var/log/swatch &br; &br; start() { &br; # Start daemons. &br; ls /var/run/swatch_*.pid > /dev/null 2>&1 &br; if [ $? -ne 0 ]; then &br; echo -n "Starting swatch" &br; pno=0 &br; for conf in /etc/swatch/*.conf &br; do &br; pno=`expr $pno + 1` &br; WATCHLOG=`grep "^# logfile" $conf | awk '{ print $3 }'` &br; swatch --config-file $conf --tail-file $WATCHLOG \ &br; --script-dir=/tmp --awk-field-syntax --use-cpan-file-tail --daemon \ &br; --pid-file /var/run/swatch_$pno.pid \ &br; >> /var/log/swatch/swatch.log 2>&1 &br; RETVAL=$? &br; [ $RETVAL != 0 ] && return $RETVAL &br; done &br; echo &br; [ $RETVAL = 0 ] && touch /var/lock/subsys/swatch &br; return $RETVAL &br; else &br; echo "swatch is already started" &br; fi &br; } &br; &br; stop() { &br; # Stop daemons. &br; ls /var/run/swatch_*.pid > /dev/null 2>&1 &br; if [ $? -eq 0 ]; then &br; echo -n "Shutting down swatch" &br; for pid in /var/run/swatch_*.pid &br; do &br; kill $(cat $pid) &br; rm -f $pid &br; done &br; echo &br; rm -f /var/lock/subsys/swatch /tmp/.swatch_script.* &br; else &br; echo "swatch is not running" &br; fi &br; } &br; &br; status() { &br; ls /var/run/swatch_*.pid > /dev/null 2>&1 &br; if [ $? -eq 0 ]; then &br; echo -n "swatch (pid" &br; for pid in /var/run/swatch_*.pid &br; do &br; echo -n " `cat $pid`" &br; done &br; echo ") is running..." &br; else &br; echo "swatch is stopped" &br; fi &br; } &br; &br; case "$1" in &br; start) &br; start &br; ;; &br; stop) &br; stop &br; ;; &br; restart) &br; stop &br; start &br; ;; &br; status) &br; status &br; ;; &br; *) &br; echo "Usage: swatch {start|stop|restart|status}" &br; exit 1 &br; esac &br; &br; exit $RETVAL &br; | |[root@localhost ~]# chmod +x /etc/rc.d/init.d/swatch &color(lime){← SWATCH起動スクリプトへ実行権限付加};| |[root@localhost ~]# /etc/rc.d/init.d/swatch start &color(lime){← SWATCH起動};| |Starting swatch| |[root@localhost ~]# chkconfig --add swatch &color(lime){← SWATCH起動スクリプトをcheconfigへ登録};| |[root@localhost ~]# chkconfig --add swatch &color(lime){← SWATCH起動スクリプトをchkconfigへ登録};| |[root@localhost ~]# chkconfig swatch on &color(lime){← SWATCH自動起動設定};| |[root@localhost ~]# chkconfig --list swatch &color(lime){← SWATCH自動起動設定確認};| |swatch 0:off 1:off 2:on 3:on 4:on 5:on 6:off &color(lime){← ランレベル2~5のonを確認};| *SWATCH運用 [#f08c828d] 設定に従って各種ログファイルを監視し、不正アクセスを検知して該当ホストからのアクセスを24時間規制した場合、該当IPアドレスの[[whois>http://jprs.jp/info/whois/]]情報がメール通知されてくる。 &color(red){※SWATCHアクションスクリプト(swatch_action.sh)で規制IPアドレス情報通知先メールアドレスを指定した場合}; 同一IPアドレスからの不正アクセスが繰り返される場合、該当IPアドレスからのアクセス規制解除予約を削除して、該当IPアドレスからのアクセスを永久に規制するようにする。 |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi swatchatrm &color(lime){← アクセス規制解除予約削除処理スクリプト作成};| |#!/bin/sh &br; &br; &color(lime){# アクセス規制解除予約削除処理 &br; # &br; # 引数で指定した回数以上の不正アクセスを記録したIPアドレスのアクセス規制解除予約を削除して &br; # 該当IPアドレスからのアクセスを永久に規制する &br; # 引数に0を指定した場合は不正アクセス記録回数のみ表示して規制解除予約の削除は行わない}; &br; &br; [ $# -ne 1 ] && echo "usage is ${0} cnt" && exit 1 &br; for atq in `atq|awk '{print $1}'` &br; do &br; at -c ${atq}|grep "iptables -D INPUT -s " > /dev/null 2>&1 || continue &br; ip=`at -c ${atq}|grep "iptables -D INPUT -s "|sed -e 's/.*iptables -D INPUT -s \([^ ]*\) -j DROP.*/\1/p' -e d` &br; if [ ${1} -eq 0 ];then &br; echo -e "${ip}\t`cat /var/log/swatch/${ip}|wc -l`" &br; else &br; cnt=`cat /var/log/swatch/${ip}|wc -l` &br; [ ${cnt} -ge ${1} ] && \ &br; atrm ${atq} && echo -e "${ip}\\t`cat /var/log/swatch/${ip}|wc -l`" &br; fi &br; done &br; | |[root@localhost ~]# sh swatchatrm 0|sort -n -k 2 -r &color(lime){← 不正アクセス記録回数の多い順にアクセス規制解除待ちIPアドレスを表示};| |YYY.YYY.YYY.YYY 18 &br; XXX.XXX.XXX.XXX 12 &br; ZZZ.ZZZ.ZZZ.ZZZ 5 &br; | |[root@localhost ~]# sh swatchatrm 10 &color(lime){← 例として10回以上の不正アクセスを記録したIPアドレスからのアクセス規制解除予約を削除=永久に規制};| |XXX.XXX.XXX.XXX 12 &br; YYY.YYY.YYY.YYY 18 &br; | |[root@localhost ~]# sh swatchatrm 0|sort -n -k 2 -r &color(lime){← 不正アクセス記録回数の多い順にアクセス規制解除待ちIPアドレスを表示};|