ここでは、意識的に ACID は使っていません。 そのうち使うかもしれませんが、検知とか、復旧に関わるものはなるべく単純な形のままにしたいのです。 $ tar xzf snort-2.0.1.tar.gz $ cd snort-2.0.1 snort-2.0.1$ ./configure snort-2.0.1$ make snort-2.0.1$ su snort-2.0.1# make install snort-2.0.1# mkdir /etc/snort snort-2.0.1# cp -p ./etc/snort.conf /etc/snort/. snort-2.0.1# cp -p ./etc/*.config /etc/snort/. snort-2.0.1# cp -p ./etc/*.map /etc/snort/. snort-2.0.1# cp -pr ./rules /etc/snort/. snort-2.0.1# vi /etc/snort/snort.confsnort-2.0.1# groupadd snort snort-2.0.1# useradd -g snort snort snort-2.0.1# mkdir /var/log/snort snort-2.0.1# chown snort:snort /var/log/snort snort-2.0.1# snort -u snort -g snort -c /etc/snort/snort.conf -l /var/log/snort -i eth1 -k none -deDy snort-2.0.1# cat >> /etc/rc.d/rc.local
#var RULE_PATH ../rules/etc/snort/rules にルール定義を置いたので修正 var RULE_PATH ./rules
rules ファイルの更新 (ルールセットをアップデートしないと、最新の攻撃を検知できません) http://www.snort.org/dl/rules/ に最新の snortrules ファイルがあるので、これを設置します。 $ tar xzf snortrules-stable.tar.gz $ cd rules 変更点は何かな? rules$ for i in *.config ; do diff /etc/snort/$i $i ; done rules$ for i in *.map ; do diff /etc/snort/$i $i ; done rules$ for i in *.rules ; do diff /etc/snort/rules/$i $i ; done2003-07-29 バージョンでは、MSブラスター用のルールが追加されている模様。rules$ su rules# cp -p *.config /etc/snort/. それぞれのファイルをコピー rules# cp -p *.map /etc/snort/. rules# cp -p *.rules /etc/snort/rules/. rules# snort の再起動 (PID は /var/run/snort_eth1.pid : eth1 は環境によって違います) ルールファイルを更新するスクリプト (reprules.sh) を作ってみました。 root で実行する必要があります。 ルールの自動更新プログラムもありますが、 ワークエリアを指定するために専用の config を書きたくないので、スクリプトで何とかします。
*.map の比較 (シグネチャ ID に 2192,2193 が追加されている) 1c1 < # $Id: sid-msg.map,v 1.131 2003/07/21 22:16:01 cazz Exp $ --- > # $Id: sid-msg.map,v 1.132 2003/07/29 16:03:05 cazz Exp $ 2040a2041,2042 > 2192 || NETBIOS DCERPC ISystemActivator bind attempt || cve,CAN-2003-0352 > 2193 || NETBIOS SMB DCERPC ISystemActivator bind attempt || cve,CAN-2003-0352
*.rules の比較 (ポート 135,445 へのアクセスパターンが追加されている) 3c3 < # $Id: netbios.rules,v 1.25 2003/07/21 22:16:01 cazz Exp $ --- > # $Id: netbios.rules,v 1.26 2003/07/29 16:03:05 cazz Exp $ 29a30,32 > alert tcp $EXTERNAL_NET any -> $HOME_NET 135 (msg:"NETBIOS DCERPC ISystemAc 長いので省略 > alert tcp $EXTERNAL_NET any -> $HOME_NET 445 (msg:"NETBIOS SMB DCERPC ISyst 長いので省略 >スクリプト reprules.sh (755)
ログの切り替え (snort の再起動) プレーンテキストのままログを保存するのに便利ですが、一瞬キャプチャが途絶える (下記青文字の部分) ので、気になる方は他の方法 (データベース利用) をお勧めします。 以下のファイルを作成し、定時に実行します。/home/snort/restart.sh 754# crontab -e -u root 上記スクリプトを定時に起動
ログ (/var/log/snort/alert) の読み方 [**] [分類:シグネチャID:リビジョン] 名称 [**] [Classification: Misc activity] [Priority: 3] 月/日/年-時:分:秒.少数秒 送信MACアドレス -> 受信MACアドレス type:0x800 len:0x6A 送信IPアドレス -> 受信IPアドレス ICMP TTL:120 TOS:0x0 ID:32548 IpLen:20 DgmLen:92 Type:8 Code:0 ID:512 Seq:34206 ECHO [Xref => 説明へのリンク]
ログの集計 ログのサマリを計算するスクリプト (logsum.pl) を作ってみました。 $ cat /var/log/snort/alert | logsum.pl 等として実行します。実行結果
#!/usr/local/bin/perl use strict ; # 不審なパケットをカウントする my @sign = () ; my %sign = () ; my $total = 0 ; while (<>) { my $line = $_ ; chomp $line ; if ($line eq '') { if (@sign > 0) { my $first = $sign[0] ; $first =~ s/\s*\[\*\*\]\s*//g ; # 両脇の [**] を取り除く $first =~ s/\s*\[\d+:\d+:\d+\]\s*// ; # [1:123:4] を取り除く my($priority) = $sign[1] =~ /\[Priority:\s*(\d+)\]/ ; $first = "Pr$priority ".$first ; $sign{$first} ++ ; $total ++ ; } @sign = () ; } else { push @sign, $line ; } } # カウンタ順にソート (降順) して表示する my $lcnt = 0 ; foreach my $key (sort { $sign{$b} <=> $sign{$a} } keys %sign) { $lcnt ++ ; my $n = $sign{$key} ; printf "%3d ", $lcnt ; printf "%5.2f%% ", $n / $total * 100 ; printf "%6d ", $n ; print "$key\n" ; } print "total: $total signal" ; print "s" if $total > 1 ; print "\n" ;logsum_send.sh (755)$ crontab -e
snort に最適なスイッチ (HUB と呼ぶのか、スイッチなのか難しい) FS808TP-V1 (アライドテレシス) 売価 16,000 円のくせに 100base でポートミラーリング (シャドウポートとも言う) が可能です。激安です。 kermit でも設定が出来るので、リモート操作も完璧です。写真はアライドテレシスからのパクりです。 クリックするとカタログページへ飛びます。 kermit で操作するときは、以下のファイルを作成し、 # kermit FS808TP-V1 kermit を起動 C-Kermit>c kermit のプロンプトで 'c' を入力 として起動します。(当然、手動でも可)
FS808TP-V1.ttyS1