不正アクセス検知システム(Snort)

■ FC6
サーバーへの不正アクセスを検知するシステム Snort を導入します。また、不正アクセスログをWebブラウザ上で確認できるように SnortSnarf も導入します。なお、Oinkmaster を導入して不正アクセスの判断をするために参照するルールファイルの最新化を自動化します。但しSnortは不正なパケットなどを検出するだけであり、ブロックはできません。 Snortを導入すれば安全という事ではありません。
※以前のバージョンで作成されたlogが残っていると起動に失敗することがあります。/var/log/snort ディレクトリを削除してからインストールして下さい。
■以前のログを削除

[root@linux ~]# rm -r /var/log/snort
以前のsnort用ログロテート設定ファイルを削除
[root@linux ~]# rm /etc/logrotate.d/snort

■snortインストールに必要な依存パッケージlibpcapのインストール

[root@linux ~]# yum install libpcap
Loading "installonlyn" plugin
Loading "fastestmirror" plugin
Setting up Install Process
Setting up repositories
livna                     100% |=========================| 1.1 kB    00:00
core                      100% |=========================| 1.1 kB    00:00
updates                   100% |=========================|  951 B    00:00
extras                    100% |=========================| 1.1 kB    00:00
Loading mirror speeds from cached hostfile
Reading repository metadata in from local files
primary.xml.gz            100% |=========================|  94 kB    00:01
################################################## 264/264
primary.xml.gz            100% |=========================| 250 kB    00:01
################################################## 846/846
Parsing package install arguments
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Downloading header for libpcap to pack into transaction set.
libpcap-0.9.4-9.fc6.i386. 100% |=========================|  15 kB    00:00
---> Package libpcap.i386 14:0.9.4-9.fc6 set to be updated
--> Running transaction check
Dependencies Resolved
=========================================================
Package                 Arch       Version          Repository        Size
=========================================================
Installing:
libpcap                 i386       14:0.9.4-9.fc6   updates            95 k
Transaction Summary
=========================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
Total download size: 95 k
Is this ok [y/N]: y
Downloading Packages:
(1/1): libpcap-0.9.4-9.fc 100% |=========================|  95 kB    00:00
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: libpcap                      ######################### [1/1]
Installed: libpcap.i386 14:0.9.4-9.fc6
Complete!

■snortのインストール
OSはFC6なのですが色々試した結果、現時点ではなぜかFC5用のsnort-2.6.1.1-1.FC5.i386.rpmしかインストール出来ませんでした。他は設定が悪いのかことごとく起動に失敗しました。

[root@linux ~]# rpm -ivh http://www.snort.org/dl/binaries/linux/snort-2.6.1.1-1.FC5.i386.rpm
http://www.snort.org/dl/binaries/linux/snort-2.6.1.1-1.FC5.i386.rpm を取得中
準備中...                   ########################################### [100%]
1:snort                  ########################################### [100%]
■Snort設定
[root@linux ~]# vi /etc/snort/snort.conf ← snort設定ファイル編集
var HOME_NET any
↓
var HOME_NET 192.168.1.0/24 ← 内部ネットワークアドレスを指定
var EXTERNAL_NET any
↓
var EXTERNAL_NET !$HOME_NET ← 内部からのアクセスを不正アクセスとして扱わない

■Snortルールファイル入手

