IDS
侵入検知システム:Instrusion Detection System の事らしい。ホスト型IDSとネットワーク型IDSの2つがあるらしいが、今回のSnortはネットワーク型のIDSだ。
ホスト型のIDSは不正アクセスやファイル改ざんを検知する。という事で前回のTripwireもIDSの一種という事らしい。なるほろ。
ネットワーク型のIDSであるSnortはTCP・UDP・IPなどのプロトコル解析が可能。シグネチャというルールを設定して検知を行うらしい。シグネチャはルールヘッダとルールボディで構成される。
まずは使ってみよう。
全く使った事もないので、どんなものかも想像つかない。こんな時は触ってみるのが一番早い。なんとなく今回のSnortはわりときっちりやろうと思っている。きっちりやった所は試験にあまり出ないというジンクスがあるけれど・・・。
以下、インストールメモ
参考サイト
CentOSで自宅サーバー構築
バージョンも変わっているので、紆余曲折はありましたが何とかインストールは完了しました。
まずは公式サイトからSnortをダウンロード。
wget https://www.snort.org/downloads/snort/snort-2.9.7.0.tar.gz
RPM作成に必要なものとか、何やら必要だったパッケージを下のとおり。
yum -y install libpcap-devel
yum --enablerepo=epel install libdnet libpcap
yum install libc.so.6
yum -y install libpcap.so.1
yum -y install mysql-bench php-pear
参考サイトに習ってrpm化して入れます。 # rpmbuild -tb --clean --with mysql snort-2.9.7.0.tar.gz
なんだかんだで上手くいきました。
daqは探してきてインストールした。 # rpm -ivh daq-2.0.2-1.centos6.x86_64.rpm 準備中... ########################################### [100%] 1:daq ########################################### [100%] 出来上がったrpmをインストールしました。 # rpm -ivh /root/rpmbuild/RPMS/x86_64/snort-2.9.7.0-1.x86_64.rpm 準備中... ########################################### [100%] 1:snort ########################################### [100%]
おや、MySQLのrpmができてない
できたーと思ってたけれど良くみると参考サイトと同じ–with mysqlを付けたのにrpmが出来ていない様子。
specファイルを確認するとmysqlの記述がなくなったようだ。過去に遡って2.9.1.1でようやく見つけた。
# grep mysql snort-2.9.7.0/rpm/snort.spec
# grep mysql snort-2.9.3.1/rpm/snort.spec
# grep mysql snort-2.9.1.1/rpm/snort.spec # --with mysql # Default of no MySQL, but --with mysql will enable it %define mysql 0 %{?_with_mysql:%define mysql 1} %define mysql 1 %package mysql %if %{mysql}
参考サイト
ももーい鯖覚書
上記のサイトなどを見ると、snort-2.9.3からできなくなった模様。
書き出し先にデータベースを利用するのは他にも方法があるようなので、stableの最新2.9.7で進めることにします。
ま、動かしてみよう。
# snort Running in packet dump mode --== Initializing Snort ==-- Initializing Output Plugins! pcap DAQ configured to passive. Acquiring network traffic from "eth0". Decoding Ethernet --== Initialization Complete ==-- ,,_ -*> Snort! <*- o" )~ Version 2.9.7.0 GRE (Build 149) '''' By Martin Roesch & The Snort Team: http://www.snort.org/contact#team Copyright (C) 2014 Cisco and/or its affiliates. All rights reserved. Copyright (C) 1998-2013 Sourcefire, Inc., et al. Using libpcap version 1.4.0 Using PCRE version: 7.8 2008-09-05 Using ZLIB version: 1.2.3
犬さんか豚さんか分からないけど、ロゴが出てTcpdumpのようにsshのパケットがざ~っと流れる。違うのは最後でCtrl+cで止めると色々と情報が表示されました。
=============================================================================== Run time for packet processing was 0.623684 seconds Snort processed 249 packets. Snort ran for 0 days 0 hours 0 minutes 0 seconds Pkts/sec: 249 =============================================================================== Memory usage summary: Total non-mmapped bytes (arena): 806912 Bytes in mapped regions (hblkhd): 12906496 Total allocated space (uordblks): 669568 Total free space (fordblks): 137344 Topmost releasable block (keepcost): 132128 =============================================================================== Packet I/O Totals: Received: 249 Analyzed: 249 (100.000%) Dropped: 0 ( 0.000%) Filtered: 0 ( 0.000%) Outstanding: 0 ( 0.000%) Injected: 0 =============================================================================== Breakdown by protocol (includes rebuilt packets): Eth: 249 (100.000%) VLAN: 0 ( 0.000%) IP4: 249 (100.000%) Frag: 0 ( 0.000%) ICMP: 0 ( 0.000%) UDP: 2 ( 0.803%) TCP: 246 ( 98.795%) IP6: 0 ( 0.000%) IP6 Ext: 0 ( 0.000%) IP6 Opts: 0 ( 0.000%) Frag6: 0 ( 0.000%) ICMP6: 0 ( 0.000%) UDP6: 0 ( 0.000%) TCP6: 0 ( 0.000%) Teredo: 0 ( 0.000%) ICMP-IP: 0 ( 0.000%) IP4/IP4: 0 ( 0.000%) IP4/IP6: 0 ( 0.000%) IP6/IP4: 0 ( 0.000%) IP6/IP6: 0 ( 0.000%) GRE: 0 ( 0.000%) GRE Eth: 0 ( 0.000%) GRE VLAN: 0 ( 0.000%) GRE IP4: 0 ( 0.000%) GRE IP6: 0 ( 0.000%) GRE IP6 Ext: 0 ( 0.000%) GRE PPTP: 0 ( 0.000%) GRE ARP: 0 ( 0.000%) GRE IPX: 0 ( 0.000%) GRE Loop: 0 ( 0.000%) MPLS: 0 ( 0.000%) ARP: 0 ( 0.000%) IPX: 0 ( 0.000%) Eth Loop: 0 ( 0.000%) Eth Disc: 0 ( 0.000%) IP4 Disc: 1 ( 0.402%) IP6 Disc: 0 ( 0.000%) TCP Disc: 0 ( 0.000%) UDP Disc: 0 ( 0.000%) ICMP Disc: 0 ( 0.000%) All Discard: 1 ( 0.402%) Other: 0 ( 0.000%) Bad Chk Sum: 190 ( 76.305%) Bad TTL: 0 ( 0.000%) S5 G 1: 0 ( 0.000%) S5 G 2: 0 ( 0.000%) Total: 249 =============================================================================== Snort exiting
うん、まぁこんな感じでいいかな。検知システムはまだ先でやるとして、一応コマンドでもオプションは幾つかあるようです。載せておきます。
-a ARPパケットを表示
-b tcpdumpフォーマットでパケットを記録
-c 設定ファイルを指定
-d アプリケーションレイヤーのデータをダンプ
-e レイヤー2のパケットヘッダをダンプ
-l ログディレクトリを指定
-L バイナリ出力するファイルを指定
-T Snortのテストモード
-u 初期化後にSnortを指定したユーザーで実行
ルールをDLしてみる
登録しなくても利用できるっぽいルールがあったので適用してみます。
# wget https://www.snort.org/downloads/community/community-rules.tar.gz # tar zxvf community-rules.tar.gz # cp -r community.rules/* /etc/snort/rules # cat /etc/snort/rules/community.rules
設定に進む
結構大きい設定ファイルだ・・・
# wc -l /etc/snort/snort.conf 688 /etc/snort/snort.conf
# ls /etc/snort/ classification.config reference.config snort.conf unicode.map gen-msg.map rules/ threshold.conf
長いなぁと言っても全部修正が必要という訳ではないでしょうし、Step1から順番に見ていきましょう。
confファイルは参考サイトに習いながら進めます。
# vi /etc/snort/snort.conf
# Setup the network addresses you are protecting -ipvar HOME_NET any +#ipvar HOME_NET any +ipvar HOME_NET 192.168.0.0/24
# Set up the external network addresses. Leave as "any" in most situations -ipvar EXTERNAL_NET any +#ipvar EXTERNAL_NET any +ipvar EXTERNAL_NET !$HOME_NET
# どんだけー。 # List of ports you run web servers on #portvar HTTP_PORTS [80,81,311,383,591,593,901,1220,1414,1741,1830,2301,2381,2809,3037,3128,3702 ,4343,4848,5250,6988,7000,7001,7144,7145,7510,7777,7779,8000,8008,8014,8028,8080,8085,8088,8090, 8118,8123,8180,8181,8243,8280,8300,8800,8888,8899,9000,9060,9080,9090,9091,9443,9999,11371,34443 ,34444,41080,50002,55555] portvar HTTP_PORTS 80
# Linux版を落としたはずだけど、Windowsらしい。 286 #preprocessor stream5_tcp: policy windows, detect_anomalies, require_3whs 180, \ 287 preprocessor stream5_tcp: policy linux, detect_anomalies, require_3whs 180, \
コードページ1252:ラテン から コートページ932:Shift-jisに変更と思われ。 301 # preprocessor http_inspect: global iis_unicode_map unicode.map 1252 compress_depth 65535 decomp ress_depth 65535 302 preprocessor http_inspect: global iis_unicode_map unicode.map 932 compress_depth 65535 decompres s_depth 65535
続いてsysconfig直下
コメントアウトしてDBへ出力するようにする。
#ALERTMODE=fast
ではではBarnyard2とやらを入れてみようか
# git clone https://github.com/firnsy/barnyard2.git Initialized empty Git repository in /usr/local/src/barnyard2/.git/ remote: Counting objects: 1071, done. remote: Total 1071 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1071/1071), 1.02 MiB | 271 KiB/s, done. Resolving deltas: 100% (690/690), done. # cd barnyard2 # ./autogen.sh You can now run "./configure" and then "make".
デフォルトのはず
# mysql -V mysql Ver 14.14 Distrib 5.1.73, for redhat-linux-gnu (x86_64) using readline 5.1 # whereis mysql mysql: /usr/bin/mysql /usr/lib64/mysql /usr/include/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz
なので
./configure --with-mysql --with-mysql-libraries=/usr/lib64/mysql/
make && make install
設定ファイルをコピーします。
# cp etc/barnyard2.conf /etc/snort
変更するところは以下
# vi /etc/snort/barnyard2.conf
348 # output database: log, mysql, user=root password=test dbname=db host=localhost 349 output database: log, mysql, user=snort password=snort dbname=snort_log host=localhost
起動スクリプトと設定ファイルをもういっちょ。
cd /usr/local/src/barnyard2/rpm
# install -m0755 barnyard2 /etc/rc.d/init.d/barnyrad2 # ls -l /etc/rc.d/init.d/barnyrad2 -rwxr-xr-x. 1 root root 1748 10月 31 01:01 2014 /etc/rc.d/init.d/barnyrad2 # install -m0644 barnyard2.config /etc/sysconfig/barnyrad2 # ls -l /etc/sysconfig/barnyrad2 -rw-r--r--. 1 root root 248 10月 31 01:01 2014 /etc/sysconfig/barnyrad2
データベースはこの方法で。
# locate barnyard2 | grep create_mysql /usr/local/src/barnyard2/schemas/create_mysql
mysql> grant INSERT,SELECT on snort_log.* to snort@localhost; Query OK, 0 rows affected (0.01 sec)
# mysql -u root snort_log < create_mysql
テーブルが出来たかチェック。
mysql> show tables; +---------------------+ | Tables_in_snort_log | +---------------------+ | data | | detail | | encoding | | event | | icmphdr | | iphdr | | opt | | reference | | reference_system | | schema | | sensor | | sig_class | | sig_reference | | signature | | tcphdr | | udphdr | +---------------------+ 16 rows in set (0.00 sec)
では動かしてみます。
失敗(*´ω`)
Oct 31 01:06:39 "01 snort[10324]: FATAL ERROR: /etc/snort/snort.conf(256) Could not stat dynamic module path "/usr/local/lib/snort_dynamicrules": No such file or directory.#012
# mkdir -p /usr/local/lib/snort_dynamicrules # chown -R snort:snort /usr/local/lib/snort_dynamicrules # chmod -R 700 /usr/local/lib/snort_dynamicrules
では動かしてみます。
失敗(*´ω`)
Oct 31 01:10:44 "01 snort[10782]: FATAL ERROR: /etc/snort//etc/snort/rules/local.rules(0) Unable to open rules file "/etc/snort//etc/snort/rules/local.rules": No such file or directory.#012
# cp -p /etc/snort/rules/community.rules /etc/snort/rules/local.rules
では動かしtmiahfdal
失敗(*´ω`)
Oct 31 01:15:01 "01 snort[11205]: FATAL ERROR: /etc/snort//etc/snort/rules/app-detect.rules(0) Unable to open rules file "/etc/snort//etc/snort/rules/app-detect.rules": No such file or directory.#012
ギギギ。localrulesをすべてコメントアウトしました。
その他、編集箇所
# vi /etc/sysconfig/snort # LOGDIR=/var/log/snort
# vi /etc/snort/barnyard2.conf 54 #config logdir: /tmp 55 config logdir: /var/log/snort_log 71 #config hostname: thor 72 #config interface: eth0 73 config hostname: localhost 74 config interface: eth0
# mkdir /var/log/snort_log # chmod 666 /var/log/snort_log
# chmod 666 /var/log/snort_log # touch /var/log/snort/snort_log.waldo
よく見ると参考サイトにもこの辺のことは書いてありました。
マニュアルは良く読もうな(´・ω・`)
# touch /etc/snort/rules/white_list.rules # touch /etc/snort/rules/brack_list.rules
515 #whitelist $WHITE_LIST_PATH/white_list.rules, 516 #blacklist $BLACK_LIST_PATH/black_list.rules 517 whitelist /etc/snort/rules/white_list.rules, \ 518 blacklist /etc/snort/rules//black_list.rules
DBを作り直して終わりました。 # mysql -D snort -u root < /usr/local/src/barnyard2/schemas/create_mysql
# ./barnyard2 -c /etc/snort/barnyard2.conf -d /var/log/snort -f merged.log -w /var/log/snort/barnyard2.waldo Running in Continuous mode
--== Initializing Barnyard2 ==-- Initializing Input Plugins! Initializing Output Plugins! Parsing config file "/etc/snort/barnyard2.conf"
+[ Signature Suppress list ]+ ---------------------------- +[No entry in Signature Suppress List]+ ---------------------------- +[ Signature Suppress list ]+
Barnyard2 spooler: Event cache size set to [2048] Log directory = /var/log/barnyard2 INFO database: Defaulting Reconnect/Transaction Error limit to 10 INFO database: Defaulting Reconnect sleep time to 5 second [ClassificationPullDataStore()]: No Classification found in database ... [SignaturePullDataStore()]: No signature found in database ...
--== Initialization Complete ==-- ______ -*> Barnyard2 <*- / ,,_ \ Version 2.1.13 (Build 327) |o" )~| By Ian Firns (SecurixLive): http://www.securixlive.com/ + '''' + (C) Copyright 2008-2013 Ian Firns <firnsy@securixlive.com> WARNING: Ignoring corrupt/truncated waldofile '/var/log/snort/barnyard2.waldo' Waiting for new spool file
動いた~と思ったら別の意味で動かなくなる・・・
スクリプトでデーモンでの起動ができないらしい。
# service barnyard2 start Snort Output Processor (barnyard2) を起動中: /bin/bash: barnyard2: コマンドが見つかりません [失敗] # whereis barnyard2 barnyard2: /usr/local/bin/barnyard2 /usr/local/etc/barnyard2.conf # vi /etc/init.d/barnyard2
起動スクリプトをいじってもうまくいかない・・・
いじってたらエラーの吐き方もおかしくなってしまったので治しようがなくなっちった。
もう1回! Barnyard2とやらを入れてみようか
結論を言うと、最後は起動スクリプトを修正して上手くいったのでした。
(*´ω`)
参考サイト
The Hacker Chronicles
Snort, Barnyard2, Snorby and PulledPork Install on CentOS 6.5
# mkdir cd /usr/local/src/snort # cd /usr/local/src/snort # git clone https://github.com/firnsy/barnyard2.git barnyard2 Initialized empty Git repository in /usr/local/src/snort/barnyard2/.git/ remote: Counting objects: 1071, done. remote: Total 1071 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1071/1071), 1.02 MiB | 389 KiB/s, done. Resolving deltas: 100% (690/690), done. # cd barnyard2
./autogen.sh # ./configure --with-mysql --with-mysql-libraries=/usr/lib64/mysql make && make install # cp rpm/barnyard2 /etc/init.d/ cp: `/etc/init.d/barnyard2' を上書きしてもよろしいですか(yes/no)? yes # # chmod +x /etc/init.d/barnyard2 # cp rpm/barnyard2.config /etc/sysconfig/barnyard2 cp: `/etc/sysconfig/barnyard2' を上書きしてもよろしいですか(yes/no)? # cp rpm/barnyard2.config /etc/sysconfig/barnyard2 cp: `/etc/sysconfig/barnyard2' を上書きしてもよろしいですか(yes/no)? yes #
ちょと端折ってますが、ほぼほぼ参考サイトの通りで、他にさっき書いたとおり、snortのパスとbarnyard2の起動スクリプトのオプションを少しいじりますた。
んで、やっと通ったようです。やれやれだよ。
#BARNYARD_OPTS="-D -c $CONF -d $SNORTDIR/${INT} -w $WALDO_FILE -L $SNORTDIR/${INT} -a $ARCHIVEDIR -f $LOG_FILE -X $PIDFILE $EXTRA_ARGS" BARNYARD_OPTS="-D -c /etc/snort/barnyard2.conf -d /var/log/snort -f merged.log -w /var/log/snort/barnyard2.waldo -l $SNORTDIR/${INT} -a $ARCHIVEDIR -f $LOG_FILE -X $PIDFILE $EXTRA_ARGS" daemon $prog $BARNYARD_OPTS
snort を起動中: Spawning daemon child... My daemon child 7710 lives... Daemon parent exiting (0) [ OK ]
# service barnyard2 start Snort Output Processor (barnyard2) を起動中: [ OK ]
テストで動かしてたICMPのログが蓄積されていたので問題ないようだ。
ではcommunity.rulesを登録してリスタートしよう。
# vi /etc/snort/snort.conf include $RULE_PATH/community.rules # service barnyard2 restart Snort Output Processor (barnyard2) を停止中: [ OK ] Snort Output Processor (barnyard2) を起動中: [ OK ] # service snortd restart snort を停止中: [ OK ] snort を起動中: Spawning daemon child... My daemon child 9381 lives... Daemon parent exiting (0) [ OK ]
ちゃんと動いているようです。
** ORIGINAL DATAGRAM DUMP: 117.41.229.139:7971 -> 133.242.178.136:9200 TCP TTL:110 TOS:0x0 ID:256 IpLen:20 DgmLen:40 Seq: 0x1E230000 (12 more bytes of original packet) ** END OF DUMP
MyIsamでできていた(´・ω・`)
そういえば、テーブルの作成は付属のスクリプトだったなぁ。
mysql> show table status; +------------------+--------+---------+------------+------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +------------------+--------+---------+------------+------+----------------+-------------+------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+ | data | MyISAM | 10 | Dynamic | 0 | 0 | 0 | 281474976710655 | 1024 | 0 | NULL | 2014-10-31 02:45:48 | 2014-10-31 02:45:48 | NULL | utf8_general_ci | NULL | | | | detail | MyISAM | 10 | Dynamic | 2 | 20 | 40 | 281474976710655 | 2048 | 0 | NULL | 2014-10-31 02:45:48 | 2014-10-31 02:45:48 | NULL | utf8_general_ci | NULL | | | | encoding
デフォルトではMyIsamなのか。まぁ、いいか。