Snort

Snort
ネットワーク型IDS(不正アクセス検知システム)の一種。
ユーザ登録をすればフリーで使えるので、自鯖屋にとってはありがたい存在。
正確な検出を行う為にはルールを自分で書く必要があるが、初期テンプレートが数種類用意されているので、
そのまんまでもある程度は動いてくれる。


検出結果は生ログを出力する方法と、BASEを経由させてWeb画面で見る方法等がある。
Snortの以前のバージョンではログをMySQLへ直接出力し、その結果をBASEで表示させる事が出来たのだが、
現在のSnortではMySQLへの直接出力をサポートしていない。
その為、間にBarnyard2を噛ませる事によってMySQLへ出力も行い、BASEからの参照を可能にする構成を取る事が多い。


一連の構成は、

"Snort" -> [BinaryLOG] -> "Barnyard2" -> [SQL] -> "MySQL" -> [http] -> "BASE"

の流れになる。

インストール

0. 事前準備
今回のメモは、"Snort+Barnyard2+BASE"の構成とする。 -> Barnyard2の構築方法はコチラ
Snortの利用登録(無料)とSnort本体+ルールファイルのダウンロードは事前に行っておく。
本体とルールファイルのバージョンは同じ物を使用する事。

Snort本体:snort-2.9.x.x.tar.gz
ルールファイル:snortrules-snapshot-29xx.tar.gz



1. daqのビルド
Snortに必要なDAQをインストールする。

# tar zxvf daq-2.0.2.tar.gz
# cd daq-2.0.2
# ./configure --prefix=/usr/local/daq-2.0.2
# make && make install
# cd /usr/local
# ln -s /usr/local/daq-2.0.2 ./daq



2. Snortのビルド
configure.optionのレシピは以下の通り

# vi configure.option
=====
--prefix=/usr/local/snort-2.9.6.2 \
--with-mysql-libraries=/usr/local/mysql/lib \
--with-daq-includes=/usr/local/daq/include \
--with-daq-libraries=/usr/local/daq/lib \
--enable-targetbased \
--enable-dynamicplugin \
--enable-sourcefire \
--enable-reload \
--enable-zlib \
--enable-gre \
--enable-ppm \
--enable-perfprofiling


# tar zxvf snort-2.9.6.2.tar.gz
# cd snort-2.9.6.2
# ./configure `cat configure.option`
# make
# make install
# cd /usr/local
# ln -s /usr/local/snort-2.9.6.2 ./snort


# cd ${SnortSrcDir}
# cp -a etc /etc/snort
# chown -R root.root /etc/snort && chmod -R 644 /etc/snort
# rm /etc/snort/Makefile*
# cp rpm/snortd /etc/init.d/snortd
# cp rpm/snort.sysconfig /etc/sysconfig/snort
# cp rpm/snort.logrotate /etc/logrotate.d/snort
# mkdir /var/log/snort
# chown snort.snort /var/log/snort && chmod 755 /var/log/snort



3. Snortのコンフィグ
Snortのコンフィグや起動スクリプトを書き換える。
上記の通りBarnyard2との連携を前提とする為、ログの出力は行わない設定にする。
※以下のメモでは変更した箇所のみを記載

# vi /etc/init.d/snortd
=====
6 :: # chkconfig: 2345 90 10
11 :: SNORT_BIN=/usr/local/snort/bin/snort
107 :: daemon ${SNORT_BIN} ...~... $BPFFILE $BPF
116 :: daemon ${SNORT_BIN} ...~... $BPFFILE $BPF
120 :: daemon ${SNORT_BIN} ...~... $BPFFILE $BPF


# vi /etc/sysconfig/snort
=====
59 :: #LOGDIR=/var/log/snort
69 :: #ALERTMODE=fast
75 :: #DUMP_APP=1
81 :: #BINARY_LOG=1
87 :: #NO_PACKET_LOG=0
92 :: #PRINT_INTERFACE=0


