| 1 | [wiki:WikiStart 戻る] |
| 2 | |
| 3 | ログ監視ツール導入(SWATCH) |
| 4 | |
| 5 | ■概要 |
| 6 | システムのログファイル(/var/log/messages等任意のログファイル)を監視し、特定のメッセージを検知してリアルタイムに任意のアクションを実行することができるSWATCHを導入して、不正アクセス元からのアクセスを即ブロックする。 |
| 7 | なお、該当IPアドレスは動的IPアドレスの場合もあり、該当IPアドレスが正当なユーザに割当てられた場合に正当なユーザがアクセスできなくなってしまうので、24時間後にアクセス制限を自動的に解除するようにする。 |
| 8 | |
| 9 | |
| 10 | |
| 11 | ■SWATCHインストール |
| 12 | {{{ |
| 13 | [root@fedora ~]# yum -y install perl-File-Tail ← SWATCHに必要なFile::Tailインストール |
| 14 | [root@fedora ~]# yum -y install swatch ← SWATCHインストール |
| 15 | }}} |
| 16 | |
| 17 | ■SWATCH設定 |
| 18 | (1)SWATCHアクションスクリプト作成 |
| 19 | SWATCHが検知したIPアドレスからの累積不正アクセス数が3回以上になった場合または、引数でlock※と指定された場合、該当IPアドレスからのアクセスを24時間規制するシェルスクリプトを作成する |
| 20 | ※Ping of Death等悪意のあるアクセスを即規制するためのオプション |
| 21 | {{{ |
| 22 | [root@fedora ~]# vi /usr/local/bin/swatch_action.sh ← SWATCHアクションスクリプト作成 |
| 23 | #!/bin/bash |
| 24 | PATH=/bin:/sbin:/usr/bin |
| 25 | LANG=C |
| 26 | # 規制IPアドレス情報メール通知先設定 |
| 27 | # ※メール通知しない場合は下記をコメントアウト |
| 28 | mail=root |
| 29 | # ログを標準入力から取得 |
| 30 | read LOG |
| 31 | # ログからIPアドレスを抽出 |
| 32 | IPADDR=`echo $LOG|cut -d " " -f $1` |
| 33 | echo "$IPADDR"|grep "^[0-9]*\." > /dev/null 2>&1 |
| 34 | if [ $? -eq 0 ]; then |
| 35 | # IPアドレスから始まる場合 |
| 36 | IPADDR=`echo "$IPADDR"|sed -e 's/\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d` |
| 37 | else |
| 38 | # IPアドレス以外から始まる場合 |
| 39 | IPADDR=`echo "$IPADDR"|sed -e 's/.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d` |
| 40 | fi |
| 41 | |
| 42 | # IPアドレスをピリオドで分割 |
| 43 | addr1=`echo $IPADDR|cut -d . -f 1` |
| 44 | addr2=`echo $IPADDR|cut -d . -f 2` |
| 45 | addr3=`echo $IPADDR|cut -d . -f 3` |
| 46 | addr4=`echo $IPADDR|cut -d . -f 4` |
| 47 | |
| 48 | # IPアドレスがプライベートIPアドレスの場合は終了 |
| 49 | if [ "$IPADDR" = "127.0.0.1" ]; then |
| 50 | exit |
| 51 | elif [ $addr1 -eq 10 ]; then |
| 52 | exit |
| 53 | elif [ $addr1 -eq 172 ] && [ $addr2 -ge 16 ] && [ $addr2 -le 31 ]; then |
| 54 | exit |
| 55 | elif [ $addr1 -eq 192 ] && [ $addr2 -eq 168 ]; then |
| 56 | exit |
| 57 | fi |
| 58 | |
| 59 | # 不正アクセスログメッセージをIPアドレス別ログファイルに記録 |
| 60 | echo $LOG >> /var/log/swatch/$IPADDR |
| 61 | |
| 62 | # IPアドレス別ログファイルから累積不正アクセス数取得 |
| 63 | cnt=`cat /var/log/swatch/$IPADDR | wc -l` |
| 64 | |
| 65 | # 該当IPアドレスからの累積不正アクセス数が3以上の場合または |
| 66 | # 引数でlockと指定された場合アクセス規制 |
| 67 | if [ $cnt -ge 3 ] || [ $# -eq 2 -a "$2" = "lock" ]; then |
| 68 | # 該当IPアドレスからのアクセスを拒否するルールを挿入 |
| 69 | iptables -I INPUT -s $IPADDR -j DROP |
| 70 | |
| 71 | # 上記ルールを24時間後に削除するスケジュールを登録 |
| 72 | echo "iptables -D INPUT -s $IPADDR -j DROP > /dev/null 2>&1" | \ |
| 73 | at now+24hour > /dev/null 2>&1 |
| 74 | |
| 75 | # アクセス規制IPアドレス情報をメール通知 |
| 76 | [ "$mail" != "" ] && (cat /var/log/swatch/$IPADDR ; \ |
| 77 | echo ; whois $IPADDR) | \ |
| 78 | mail -s "$IPADDR $cnt lock!" $mail |
| 79 | |
| 80 | echo "`date` $IPADDR $cnt lock!" |
| 81 | else |
| 82 | echo "`date` $IPADDR $cnt" |
| 83 | fi |
| 84 | |
| 85 | [root@fedora ~]# chmod 700 /usr/local/bin/swatch_action.sh ← SWATCHアクションスクリプトへ実行権限付加 |
| 86 | }}} |
| 87 | |
| 88 | (2)SWATCH設定 |
| 89 | {{{ |
| 90 | [root@fedora ~]# mkdir /etc/swatch ← SWATCH設定ファイル格納ディレクトリ作成 |
| 91 | [root@fedora ~]# vi /etc/logrotate.d/swatch ← SWATCHログ切替え設定ファイル作成 |
| 92 | /var/log/swatch/swatch.log { |
| 93 | missingok |
| 94 | notifempty |
| 95 | sharedscripts |
| 96 | postrotate |
| 97 | /etc/rc.d/init.d/swatch restart > /dev/null || true |
| 98 | endscript |
| 99 | } |
| 100 | }}} |
| 101 | |
| 102 | (3)/var/log/messages監視設定 |
| 103 | 以下のメッセージを検知したら該当ホストからのアクセスを24時間規制するようにする |
| 104 | {{{ |
| 105 | Oct 21 05:20:12 fedora named[14130]: client XXX.XXX.XXX.XXX#55199: query 'VERSION.BIND/TXT/CH' denied |
| 106 | |
| 107 | [root@fedora ~]# vi /etc/swatch/messages.conf ← /var/log/messages監視用設定ファイル作成 |
| 108 | # logfile /var/log/messages |
| 109 | |
| 110 | # BINDのバージョン照会を検知したら該当ホストからのアクセスを24時間規制 |
| 111 | # ※DNSサーバー(BIND)構築済であること |
| 112 | watchfor /query \'VERSION\.BIND\/TXT\/CH\' denied/ |
| 113 | pipe "/usr/local/bin/swatch_action.sh 7 lock" |
| 114 | |
| 115 | # アクセス無許可ホストからのDNS使用を検知したら該当ホストからのアクセスを24時間規制 |
| 116 | # ※DNSサーバー(BIND)構築済であること |
| 117 | watchfor /named.*client.*query.*denied/ |
| 118 | pipe "/usr/local/bin/swatch_action.sh 7 lock" |
| 119 | }}} |
| 120 | |
| 121 | (4)/var/log/secure監視設定※SSHサーバー構築済であること |
| 122 | ・以下のメッセージを検知したら該当ホストからのアクセスを24時間規制するようにする |
| 123 | {{{ |
| 124 | Jan 24 09:32:07 fedora sshd[21171]: refused connect from ::ffff:XXX.XXX.XXX.XXX (::ffff:XXX.XXX.XXX.XXX) |
| 125 | {{{ |
| 126 | ・以下のメッセージを3回以上検知したら該当ホストからのアクセスを24時間規制するようにする |
| 127 | {{{ |
| 128 | Jan 28 19:32:10 fedora sshd[16367]: Invalid user admin from XXX.XXX.XXX.XXX |
| 129 | }}} |
| 130 | |
| 131 | {{{ |
| 132 | [root@fedora ~]# vi /etc/swatch/secure.conf ← /var/log/secure監視用設定ファイル作成 |
| 133 | # logfile /var/log/secure |
| 134 | |
| 135 | # アクセス無許可ホストからのSSHログイン失敗を検知したら該当ホストからのアクセスを24時間規制 |
| 136 | # ※/etc/hosts.deny、/etc/hosts.allowでアクセス許可ホストを制限していることが前提 |
| 137 | watchfor /sshd.*refused/ |
| 138 | pipe "/usr/local/bin/swatch_action.sh 10 lock" |
| 139 | |
| 140 | # アクセス許可ホストからのSSHログイン失敗を3回以上検知したら該当ホストからのアクセスを24時間規制 |
| 141 | watchfor /sshd.*Invalid user/ |
| 142 | pipe "/usr/local/bin/swatch_action.sh 10" |
| 143 | }}} |
| 144 | |
| 145 | (5)/var/log/vsftpd.log監視設定※FTPサーバー(vsftpd)構築済であること |
| 146 | ・以下のメッセージを検知したら該当ホストからのアクセスを24時間規制するようにする |
| 147 | {{{ |
| 148 | Fri Jul 28 15:55:44 2006 [pid 28097] CONNECT: Client "XXX.XXX.XXX.XXX", "Connection refused: tcp_wrappers denial." |
| 149 | }}} |
| 150 | ・以下のメッセージを3回以上検知したら該当ホストからのアクセスを24時間規制するようにする |
| 151 | {{{ |
| 152 | Tue May 23 16:34:10 2006 [pid 11167] [xxxxxxxx] FAIL LOGIN: Client "XXX.XXX.XXX.XXX" |
| 153 | }}} |
| 154 | {{{ |
| 155 | [root@fedora ~]# vi /etc/swatch/vsftpd.conf ← /var/log/vsftpd.log監視用設定ファイル作成 |
| 156 | # logfile /var/log/vsftpd.log |
| 157 | |
| 158 | # アクセス無許可ホストからのFTPログイン失敗を検知したら該当ホストからのアクセスを24時間規制 |
| 159 | # ※/etc/hosts.deny、/etc/hosts.allowでアクセス許可ホストを制限していることが前提 |
| 160 | watchfor /Connection refused: tcp_wrappers denial/ |
| 161 | pipe "/usr/local/bin/swatch_action.sh 10 lock" |
| 162 | |
| 163 | # アクセス許可ホストからのFTPログイン失敗を3回以上検知したら該当ホストからのアクセスを24時間規制 |
| 164 | watchfor /FAIL LOGIN/ |
| 165 | pipe "/usr/local/bin/swatch_action.sh 12" |
| 166 | }}} |
| 167 | |
| 168 | (6)/var/log/maillog監視設定※vpopmail構築済であること |
| 169 | ・以下のメッセージを検知したら該当ホストからのアクセスを24時間規制するようにする |
| 170 | {{{ |
| 171 | Sep 25 01:02:53 fedora vpopmail[30896]: vchkpw-smtp: vpopmail user not found xxxxxxxx@:XXX.XXX.XXX.XXX |
| 172 | Oct 4 20:09:00 fedora vpopmail[27103]: vchkpw-pop3: vpopmail user not found xxxxxxxx@:XXX.XXX.XXX.XXX |
| 173 | Oct 4 20:10:20 fedora vpopmail[27208]: vchkpw-pop3s: vpopmail user not found xxxxxxxx@:XXX.XXX.XXX.XXX |
| 174 | }}} |
| 175 | |
| 176 | {{{ |
| 177 | [root@fedora ~]# vi /etc/swatch/maillog.conf ← /var/log/maillog監視用設定ファイル作成 |
| 178 | # logfile /var/log/maillog |
| 179 | |
| 180 | # 存在しないユーザ名によるvpopmail認証試行を検知したら該当ホストからのアクセスを24時間規制 |
| 181 | watchfor /vpopmail user not found/ |
| 182 | pipe "/usr/local/bin/swatch_action.sh 11 lock" |
| 183 | }}} |
| 184 | |
| 185 | ■SWATCH起動 |
| 186 | |
| 187 | {{{ |
| 188 | [root@fedora ~]# vi /etc/rc.d/init.d/swatch ← SWATCH起動スクリプト作成 |
| 189 | #!/bin/bash |
| 190 | # |
| 191 | # swatch |
| 192 | # |
| 193 | # chkconfig: 2345 90 35 |
| 194 | # description: swatch start/stop script |
| 195 | |
| 196 | # Source function library. |
| 197 | . /etc/rc.d/init.d/functions |
| 198 | |
| 199 | PATH=/sbin:/usr/local/bin:/bin:/usr/bin |
| 200 | |
| 201 | mkdir -p /var/log/swatch |
| 202 | |
| 203 | start() { |
| 204 | # Start daemons. |
| 205 | ls /var/run/swatch_*.pid > /dev/null 2>&1 |
| 206 | if [ $? -ne 0 ]; then |
| 207 | echo -n "Starting swatch" |
| 208 | pno=0 |
| 209 | for conf in /etc/swatch/*.conf |
| 210 | do |
| 211 | pno=`expr $pno + 1` |
| 212 | WATCHLOG=`grep "^# logfile" $conf | awk '{ print $3 }'` |
| 213 | swatch --config-file $conf --tail-file $WATCHLOG \ |
| 214 | --script-dir=/tmp --awk-field-syntax --use-cpan-file-tail --daemon \ |
| 215 | --pid-file /var/run/swatch_$pno.pid \ |
| 216 | >> /var/log/swatch/swatch.log 2>&1 |
| 217 | RETVAL=$? |
| 218 | [ $RETVAL != 0 ] && return $RETVAL |
| 219 | done |
| 220 | echo |
| 221 | [ $RETVAL = 0 ] && touch /var/lock/subsys/swatch |
| 222 | return $RETVAL |
| 223 | else |
| 224 | echo "swatch is already started" |
| 225 | fi |
| 226 | } |
| 227 | |
| 228 | stop() { |
| 229 | # Stop daemons. |
| 230 | ls /var/run/swatch_*.pid > /dev/null 2>&1 |
| 231 | if [ $? -eq 0 ]; then |
| 232 | echo -n "Shutting down swatch" |
| 233 | for pid in /var/run/swatch_*.pid |
| 234 | do |
| 235 | kill $(cat $pid) |
| 236 | rm -f $pid |
| 237 | done |
| 238 | echo |
| 239 | rm -f /var/lock/subsys/swatch /tmp/.swatch_script.* |
| 240 | else |
| 241 | echo "swatch is not running" |
| 242 | fi |
| 243 | } |
| 244 | |
| 245 | status() { |
| 246 | ls /var/run/swatch_*.pid > /dev/null 2>&1 |
| 247 | if [ $? -eq 0 ]; then |
| 248 | echo -n "swatch (pid" |
| 249 | for pid in /var/run/swatch_*.pid |
| 250 | do |
| 251 | echo -n " `cat $pid`" |
| 252 | done |
| 253 | echo ") is running..." |
| 254 | else |
| 255 | echo "swatch is stopped" |
| 256 | fi |
| 257 | } |
| 258 | |
| 259 | case "$1" in |
| 260 | start) |
| 261 | start |
| 262 | ;; |
| 263 | stop) |
| 264 | stop |
| 265 | ;; |
| 266 | restart) |
| 267 | stop |
| 268 | start |
| 269 | ;; |
| 270 | status) |
| 271 | status |
| 272 | ;; |
| 273 | *) |
| 274 | echo "Usage: swatch {start|stop|restart|status}" |
| 275 | exit 1 |
| 276 | esac |
| 277 | |
| 278 | exit $RETVAL |
| 279 | |
| 280 | [root@fedora ~]# chmod +x /etc/rc.d/init.d/swatch ← SWATCH起動スクリプトへ実行権限付加 |
| 281 | |
| 282 | [root@fedora ~]# /etc/rc.d/init.d/swatch start ← SWATCH起動 |
| 283 | Starting swatch |
| 284 | |
| 285 | [root@fedora ~]# chkconfig --add swatch ← SWATCH起動スクリプトをcheconfigへ登録 |
| 286 | |
| 287 | [root@fedora ~]# chkconfig --list swatch ← SWATCH自動起動設定確認 |
| 288 | swatch 0:off 1:off 2:on 3:on 4:on 5:on 6:off ← ランレベル2~5のonを確認 |
| 289 | }}} |
| 290 | |
| 291 | ■SWATCHその他 |
| 292 | 設定に従って各種ログファイルを監視し、不正アクセスを検知して該当ホストからのアクセスを24時間規制した場合、該当IPアドレスのwhois情報がメール通知されてくる。 |
| 293 | ※SWATCHアクションスクリプト(swatch_action.sh)で規制IPアドレス情報通知先メールアドレスを指定した場合 |
| 294 | |
| 295 | IPアドレスの規制状態は以下のコマンドで確認可能 |
| 296 | {{{ |
| 297 | [root@fedora ~]# iptables -L INPUT -n|grep DROP ← iptablesによる受信拒否ルールの照会 |
| 298 | Chain INPUT (policy DROP) |
| 299 | DROP all -- XXX.XXX.XXX.XXX 0.0.0.0/0 |
| 300 | DROP all -- XXX.XXX.XXX.XXX 0.0.0.0/0 |
| 301 | }}} |
| 302 | |
| 303 | IPアドレスの規制解除予約状態は以下のコマンドで確認可能 |
| 304 | {{{ |
| 305 | [root@fedora ~]# atq|sort ← atコマンドによる予約キューの照会 |
| 306 | 114 2006-02-04 09:32 a root |
| 307 | 115 2006-02-04 09:33 a root |
| 308 | |
| 309 | [root@fedora ~]# at -c 114|tail -2 ← atコマンドにより予約されている処理の照会 |
| 310 | iptables -D INPUT -s XXX.XXX.XXX.XXX -j DROP > /dev/null 2>&1 |
| 311 | |
| 312 | [root@fedora ~]# at -c 115|tail -2 ← atコマンドにより予約されている処理の照会 |
| 313 | iptables -D INPUT -s XXX.XXX.XXX.XXX -j DROP > /dev/null 2>&1 |
| 314 | }}} |
| 315 | |
| 316 | 上記例の場合、iptablesによるアクセス拒否ルールの削除コマンドが、2006-02-04 09:32と2006-02-04 09:33に予約されている |