不正アクセス検知システム(Snort+SnortSnarf+Oinkmaster)の導入

ここでは、サーバーへの不正アクセスを監視して、検知したアクセスログの結果をブラウザから確認できるようにします。
確認画面はこんな感じです サンプル

※ なお、不正アクセス監視システムの導入にはWebサーバーが構築済みである事が前提となります。

Snortのインストール


# apt-get install pcre-devel ← snortインストールに必要なpcre-develインストール
パッケージリストを読みこんでいます... 完了
依存情報ツリーを作成しています... 完了
以下のパッケージが新たにインストールされます:
  pcre-devel
アップグレード: 0 個, 新規インストール: 1 個, 削除: 0 個, 保留: 3 個
111kB のアーカイブを取得する必要があります。
展開後に 163kB のディスク容量が追加消費されます。
取得:1 http://updates.vinelinux.org 3.2/i386/devel pcre-devel 4.5-0vl2 [111kB]
111kB を 0s 秒で取得しました (171kB/s)
変更を適用しています...
準備中...             ########################################### [100%]
  1:pcre-devel        ########################################### [100%]
完了

snortのインストール
最新バージョンはこちらを確認 →SNORT.ORG

# wget http://www.snort.org/dl/current/snort-2.4.3.tar.gz ← ダウンロード
--13:24:45-- http://www.snort.org/dl/current/snort-2.4.3.tar.gz
       => `snort-2.4.3.tar.gz'
www.snort.org をDNSに問いあわせています... 199.107.65.177
www.snort.org[199.107.65.177]:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 2,733,590 [application/x-gzip]

100%[====================================>] 2,733,590 340.32K/s ETA 00:00

13:24:54 (308.06 KB/s) - `snort-2.4.3.tar.gz' を保存しました [2733590/2733590]


# rpmbuild -tb snort-2.4.3.tar.gz ← snortのRPMパッケージ作成
マシン環境により結構時間がかかるので気長に待ってください。

最下部を確認

 〜省略〜
Requires(postun): /bin/sh
Requires: /bin/sh libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.3) libm.so.6 libnsl.so.1 libpcap.so.0.8.3 libpcre.so.0
Conflicts: snort-inline
書き込み完了: /root/rpm/RPMS/i386/snort-2.4.3-1.i386.rpm ← 作成されたRPMパッケージを確認
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.3064
+ umask 022
+ cd /root/rpm/BUILD
+ cd snort-2.4.3
+ /bin/rm -rf /var/tmp/snort-2.4.3-1-root-root
+ exit 0

# rpm -Uvh /root/rpm/RPMS/i386/snort-2.4.3-1.i386.rpm ← インストール
準備中...               ########################################### [100%]
   1:snort             ########################################### [100%]

# rm -f /root/rpm/RPMS/i386/snort-2.4.3-1.i386.rpm ← 作成したRPMパッケージを削除

# rm -f snort-2.4.3.tar.gz ← ダウンロードしたファイルを削除

Aptのアップグレード対象からsnortを除外する(Vine4系固有)


# vi /etc/apt.conf ← 設定ファイルを編集
APT
{
  Get
  {
    Download-Only "false";
    Show-Upgraded "true";
  };

};

RPM
{
   AutoRebuildDB "false";
        Hold {"snort";}; ← Holdの項を作成し除外パッケージにsnortを指定
}

Acquire
{
    CDROM::Copy "true";
    Retrys "0";
}

Aptのアップグレード対象からsnortを除外する(Vine3系固有)


# vi /etc/apt/apt.conf ← 設定ファイル編集
 i キー(入力モード)

APT
{
  Get
  {
    Download-Only "false";
    Show-Upgraded "true";
  };

};

