会社の職務で社内からの情報流出を防ぐ為にIDS/IPSの導入を検討していた。
One Point Firewallをいうのを導入しようとしていたのだが、いろいろ調べていたら
IDSとしてFreeBSDでもsnortを使用する事により可能である事が分かった。
お金もかかるので、その分を人件費に考えて試しにインストールして動かしました。
そして、うまくいき正式稼働へと進めている所です。
自宅サーバーの掲示板に宣伝広告の書き込みがうざいので、これを利用して
排除できないかトライして見る為に導入して見た。
しかしルールが上手く作れないので、本来の用途である不正侵入という意味で
インストールし稼働して見る事にする。
最近ではゴミメールも多く、掲示板も邪魔なアクセス、いろいろとぶっそうなので
皆さんもいれてみてはいかがでしょうか?
まず、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を使用して
で、うまくrulesのディレクトリーに入ります
# 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
次にコミュニティールールを入手します
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
これらのルールはあまり触らないほうがよいでしょう
触ったら上手く動かなくなりました。
まずはデフォルトのみで使用しましょう
設定ファイルを設定します
/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のポートです
それでは起動して見ましょう
再起動するか下記コマンドでスタートします
もし上手く動かない場合は
# /usr/local/etc/rc.d/snort start
/var/log/messages
を見て見ましょう
動いた場合は
/var/log/snort
にファイルが作成されます
メインで見るのは
/var/log/snort/alert
になります
ほおっておくと、ログが膨大になるかもしれませんのでlogrotateしておきましょう
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
290行目です
# return @arr->[($first-1)..$end];
return @arr[($first-1)..$end];
/usr/local/libdata/snortsnarf/SnortSnarf/HTMLAnomMemStorage.pm
266行目です
# return @arr->[($first-1)..$end];
return @arr[($first-1)..$end];
まずこれでエラーは無くなります
では実行して見ましょう
/usr/local/www/snortは吐き出すディレクトリーです
# rehash
# snortsnarf -d /usr/local/www/snort /var/log/snort/alert
.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経由で変換しました
そのまま使用してもよいのですが、会社で行った独自ルールの追加を少し説明します
会社では情報漏洩を防ぐ為に、独自のルールを追加しました。
完成したら順次追加して行きたいと思います。
まずはFTPでのアップロードを規制します
編集するファイルはlocal.rulesです
/usr/local/etc/snort/rules.local.rules
本当はFlagsも付ければちゃんとするのでしょうけど良く分かっていないので・・・
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
だんだん、通信プロトコルまで理解しないとなかなかできませんね
ルールのそれぞれの意味は
http://www.snort.gr.jp/transdoc/html/doc012.html
こちらに詳しく記載されています