[root@linux ~]# wget http://www.snort.org/pub-bin/downloads.cgi/Download/vrt_pr/snortrules-pr-2.4.tar.gz
--09:28:38--  http://www.snort.org/pub-bin/downloads.cgi/Download/vrt_pr/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
長さ: 789097 (771K) [application/octet-stream]
Saving to: `snortrules-pr-2.4.tar.gz'
100%[=============================================>] 789,097      149K/s   in 6.9s
09:28:46 (112 KB/s) - `snortrules-pr-2.4.tar.gz' を保存しました [789097/789097]
ファイルを展開
[root@linux ~]# tar zxvf snortrules-pr-2.4.tar.gz
ルールファイルを所定のディレクトリへコピー
[root@linux ~]# /bin/cp -r rules/* /etc/snort/rules/
展開してできたディレクトリを削除
[root@linux ~]# rm -rf rules/ doc/
ダウンロードしたファイルを削除
[root@linux ~]# rm -f snortrules-pr-2.4.tar.gz
snortルールファイルをダウンロードします
[root@linux ~]# wget http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules-2.4.tar.gz
--09:30:55--  http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules-2.4.tar.gz
www.snort.org をDNSに問いあわせています... 199.107.65.177
www.snort.org|199.107.65.177|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 109695 (107K) [application/octet-stream]
Saving to: `Community-Rules-2.4.tar.gz'
100%[=============================================>] 109,695      112K/s   in 1.0s
09:30:57 (112 KB/s) - `Community-Rules-2.4.tar.gz' を保存しました [109695/109695]
ファイルを展開
[root@linux ~]# tar zxvf Community-Rules-2.4.tar.gz
ルールファイルを所定のディレクトリへコピー
[root@linux ~]# /bin/cp -r rules/* /etc/snort/rules/
展開してできたディレクトリを削除
[root@linux ~]# rm -rf rules/ doc/
ダウンロードしたファイルを削除
[root@linux ~]# rm -f Community-Rules-2.4.tar.gz

■Snortログロテートエラー対処
cronから以下のようなエラーメールがroot宛に送られてくることの対処
error: error accessing /var/log/snort/*: No such file or directory
error: snort:4 glob failed for /var/log/snort/*/*log

