不正侵入検知システム(snort)

1.はじめに

会社の職務で社内からの情報流出を防ぐ為にIDS/IPSの導入を検討していた。
One Point Firewallをいうのを導入しようとしていたのだが、いろいろ調べていたら
IDSとしてFreeBSDでもsnortを使用する事により可能である事が分かった。
お金もかかるので、その分を人件費に考えて試しにインストールして動かしました。
そして、うまくいき正式稼働へと進めている所です。

自宅サーバーの掲示板に宣伝広告の書き込みがうざいので、これを利用して
排除できないかトライして見る為に導入して見た。
しかしルールが上手く作れないので、本来の用途である不正侵入という意味で
インストールし稼働して見る事にする。
最近ではゴミメールも多く、掲示板も邪魔なアクセス、いろいろとぶっそうなので
皆さんもいれてみてはいかがでしょうか?

2.インストール

まず、snort本体をインストールします。
インストールはportsから入れます。
# cd /usr/ports/security/snort
# make install clean
初めての場合はオプション選択画面が出て来ます
あえて設定し直したい時は「make config」で設定しましょう
私がONしたのは
DYNAMIC FLEXRESP MYSQL
です。
FLEXRESPは検知だけではなく不正なアクセスを切断する為に必要になります
MYSQLは、ログをMySQLへ吐き出せるのですが、後で使用するだろうと思いとりあえず入れました。

インストールすると他にも必要な物もインストールしますのでそれなりに時間がかかります。

次にルールを入手します
snort本家より入手します
http://www.snort.org/pub-bin/downloads.cgi
ここから
Sourcefire VRT Certified Rules - The Official Snort Ruleset (unregistered user release)
という項目の
http://www.snort.org/pub-bin/downloads.cgi/Download/vrt_pr/snortrules-pr-2.4.tar.gz
をダウンロードします
FreeBSDマシンへ直接落とすにはwgetを使用して
# cd /usr/local/etc/snort
# wget http://www.snort.org/pub-bin/downloads.cgi/Download/vrt_pr/snortrules-pr-2.4.tar.gz
# tar xvzf snortrules-pr-2.4.tar.gz
# rm -R doc
# rm snortrules-pr-2.4.tar.gz
で、うまくrulesのディレクトリーに入ります

次にコミュニティールールを入手します
Community Rules
という項目の
http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules-2.4.tar.gz
をダウンロードします
先程と同じ方法で
# cd /usr/local/etc/snort
# wget http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules-2.4.tar.gz
# tar xvzf Community-Rules-2.4.tar.gz
# rm -R docs
# rm Community-Rules-2.4.tar.gz
これでルールがインストールされました
これらのルールはあまり触らないほうがよいでしょう
触ったら上手く動かなくなりました。

3.設定

まずはデフォルトのみで使用しましょう
設定ファイルを設定します
/usr/local/etc/snort/snort.conf を編集する
変更した箇所は
var HOME_NET 自宅サーバーのWAN側IP
var EXTERNAL_NET !$HOME_NET

include $RULE_PATH/web-attacks.rules
include $RULE_PATH/virus.rules
include $RULE_PATH/p2p.rules
# 上記3個のコメントアウトを外し有効にする
# エラーの出具合でやめるかもしれませn

# include $RULE_PATH/spyware-put.rules
# これも有効にしたかったのですがルールが見当らずそのまま
だけです

次に起動時からスタートする為にrc.confへ追記します
/etc/rc.conf
snort_enable="YES"
snort_flags="-Dde -h 自宅サーバーのWAN側IP/32"
snort_interface="tun0" #WANのポートです

4.起動

それでは起動して見ましょう
再起動するか下記コマンドでスタートします
# /usr/local/etc/rc.d/snort start
もし上手く動かない場合は
/var/log/messages
を見て見ましょう
動いた場合は
/var/log/snort
にファイルが作成されます
メインで見るのは
/var/log/snort/alert
になります
ほおっておくと、ログが膨大になるかもしれませんのでlogrotateしておきましょう

5.ログをブラウザ経由で見る

snortのログを解析するのに非常に便利なsnortsnarfを使用します
ではインストールします
# cd /usr/ports/security/snortsnarf
# make install clean
どこのページを見ても一部エラーするようで私もエラーしたので下記場所を修正します
エラーはこんなかんじ
Using an array as a reference is deprecated at /usr/local/libdata/snortsnarf/SnortSnarf/HTMLMemStorage.pm line 290.
Using an array as a reference is deprecated at /usr/local/libdata/snortsnarf/SnortSnarf/HTMLAnomMemStorage.pm line 266.

では修正します
/usr/local/libdata/snortsnarf/SnortSnarf/HTMLMemStorage.pm
# return @arr->[($first-1)..$end];
return @arr[($first-1)..$end];
290行目です

/usr/local/libdata/snortsnarf/SnortSnarf/HTMLAnomMemStorage.pm
# return @arr->[($first-1)..$end];
return @arr[($first-1)..$end];
266行目です

まずこれでエラーは無くなります
では実行して見ましょう
# rehash
# snortsnarf -d /usr/local/www/snort /var/log/snort/alert
/usr/local/www/snortは吐き出すディレクトリーです
.htaccessでも置いてアクセス制限しておきましょう
念のため、SSL用の場所にするのもよいでしょう。

これであとはアクセスして見て下さい

このままでは、表示が英語で分かりにくいですよね
Fujiiさんが日本語化してくれていますモジュールを使う事にします
http://mt-fuji.ddo.jp/
こちらにある
http://mt-fuji.ddo.jp/~fujito/Linux/secu_soft/s2/HTMLOutput.pm
を差替えます
# cd /usr/local/libdata/snortsnarf/SnortSnarf
# mv HTMLOutput.pm HTMLOutput.pm.org
# wget http://mt-fuji.ddo.jp/~fujito/Linux/secu_soft/s2/HTMLOutput.pm
これでもう一度
# snortsnarf -d /usr/local/www/snort /var/log/snort/alert
と実行してアクセスすると
あら、日本語になっています
Fujii様ありがとうございますm(_ _)m
でも改行コードはCR+LFではなくLFだけになっているとよかったです
私はSamba経由で変換しました

6.独自のルールを追加する

そのまま使用してもよいのですが、会社で行った独自ルールの追加を少し説明します
会社では情報漏洩を防ぐ為に、独自のルールを追加しました。
完成したら順次追加して行きたいと思います。

まずはFTPでのアップロードを規制します
編集するファイルはlocal.rulesです
/usr/local/etc/snort/rules.local.rules
alert tcp $HOME_NET any -> $EXTERNAL_NET 21 (msg:"FTP Upload"; flow:from_client,established; content:"STOR "; nocase; resp:rst_all
alert tcp $HOME_NET any -> $EXTERNAL_NET 21 (msg:"FTP Upload"; flow:from_client,established; content:"APPE "; nocase; resp:rst_all
本当はFlagsも付ければちゃんとするのでしょうけど良く分かっていないので・・・
だんだん、通信プロトコルまで理解しないとなかなかできませんね
ルールのそれぞれの意味は
http://www.snort.gr.jp/transdoc/html/doc012.html
こちらに詳しく記載されています