RPM
{
    AutoRebuildDB "true";

    Allow-Duplicated {"^kernel$"; "^kernel-smp"; "^kernel-BOOT";
                "^kernel-devel$"; "^kernel-smp-devel$";
                "^kernel26$"; "^kernel26-smp";
                "^kernel26-devel"; "^kernel26-smp-devel";
                "^kernel24$"; "^kernel24-smp"; "^kernel24-BOOT";
                "^kernel22$"; "^kernel22-smp";
                "^mol-kmods$"; "^mol-kmods22$"; };
    Hold {"snort";}; ← Holdの項にsnortを追加

}

Acquire
{
    CDROM::Copy "true";
    Retrys "0";
}

編集したら Esc キー(コマンドモード):wqで保存

Snortの設定




# vi /etc/snort/snort.conf ← 設定ファイル編集
 i キー(入力モード)

var HOME_NET any
 ↓
var HOME_NET 192.168.11.0/24 ← 内部ネットワークアドレスに変更 (※各自の環境に合わせてください)


var EXTERNAL_NET any
 ↓
var EXTERNAL_NET !$HOME_NET ← 変更 (※内部からは不正アクセスとして扱わない設定)

preprocessor portscan: $HOME_NET 4 3 portscan.log ← 最終行へ追加

編集したら Esc キー(コマンドモード):wqで保存

Snortルールファイルの入手とエラー対策、及び起動

※ 最新バージョンはこちらを確認 → SNORT.ORG


# wget http://www.snort.org/pub-bin/downloads.cgi/Download/vrt_pr/snortrules-pr-2.4.tar.gz ← ダウンロード
--13:46:13-- http://www.snort.org/pub-bin/downloads.cgi/Download/vrt_pr/snortrules-pr-2.4.tar.gz
       => `snortrules-pr-2.4.tar.gz'
www.snort.org をDNSに問いあわせています... 199.107.65.177
www.snort.org[199.107.65.177]:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [application/octet-stream]

   [       <=>               ] 789,097      263.64K/s

13:46:17 (262.82 KB/s) - `snortrules-pr-2.4.tar.gz' を保存しました [789097]

# tar zxvf snortrules-pr-2.4.tar.gz ← 展開

# /bin/cp -r rules/* /etc/snort/rules/ ← ルールファイルを所定のディレクトリへコピー

展開してできたディレクトリを削除
# rm -rf rules/
# rm -rf doc/

# rm -f snortrules-pr-2.4.tar.gz ← ダウンロードしたファイルを削除


cronからエラーメールがroot宛に送られてくることの対処


# vi /etc/logrotate.d/snort ← 編集
 i キー(入力モード)