# vi /etc/snort/snort.conf
=====
45 :: ipvar HOME_NET 192.168.0.0/24
48 :: ipvar EXTERNAL_NET !$HOME_NET
104 :: var RULE_PATH /etc/snort/rules
105 :: var SO_RULE_PATH /etc/snort/so_rules
106 :: var PREPROC_RULE_PATH /etc/snort/preproc_rules
109 :: var WHITE_LIST_PATH /etc/snort/rules
110 :: var BLACK_LIST_PATH /etc/snort/rules
242 :: # path to dynamic preprocessor libraries
243 :: dynamicpreprocessor directory /usr/local/snor/lib/snort_dynamicpreprocessor/
245 :: # path to base preprocessor engine
246 :: dynamicengine /usr/local/snort/lib/snort_dynamicengine/libsf_engine.so
248 :: # path to dynamic rules libraries
249 :: #dynamicdetection directory /usr/local/snort/lib/snort_dynamicrules
517 :: output unified2: filename snort-barnyard.log, limit 128
674 :: # dynamic library rules
675 :: include $SO_RULE_PATH/bad-traffic.rules
676 :: include $SO_RULE_PATH/browser-ie.rules
677 :: include $SO_RULE_PATH/chat.rules
678 :: include $SO_RULE_PATH/dos.rules
679 :: include $SO_RULE_PATH/exploit.rules
680 :: include $SO_RULE_PATH/file-flash.rules
681 :: include $SO_RULE_PATH/icmp.rules
682 :: include $SO_RULE_PATH/imap.rules
683 :: include $SO_RULE_PATH/misc.rules
684 :: include $SO_RULE_PATH/multimedia.rules
685 :: include $SO_RULE_PATH/netbios.rules
686 :: include $SO_RULE_PATH/nntp.rules
687 :: include $SO_RULE_PATH/p2p.rules
688 :: include $SO_RULE_PATH/smtp.rules
689 :: include $SO_RULE_PATH/snmp.rules
690 :: include $SO_RULE_PATH/specific-threats.rules
691 :: include $SO_RULE_PATH/web-activex.rules
692 :: include $SO_RULE_PATH/web-client.rules
693 :: include $SO_RULE_PATH/web-iis.rules
694 :: include $SO_RULE_PATH/web-misc.rules



4. ルールファイルの設置
Snortは不正パケットの検出ルールが必要。
ルールファイルはSnortのオフィシャルからダウンロード可能。もちろん、自作する事も可能。

# tar snortrules-snapshot-2962.tar.gz
# cp etc/sid-msg.map /etc/snort/
# cp -a preproc_rules /etc/snort/
# cp -a rules /etc/snort/
# cp -a so_rules /etc/snort/
# touch /etc/snort/rules/black_list.rules
# touch /etc/snort/rules/white_list.rules



5. ログローテート
ローテートスクリプトは色々な書き方がある。
今回は一例としてsystemctlを使いつつ、Snortのローテートに対応した書き方をメモ。
この時、Barnyard2で使っている"barnyard2.waldo"ファイルはローテートさせない事。
waldoファイルをローテートしてしまうと、Barnyard2がSnortのタイムスタンプを追えなくなってしまい、
"/var/log/messages"に大量のワーニングが出る。

# vi /etc/logrotate.d/snort
=====
# /etc/logrotate.d/snort
# $Id$

/var/log/snort/alert /var/log/snort/snort* {
    weekly
    rotate 4
    missingok
    nocompress
    sharedscripts
    postrotate
        /bin/systemctl restart snortd.service && /bin/systemctl restart barnyard2.service || true
    endscript
}

上のlogrotateスクリプトでも"/var/log/messages"にWARNINGが出る時は、
cronでsnortを再起動してあげれば、勝手にローテーションがかかる。

# vi /etc/cron.weekly/logrotate.snort
=====
#!/bin/sh
/bin/systemctl restart snortd.service && /bin/systemctl restart barnyard2.service


起動テスト

Snortの動作テスト用に、pingをalertとして検知する検出ルールを自作する。

# vi /etc/snort/rules/icmp.rules
=====
21 :: alert icmp any any -> $HOME_NET any (msg:"ICMP alert test"; sid:20000001; rev:20000001)