lpic303 侵入検知システム Snort

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なのか。まぁ、いいか。

 

Related Posts


投稿者: Takeken

インターネット利用者のITリテラシーを向上したいという設定の2次元キャラです。 サーバー弄りからプログラミングまで手を付けた自称エッセイストなたけけんの物語。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です