/var/log/snort/alert /var/log/snort/*log /var/log/snort/*/alert /var/log/snort/*/*log { ← 不要な部分を削除
 ↓

/var/log/snort/alert /var/log/snort/*log { ← 変更

編集したら Esc キー(コマンドモード):wqで保存


# /etc/init.d/snortd start ← 起動
Starting snort:             [ OK ]

Snortの動作確認

他のPCからサーバーに対してポートスキャンを行い、Snortがポートスキャンされたことを検知できるか確認します。


他にLinuxPCがある場合

# rpm -q nmap ← ポートスキャンツールのnmapがインストールされているか確認
パッケージ nmap はインストールされていません

# apt-get install nmap ← インストールされていない場合、インストール

# nmap サーバーIPアドレス ← サーバーに対してポートスキャン


他にWindowsPCがある場合

最初にWinPcapダウンロードサイトよりWinPcapをダウンロードしてインストールする
次にNmapダウンロードサイトよりNmapをダウンロードしてデスクトップに解凍する


Windowsのコマンドプロンプトを起動

C:\Documents and Settings\xxx>cd C:\Documents and Settings\xxx\デスクトップ\nmap-3.81 ← Nmap解凍先フォルダへ移動

C:\Documents and Settings\xxx\デスクトップ\nmap-3.81\nmap-3.81>nmap サーバーIPアドレス ← サーバーに対してポートスキャン

Starting nmap 3.81 ( http://www.insecure.org/nmap ) at 2005-11-29 14:10 東京 (標準時)
Note: Host seems down. If it is really up, but blocking our ping probes, try -P0

Nmap finished: 1 IP address (0 hosts up) scanned in 4.266 seconds


確認する

# tail -10 /var/log/snort/alert ← Snortnoログを表示
このようなログが記載されてればOK
 

11/29-14:20:48.416915 [**] [100:1:1] spp_portscan: PORTSCAN DETECTED from 11.222.333.444 (THRESHOLD 4 connections exceeded in 0 seconds) [**]

SnortSnarfの導入に必要な、Perlモジュールのインストール

※SnortSnarfを導入するには、Perlモジュール「Time::JulianDay」が必要となります。
ここでは CPANから直にインストールする事にします。
CPANは、CPANサイトからのperlモジュールの問い合わせ、ダウンロード、構築を行う事ができます。


# perl -MCPAN -e shell ← 起動

※ 初回のみ以下の設定画面が出てきます。

以下の部分以外は全て [Enter] でOK

Select your continent (or several nearby continents) [] 2 ← Asiaを指定
Select your country (or several nearby countries) [] 7 ← Japanを指定
Select as many URLs as you like (by number),
put them on one line, separated by blanks, e.g. '1 4 5' [] 1 4 5 ← 1,4,5を指定(数字の間は半角スペース)

cpan> install Time::JulianDay ← インストール
CPAN: Storable loaded ok
Going to read /root/.cpan/Metadata
Database was generated on Tue, 29 Nov 2005 23:03:15 GMT
Time::JulianDay is up to date.

cpan> exit ← 終了

SnortSnarfのインストール

最新版はこちらを確認 → SNORT.ORG


# wget http://www.snort.org/dl/contrib/data_analysis/snortsnarf/SnortSnarf-050314.1.tar.gz ← ダウンロード
--14:38:06-- http://www.snort.org/dl/contrib/data_analysis/snortsnarf/SnortSnarf-050314.1.tar.gz
        => `SnortSnarf-050314.1.tar.gz'
www.snort.org をDNSに問いあわせています... 199.107.65.177
www.snort.org[199.107.65.177]:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 144,103 [application/x-gzip]

100%[====================================>] 144,103    128.54K/s

14:38:07 (128.21 KB/s) - `SnortSnarf-050314.1.tar.gz' を保存しました [144103/144103]

# tar zxvf SnortSnarf-050314.1.tar.gz ← 展開

# mkdir /usr/local/snortsnarf ← SnortSnarfインストール先ディレクトリ作成

# cp SnortSnarf-050314.1/snortsnarf.pl /usr/local/snortsnarf/ ← snortsnarf.plをインストール先へコピー

# cp -r SnortSnarf-050314.1/include/ /usr/local/snortsnarf/ ← includeディレクトリをインストール先へコピー

# rm -rf SnortSnarf-050314.1 ← 展開してできたディレクトリを削除

# rm -f SnortSnarf-050314.1.tar.gz ← ダウンロードしたファイルを削除

SnortSnarf設定


実行時にエラーメッセージが出力されることの対処

# cd /usr/local/snortsnarf/include/SnortSnarf/ ← 移動

# vi ./HTMLMemStorage.pm ← SnortSnarfのpmファイル編集
指定行までに移動方法はこちらを参照
 i キー(入力モード)

return @arr->[($first-1)..$end]; ← 290行目
 
return @arr[($first-1)..$end]; ← 「->」を削除

編集したら Esc キー(コマンドモード):wqで保存


# vi ./HTMLAnomMemStorage.pm ← SnortSnarfのpmファイル編集
 i キー(入力モード)

return @arr->[($first-1)..$end]; ← 266行目
 
return @arr[($first-1)..$end]; ← 「->」を削除

編集したら Esc キー(コマンドモード):wqで保存


# cd ← 戻る

# mkdir /home/httpd/html/snort ← SnortSnarfのHTML出力先ディレクトリ作成

# vi snortsnarf.sh ← SnortSnarf実行スクリプト作成
i キー(入力モード)
#!/bin/sh

cd /usr/local/snortsnarf
if [ -s /var/log/snort/alert ]; then
   if [ -s /var/log/snort/portscan.log ]; then
      ./snortsnarf.pl -dns -d /home/httpd/html/snort /var/log/snort/alert /var/log/snort/portscan.log
   else
      ./snortsnarf.pl -dns -d /home/httpd/html/snort /var/log/snort/alert
   fi
fi
記載したら Esc キー(コマンドモード):wqで保存

# chmod 700 snortsnarf.sh ← 実行権限を与える

# ./snortsnarf.sh ← SnortSnarfの実行

http://サーバー名/snort/にアクセスしてみてこのような画面が表示されることを確認

SnortSnarfを日本語化



SnortSnarf日本語化ファイル取得
# cd /usr/local/snortsnarf/include/SnortSnarf/ ← ディレクトリ移動

# mv HTMLOutput.pm HTMLOutput.pm.org ← デフォルトのHTMLOutput.pmをリネーム

※ 日本語化ファイルの最新版はこちらを確認

# wget http://mt-fuji.ddo.jp/~fujito/Linux/secu_soft/s2/HTMLOutput.pm ← 日本語化HTMLOutput.pmダウンロード
--13:42:18-- http://mt-fuji.ddo.jp/%7Efujito/Linux/secu_soft/s2/HTMLOutput.pm
       => `HTMLOutput.pm'
mt-fuji.ddo.jp をDNSに問いあわせています... 218.228.136.1
mt-fuji.ddo.jp[218.228.136.1]:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 86,832 [text/plain]

100%[====================================>] 86,832     251.04K/s

13:42:18 (250.31 KB/s) - `HTMLOutput.pm' を保存しました [86832/86832]

SnortSnarf文字化け対策とSnortSnarf実行時エラー対策

# vi HTMLOutput.pm ← HTMLOutput.pm編集
 i
キー(入力モード)
sub print_page_head {
	my($self,$page_title,$page_type,$page_h2) = @_;

	print "<html>\n<head>\n";
	print "<title>$page_title</title>\n";
	print "<meta http-equiv=\"Content-type\" content=\"text/html; charset=Shift_JIS\">\n"; ← 追加


sub ip_to_num {
        if ($_[0] ne '*undef*') { ← 追加
	my @byte= split(/\./,$_[0]); ← 追加
	return $byte[0]*256*256*256 + $byte[1]*256*256 + $byte[2]*256 + $byte[3]; ← 追加
	} ← 追加
	#my @byte= split(/\./,$_[0]); ← コメントアウト
	#return $byte[0]*256*256*256 + $byte[1]*256*256 + $byte[2]*256 + $byte[3]; ← コメントアウト
      }
編集したら Esc キー(コマンドモード):wqで保存

# cd ← rootに戻る

# ./snortsnarf.sh ← SnortSnarf実行

http://サーバー名/snort/にアクセスし、このような日本語の画面が表示されればOK

SnortSnarfの定期実行の自動設定

# crontab -e ← cron編集
 i キー(入力モード)

00 * * * * /root/snortsnarf.sh ← 1時間ごとに実行する

記載したら Esc キー(コマンドモード):wqで保存

# /etc/rc.d/init.d/crond restart ←Cron を再起動

ルールファイルの自動更新

※ Oinkmasterの最新版はこちらを確認 → SNORT.ORG


# wget http://jaist.dl.sourceforge.net/sourceforge/oinkmaster/oinkmaster-1.2.tar.gz ← Oinkmasterダウンロード
--14:21:32-- http://jaist.dl.sourceforge.net/sourceforge/oinkmaster/oinkmaster-1.2.tar.gz
        => `oinkmaster-1.2.tar.gz.1'
jaist.dl.sourceforge.net をDNSに問いあわせています... 150.65.7.130
jaist.dl.sourceforge.net[150.65.7.130]:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 75,512 [application/x-gzip]

100%[===================================================================>] 75,512   --.--K/s

14:21:32 (1.05 MB/s) - `oinkmaster-1.2.tar.gz.1' を保存しました [75512/75512]

# mkdir /usr/local/oinkmaster ← Oinkmasterインストール先ディレクトリ作成

# tar zxvf oinkmaster-1.2.tar.gz ← 展開

# cp -r oinkmaster-1.2/* /usr/local/oinkmaster/ ← 展開してできた全てのファイルをインストール先へコピー

# rm -rf oinkmaster-1.2 ← 展開してできたディレクトリ削除

# rm -f oinkmaster-1.2.tar.gz ← ダウンロードしたファイルを削除


Oinkmaster設定

# vi /usr/local/oinkmaster/oinkmaster.conf ← 設定ファイル編集
 i キー(入力モード)

# Example for Community rules ←66行目付近
# url = http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules.tar.gz ← コメントアウト
url = http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules-2.4.tar.gz ←追記

編集したら Esc キー(コマンドモード):wqで保存


Oinkmaster実行スクリプト作成

# vi oinkmaster.sh ← 実行スクリプト作成
 i キー(入力モード)

#!/bin/sh

cd /usr/local/oinkmaster/
./oinkmaster.pl -C oinkmaster.conf -o /etc/snort/ -q|logger -t oinkmaster

編集したら Esc キー(コマンドモード): wqで保存


# chmod 700 oinkmaster.sh ← 実行権限を与える


Oinkmaster確認

# ./oinkmaster.sh ← Oinkmaster実行

# ls -l /etc/snort/|grep community ← ルールファイルがちゃんとDLされているか確認
-rw-r--r-- 1 root root 876 Nov 30 14:35 community-dos.rules
-rw-r--r-- 1 root root 1868 Nov 30 14:35 community-exploit.rules
-rw-r--r-- 1 root root 249 Nov 30 14:35 community-ftp.rules
-rw-r--r-- 1 root root 1376 Nov 30 14:35 community-game.rules
-rw-r--r-- 1 root root 520 Nov 30 14:35 community-icmp.rules
-rw-r--r-- 1 root root 2412 Nov 30 14:35 community-imap.rules
-rw-r--r-- 1 root root 948 Nov 30 14:35 community-inappropriate.rules
-rw-r--r-- 1 root root 257 Nov 30 14:35 community-mail-client.rules
-rw-r--r-- 1 root root 1474 Nov 30 14:35 community-misc.rules
-rw-r--r-- 1 root root 621 Nov 30 14:35 community-nntp.rules
-rw-r--r-- 1 root root 775 Nov 30 14:35 community-oracle.rules
-rw-r--r-- 1 root root 1759 Nov 30 14:35 community-sip.rules
-rw-r--r-- 1 root root 1003 Nov 30 14:35 community-smtp.rules
-rw-r--r-- 1 root root 3279 Nov 30 14:35 community-sql-injection.rules
-rw-r--r-- 1 root root 852 Nov 30 14:35 community-virus.rules
-rw-r--r-- 1 root root 2332 Nov 30 14:35 community-web-attacks.rules
-rw-r--r-- 1 root root 4122 Nov 30 14:35 community-web-cgi.rules
-rw-r--r-- 1 root root 1089 Nov 30 14:35 community-web-client.rules
-rw-r--r-- 1 root root 254 Nov 30 14:35 community-web-dos.rules
-rw-r--r-- 1 root root 1473 Nov 30 14:35 community-web-iis.rules
-rw-r--r-- 1 root root 7518 Nov 30 14:35 community-web-misc.rules
-rw-r--r-- 1 root root 1912 Nov 30 14:35 community-web-php.rules


Oinkmaster定期実行の自動設定

# crontab -e ← cron編集
 i キー(入力モード)

00 00 * * * /root/oinkmaster.sh ← 毎日00:00にOinkmasterを実行する
記載したら Esc キー(コマンドモード):wqで保存

# /etc/rc.d/init.d/crond restart ←Cron を再起動




Copyright c Vine Linuxで自宅サーバー. 2004 All Rights Reserved.