SWATCH動作に必要なPerlモジュールインストール
[root@falcon21 ~]# yum -y install perl-File-Tail インストール: perl-File-Tail.noarch 0:0.99.3-21.el7 完了しました! ------------------------------------ SWATCHインストール [root@falcon21 ~]# yum -y install swatch インストール: swatch.noarch 0:3.2.3-24.el7 完了しました! --------------------------------------- SWATCHアクションスクリプト作成 SWATCHが検知したIPアドレスからの累積不正アクセス数が3回ごとまたは、引数でblock※と指定された場合、該当IPアドレスからのアクセスを24時間規制するシェルスクリプトを作成する [root@falcon21 ~]# vi /usr/local/bin/swatch_action.sh #!/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://falcon21.space/iptables.shtml%E3%81%AEiptables%E5%86%8D%E8%B5%B7%E5%8B%95%E5%AF%BE%E5%BF%9C [ -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://falcon21.space/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@falcon21 ~]# chmod 700 /usr/local/bin/swatch_action.sh --------------------------------------- SWATCH設定ファイル格納ディレクトリ作成 [root@falcon21 ~]# mkdir /etc/swatch ------------------------------------ SWATCHログ切替え設定ファイル作成 [root@falcon21 ~]# vi /etc/logrotate.d/swatch /var/log/swatch/swatch.log { missingok notifempty sharedscripts postrotate /etc/rc.d/init.d/swatch restart > /dev/null || true endscript } ------------------------------- /var/log/messages監視用設定ファイル作成 [root@falcon21 ~]# vi /etc/swatch/secure.conf # 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@falcon21 ~]# vi /etc/swatch/maillog.conf # 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@falcon21 ~]# vi /etc/rc.d/init.d/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@falcon21 ~]# chmod +x /etc/rc.d/init.d/swatch SWATCH起動 [root@falcon21 ~]# /etc/rc.d/init.d/swatch start Reloading systemd: [ OK ] Starting swatch (via systemctl): [ OK ] [root@falcon21 ~]# chkconfig --add swatch [root@falcon21 ~]# chkconfig swatch on ********************************************************** 設定に従って各種ログファイルを監視し、不正アクセスを検知して該当ホストからのアクセスを24時間規制した場合、該当IPアドレスのwhois情報がメール通知されてくる。 ※SWATCHアクションスクリプト(swatch_action.sh)で規制IPアドレス情報通知先メールアドレスを指定した場合 同一IPアドレスからの不正アクセスが繰り返される場合、該当IPアドレスからのアクセス規制解除予約を削除して、該当IPアドレスからのアクセスを永久に規制するようにする アクセス規制解除予約削除処理スクリプト作成 [root@falcon21 ~]# 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 不正アクセス記録回数の多い順にアクセス規制解除待ちIPアドレスを表示 [root@falcon21 ~]# sh swatchatrm 0|sort -n -k 2 -r 例として10回以上の不正アクセスを記録したIPアドレスからのアクセス規制解除予約を削除=永久に規制 [root@falcon21 ~]# sh swatchatrm 10 不正アクセス記録回数の多い順にアクセス規制解除待ちIPアドレスを表示 [root@falcon21 ~]# sh swatchatrm 0|sort -n -k 2 -r ***************************************************************
投票数:0
平均点:0.00