Snortの警告の対応方法のテンプレート

■syslogチェック

 snortで以下のエラーが出るようになった。
 だいたい以下のような意味でよいのかな?

 「42行目のルールが読み込まれているけど、
 まだチェックされていないビットの立っているモジュールがあるよ。」

$ sudo less /var/log/syslog | grep -i "error\|warn\|crit" | awk -F\: '{print $4":"$5}'
 Warning: /etc/snort/rules/dos.rules(42) => threshold (in rule) is deprecated; use detection_filter instead.
 Warning: flowbits key 'smb.tree.create.llsrpc' is set but not ever checked.
 Warning: flowbits key 'community_uri.size.1050' is set but not ever checked.
 Warning: flowbits key 'ms_sql_seen_dns' is checked but not ever set.
 Warning: flowbits key 'realplayer.playlist' is checked but not ever set.

■該当ルールのチェック
  vi/vimで探すときは「:42」で移動できる。

 まだチェックされていないというのは、大抵使う必要が無いルールだから。
 該当ルールはコメントアウト済み。
 
 Windows 2000/WindowsNTとUNIX間の印刷サービスについて、
 不正な印刷要求をポート 515 に送信し、DOS攻撃とする。

 CVE-2000-0232
 http://www.iss.net/security_center/reference/jp/vuln/Windows_Printing_Service_DOS.htm

$ sudo nl -n ln -b a /etc/snort/rules/dos.rules | grep 2000-0232 | sed s/"(\|\,\|\;"/"&\n"/g
44      # alert tcp $EXTERNAL_NET !721:731 -> $HOME_NET 515 (
msg:"DOS WIN32 TCP print service denial of service attempt";
 flow:to_server,
established;
 dsize:>600;
 reference:bugtraq,
1082;
 reference:cve,
2000-0232;
 reference:url,
www.microsoft.com/technet/security/bulletin/MS00-021.mspx;
 classtype:attempted-dos;
 sid:3442;
 rev:3;
)

■脆弱性の範囲の確認

$ grep "515\/" /etc/services
printer         515/tcp         spooler         # line printer spooler
$ netstat -an | grep 515 || echo "Not Found"
Not Found

■代替の対策
 上位からも配下からも、このサーバに対して印刷サービスへの要求はないので、破棄する。

$ sudo grep "515" /etc/iptables-save
[0:0] -A INPUT -i eth0 -p tcp -m tcp --dport 515 -j DROP

■snort側の対応

 Snortの使用しないルール「CVE-2005-0095」を無効にし、デーモンの再起動。

$ sudo nl -n ln /etc/snort/rules/dos.rules | grep ^43 | cut -c -80
42      # alert udp $EXTERNAL_NET any -> $HOME_NET 2048 (msg:"DOS squid WCCP I_SE
$ sudo /etc/init.d/snort restart
Stopping Network Intrusion Detection System : snort (eth0 ...done).
Starting Network Intrusion Detection System : snort (eth0 using /etc/snort/snort.conf ...done).

■syslogチェックに戻る。
 定期的な作業なので、syslogのログでシステムメールを飛ばしても良い。
 debianでは、「MAILTO=""」でメールが飛ばないようにしていない限り、自動的にメールが来る。
 私の場合は、メールが飛ばないようにしているので、/var/log/syslogで確認する。

 ※手動的にmailコマンドにパイプしている行は、cronが走るとシステムメールを送る。
  私の環境では、root宛てのシステムメールのヘッダにも「X-Virus-Scanned」と「X-Spam-*」が付いている。

$ env EDITOR=vim crontab -e
$ env EDITOR=vim crontab -l
MAILTO=""
20 21 * * * grep "error\|warn\|crit" /var/log/syslog | mail -s "syslog report" root

$ sudo tail -f /var/log/syslog | grep -i cron
 (root) CMD (grep "error\|warn\|crit" /var/log/syslog | mail -s "syslog report" root)

■おまけ
 Snortの「tcpdump.log.*」は放置しているとパーティションを圧迫することがある。
 別途バックアップを行っているため、当該ログは不要。
 圧縮率も低いので、ローテーション指定日以前のログを削除。

 snort_log
 git@github.com:labunix/snort_log.git

$ sudo cat snort_deletelog.sh
#!/bin/bash
# Name        : snort_deletelog.sh
# Description : snort tcpdump.log rotate days ago, rm script
# Author      : labunix
# Last Update : 2012/05/12

# ローテーション日数nを指定
ROTATE=14

# root 権限を確認
if [ `id -u` -ne "0" ];then
  echo "Sorry,Not Permit User!"
  exit 1
fi

# Snort ログディレクトリの定義
SNORTLOG=/var/log/snort
test -d $SNORTLOG || exit 1

# 一時ファイル定義
SNORTTEMP=/tmp/snort_list.tmp
touch $SNORTTEMP || exit 1
chmod 600 $SNORTTEMP || exit 1

# n日以上経ったログを取得
find $SNORTLOG -name "tcpdump.log.*[0-9]" -mtime +$ROTATE \
  -exec ls -l {} \; > $SNORTTEMP

# $SNORTTEMP のサイズがゼロで無ければ、システムメールを送信、削除処理を行う。
if [ -s $SNORTTEMP ];then
  echo "KeyDay:"`env LANG=C date --date "${ROTATE} days ago"` >> $SNORTTEMP
  cat $SNORTTEMP | mail -s "Snort tcpdump.log Delete" root
  find $SNORTLOG -name "tcpdump.log.*[0-9]" -mtime +$ROTATE \
    -exec rm -f {} \;
else
  echo "Do Nothing"
fi
rm -f $SNORTTEMP
unset SNORTTEMP
exit 0