[root@linux ~]# vi /etc/logrotate.d/snort ← snort用ログロテート設定ファイル編集
/var/log/snort/alert /var/log/snort/*log /var/log/snort/*/alert /var/log/snort/*/*log  { ← 不要な部分を削除
↓
/var/log/snort/alert /var/log/snort/*log {

■Snortの起動

[root@linux ~]# /etc/rc.d/init.d/snortd start ← snort起動
Starting snort:                                            [  OK  ]
[root@linux ~]# chkconfig snortd on ← snort自動起動設定
[root@linux ~]# chkconfig --list snortd ← snort自動起動設定確認
snortd          0:off   1:off   2:on    3:on    4:on    5:on    6:off ← ランレベル2~5のonを確認

■SnortSnarfに必要なPerlのTime-modulesをインストール

[root@linux ~]# yum -y install perl-Time-modules
Loading "fastestmirror" plugin
Loading "installonlyn" plugin
Setting up Install Process
Setting up repositories
livna                     100% |=========================| 1.1 kB    00:00
core                      100% |=========================| 1.1 kB    00:00
updates                   100% |=========================| 1.2 kB    00:00
extras                    100% |=========================| 1.1 kB    00:00
Loading mirror speeds from cached hostfile
Reading repository metadata in from local files
Excluding Packages in global exclude list
Finished
Parsing package install arguments
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Downloading header for perl-Time-modules to pack into transaction set.
perl-Time-modules-2003.11 100% |=========================| 4.5 kB    00:00
---> Package perl-Time-modules.noarch 0:2003.1126-4.fc6 set to be updated
--> Running transaction check
Dependencies Resolved
============================================================
Package                 Arch       Version          Repository        Size
============================================================
Installing:
perl-Time-modules       noarch     2003.1126-4.fc6  extras             36 k
Transaction Summary
============================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
Total download size: 36 k
Downloading Packages:
(1/1): perl-Time-modules- 100% |=========================|  36 kB    00:00
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Installing: perl-Time-modules            ######################### [1/1]
Installed: perl-Time-modules.noarch 0:2003.1126-4.fc6
Complete!

■SnortSnarfインストール
Snortのバージョンによって、必要なSnortSnarfのバージョンが異なりますって、何かで読んだことがあるんですが、とりあえず最新版をインストールします。

[root@linux ~]# wget http://www.snort.org/dl/contrib/data_analysis/snortsnarf/SnortSnarf-050314.1.tar.gz
--09:36:06--  http://www.snort.org/dl/contrib/data_analysis/snortsnarf/SnortSnarf-050314.1.tar.gz
www.snort.org をDNSに問いあわせています... 199.107.65.177
www.snort.org|199.107.65.177|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 144103 (141K) [application/x-gzip]
Saving to: `SnortSnarf-050314.1.tar.gz'
100%[=============================================>] 144,103     90.3K/s   in 1.6s
09:36:08 (90.3 KB/s) - `SnortSnarf-050314.1.tar.gz' を保存しました [144103/144103]
[root@linux ~]# tar zxvf SnortSnarf-050314.1.tar.gz ← 展開
[root@linux ~]# mkdir /usr/local/snortsnarf ← SnortSnarfインストール先ディレクトリ作成
[root@linux ~]# cp SnortSnarf-050314.1/snortsnarf.pl /usr/local/snortsnarf/
 ← snortsnarf.plをSnortSnarfインストール先へコピー
[root@linux ~]# cp -r SnortSnarf-050314.1/include/ /usr/local/snortsnarf/
 ← includeディレクトリをSnortSnarfインストール先へコピー
[root@linux ~]# rm -rf SnortSnarf-050314.1 ← 展開してできたディレクトリを削除
[root@linux ~]# rm -f SnortSnarf-050314.1.tar.gz ← ダウンロードしたファイルを削除

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

SnortSnarfのpmファイル編集
[root@linux ~]# vi /usr/local/snortsnarf/include/SnortSnarf/HTMLMemStorage.pm
return @arr->[($first-1)..$end];
↓
return @arr[($first-1)..$end]; ← ->を削除
SnortSnarfのpmファイル編集
[root@linux ~]# vi /usr/local/snortsnarf/include/SnortSnarf/HTMLAnomMemStorage.pm
return @arr->[($first-1)..$end];
↓
return @arr[($first-1)..$end]; ← ->を削除

■Webサーバー設定

SnortSnarfによるHTML出力先ディレクトリ作成
[root@linux ~]# mkdir /var/www/snort
SnortSnarf用Webサーバー設定ファイル新規作成
[root@linux ~]# vi /etc/httpd/conf.d/snort.conf
Alias /snort /var/www/snort
以下は内部からのみアクセスできるようにする場合のみ
<Location /snort>
Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from 192.168.1 ← 内部ネットワークアドレスを指定
</Location>
[root@linux ~]# /etc/rc.d/init.d/httpd reload ← Webサーバー設定反映
httpd を再読み込み中:                                      [  OK  ]

■SnortSnarf実行スクリプト作成

[root@linux ~]# vi snortsnarf.sh ← SnortSnarf実行スクリプト作成
#!/bin/bash
cd /usr/local/snortsnarf
if [ -s /var/log/snort/alert ]; then
if [ -s /var/log/snort/portscan.log ]; then
./snortsnarf.pl -dns -d /var/www/snort /var/log/snort/alert /var/log/snort/portscan.log
else
./snortsnarf.pl -dns -d /var/www/snort /var/log/snort/alert
fi
fi
SnortSnarf実行スクリプトへ実行権限付加
[root@linux ~]# chmod 700 snortsnarf.sh

■SnortSnarf確認

[root@linux ~]# ./snortsnarf.sh ← SnortSnarf実行

http://サーバーアドレス/snort/にアクセスし、「SnortSnarf start page」が表示されることを確認。
SnortSnarf-050314.1をインストールしたはずなのになぜだかバージョン表記はSnortSnarf v021111.1になってます。
■SnortSnarf日本語化ファイル取得
ダウンロードするファイルはSnortSnarf v021111.1用のものなので、ダウンロードしたSnortSnarf-050314.1ではうまく行かないのではと思ったのですが、バージョン表記がSnortSnarf v021111.1になってましたので試しにダウンロードしてみます。

[root@linux ~]# cd /usr/local/snortsnarf/include/SnortSnarf/
[root@linux SnortSnarf]# mv HTMLOutput.pm HTMLOutput.pm.org
[root@linux SnortSnarf]# wget http://mt-fuji.ddo.jp/~fujito/Linux/secu_soft/s2/HTMLOutput.pm
--09:42:32--  http://mt-fuji.ddo.jp/~fujito/Linux/secu_soft/s2/HTMLOutput.pm
mt-fuji.ddo.jp をDNSに問いあわせています... 121.82.128.37
mt-fuji.ddo.jp|121.82.128.37|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 86832 (85K) [text/plain]
Saving to: `HTMLOutput.pm'
100%[=============================================>] 86,832      --.-K/s   in 0.1s
09:42:32 (648 KB/s) - `HTMLOutput.pm' を保存しました [86832/86832]

■SnortSnarf日本語化確認

[root@linux SnortSnarf]# cd
[root@linux ~]# ./snortsnarf.sh ← SnortSnarf実行

http://サーバーアドレス/snort/にアクセスし、「SnortSnarf ページの開始」が表示されることを確認。
ちゃんと日本語化されてますので大丈夫そうですね。
■SnortSnarf定期自動実行設定

[root@linux ~]# crontab -e ← cron編集
00 * * * * /root/snortsnarf.sh ← SnortSnarfを1時間ごとに実行する

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

Oinkmasterインストール
[root@linux ~]# wget http://www.ip-solutions.net/~hhoffman/oinkmaster/oinkmaster-2.0-0.noarch.rpm
--09:43:50--  http://www.ip-solutions.net/~hhoffman/oinkmaster/oinkmaster-2.0-0.noarch.rpm
www.ip-solutions.net をDNSに問いあわせています... 66.92.234.67
www.ip-solutions.net|66.92.234.67|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 65411 (64K) [application/x-rpm]
Saving to: `oinkmaster-2.0-0.noarch.rpm'
100%[=============================================>] 65,411      51.5K/s   in 1.2s
09:43:52 (51.5 KB/s) - `oinkmaster-2.0-0.noarch.rpm' を保存しました [65411/65411]
[root@linux ~]# rpm -Uvh oinkmaster-2.0-0.noarch.rpm
準備中...                   ########################################### [100%]
1:oinkmaster             ########################################### [100%]
ダウンロードしたファイルを削除
[root@linux ~]# rm -f oinkmaster-2.0-0.noarch.rpm

■Oinkmaster設定

Oinkmaster設定ファイル編集
[root@linux ~]# vi /etc/oinkmaster.conf
# Example for Snort 2.4
# url = http://www.snort.org/pub-bin/oinkmaster.cgi/<oinkcode>/snortrules-snapshot-2.4.tar.gz
url = http://www.snort.org/pub-bin/downloads.cgi/Download/vrt_pr/snortrules-pr-2.4.tar.gz ← 追加
# Example for Community rules
# 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 ← 追加

■Oinkmaster確認

[root@linux ~]# oinkmaster.pl -o /etc/snort/rules/
Loading /etc/oinkmaster.conf
Downloading file from http://www.snort.org/pub-bin/downloads.cgi/Download/vrt_pr/snortrules-pr-2.4.tar.gz... done.
Archive successfully downloaded, unpacking... done.
Downloading file from http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules-2.4.tar.gz... done.
Archive successfully downloaded, unpacking... done.
Setting up rules structures... done.
Processing downloaded rules... disabled 0, enabled 0, modified 0, total=4122
Setting up rules structures... done.
Comparing new files to the old ones... done.
[***] Results from Oinkmaster started 20061028 09:46:23 [***]
[*] Rules modifications: [*]
None.
[*] Non-rule line modifications: [*]
None.
[+] Added files (consider updating your snort.conf to include them if needed): [+]
-> community-bot.rules
-> community-deleted.rules
-> community-dos.rules
-> community-exploit.rules
-> community-ftp.rules
-> community-game.rules
-> community-icmp.rules
-> community-imap.rules
-> community-inappropriate.rules
-> community-mail-client.rules
-> community-misc.rules
-> community-nntp.rules
-> community-oracle.rules
-> community-policy.rules
-> community-sid-msg.map
-> community-sip.rules
-> community-smtp.rules
-> community-sql-injection.rules
-> community-virus.rules
-> community-web-attacks.rules
-> community-web-cgi.rules
-> community-web-client.rules
-> community-web-dos.rules
-> community-web-iis.rules
-> community-web-misc.rules
-> community-web-php.rules
[root@linux ~]# ll /etc/snort/rules/ ← ルールファイルがダウンロードされていることを確認
合計 2352
-rw-r--r-- 1 root root  17989 10月 28 09:33 LICENSE
-rw-r--r-- 1 root root  17334 10月 28 09:30 VRT-License.txt
-rw-r--r-- 1 root root   5520 10月 28 09:30 attack-responses.rules
・
・
・

■Oinkmaster定期自動実行設定

[root@linux ~]# crontab -e ← cron編集
00 00 * * * /usr/bin/oinkmaster.pl -o /etc/snort/rules/ 2>&1|logger -t oinkmaster
毎日00:00にOinkmasterを実行する