*Snort [#n0cf71cc] [[Snort:+https://www.snort.org/]] ネットワーク型IDS(不正アクセス検知システム)の一種。 ユーザ登録をすればフリーで使えるので、自鯖屋にとってはありがたい存在。 正確な検出を行う為にはルールを自分で書く必要があるが、初期テンプレートが数種類用意されているので、 そのまんまでもある程度は動いてくれる。 ~ 検出結果は生ログを出力する方法と、BASEを経由させてWeb画面で見る方法等がある。 Snortの以前のバージョンではログをMySQLへ直接出力し、その結果をBASEで表示させる事が出来たのだが、 現在のSnortではMySQLへの直接出力をサポートしていない。 その為、間にBarnyard2を噛ませる事によってMySQLへ出力も行い、BASEからの参照を可能にする構成を取る事が多い。 ~ 一連の構成は、 "Snort" -> [BinaryLOG] -> "Barnyard2" -> [SQL] -> "MySQL" -> [http] -> "BASE" の流れになる。 ~ *インストール [#f8c63645] &size(16){&font(b){0. 事前準備};}; &font(b){今回のメモは、"Snort+Barnyard2+BASE"の構成とする。}; -> Barnyard2の構築方法は[[コチラ:+http://www.ns-lab.org/wiki/?Linux%2FSource%2FBarnyard2]] Snortの利用登録(無料)とSnort本体+ルールファイルのダウンロードは事前に行っておく。 本体とルールファイルのバージョンは同じ物を使用する事。 Snort本体:snort-2.9.x.x.tar.gz ルールファイル:snortrules-snapshot-29xx.tar.gz ~ &size(16){&font(b){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 ~ &size(16){&font(b){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 /etc/snort && chmod 755 /var/log/snort # chown snort.snort /var/log/snort && chmod 755 /var/log/snort ~ &size(16){&font(b){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 ~ &size(16){&font(b){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 ~ &size(16){&font(b){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 ~ *起動テスト [#sa600521] 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)