第8回 IPFilterでIDS
2002/9/28作成
2003/7/9更新
侵入検知装置(IDS)としてsnortを入れようとしたのですが、同様の機能であればIPFilterのログでできることがわかったので、rubyと組み合わせてIDSを作ることにしました。
手っ取り早くイメージだけ見たい人はこちらへどうぞ。
まだまだ改造していくつもりです。
0時のログをまわしているので、0時くらいに見てもつまらないと思います。
1.ログをまわす
ログをまわすというのはlog rotationのことで、ログは取り続けるとディスクがいっぱいになってしまうので古いログをよそに移したり、圧縮して保存したり、古いログを削除したりすることです。
IPFilterの設定については他に書いてあるのでここでは説明しません。
第三回の特集でも見てください。
ipmonをかけているので、ルールで設定したログが/var/log/ipflogにたまっていきます。
放っておくと永久にたまり続けるので分割することにします。
レポートを出すのも1日ごとの方がみやすいと思うので、日付が変わる深夜0時にログをまわすことにします。
FreeBSDの場合、newsyslogというツールがあるのでこれを使いましょう。
/etcにnewsyslog.confというファイルがあるので、これを編集します。
詳しくはnewsyslogのマニュアルを読みましょう。いろんなことができるので参考になります。
# logfilename [owner:group] mode count size when [ZJB] [/pid_file] [sig_num]
/var/log/ipflog 600 10 * $D0 - /var/run/ipmon.pid
上のは/var/log/ipflogのログを毎日0時に新しいファイル(パーミッション600)と入れ替えて古いファイルは無圧縮で10個まで取っておき、入れ替えが終わったら/var/run/pidにHUPシグナルを送るという意味です。
今回は無圧縮ですが、gzipやbzipで圧縮することもできます。今回圧縮しない理由はrubyで読むとき圧縮していない方がプログラムが楽だからです。
rubyにzlibのライブラリがあるのでこれを組み込めば圧縮してもいいでしょう。
応用として、古いログを残すために削除される前にcronを仕掛けてtarしておくというのもいいでしょう。
そのtarをさらにまわすと楽しいかもしれません。
2.プログラムを仕掛ける
あとはrubyで作ったプログラムを仕掛けるだけです。
今回はlogをparseするクラスとHTMLを生成する本体の2つのファイルで作ってあります。
本体は30分くらいで作りましたが、parserはいろいろいじりながら半日くらいで作りました。
画面はログの表示イメージはこんな感じです。
あと、要望があったのでプログラムとページ一式をこちらにおいておきます。
そのままでは使えないと思いますので、
動作環境は、以下のとおりです。けっこう環境依存してます。
ソースが汚くて恥ずかしい限りです。
- eRubyが動くこと
- ipfilterでログを取っていること
- ログは1日毎ローテを回して、しかも圧縮していないこと
- インタフェースはng0のみ(モジュールの方を修正すれば他にも使えます)
アドバイスとかあったら掲示板でも結構ですし、直メールでも指摘いただければと思います。
とりあえず、私の気力と理解が及ぶ範囲では質問・改良などには対応させていただきますが、気長にお待ちいただけると幸いです。
3.残課題
やり残したことです。難易度順にやっていくと思います。
・古いログも見られるようにする (難易度:★☆☆☆☆)
・ポート番号からサービスを引けるようにする(難易度:★★★☆☆)
・IPアドレスからホスト名を引くようにする(処理が遅くなりそう)(難易度:★★☆☆☆)
・1日分のレポートをメールで出す(難易度:★★★★☆)
・SNMPトラップが出せたらいいなぁ(難易度:★★★★★)