BarnyardはSnortとは別プロセスで動作して、Snortが出力したUnifiedフォーマットのアラート/ログを解析する。Snortとは別プロセスで動作することにより、解析などの重い処理がSnortのパケット処理に影響しないようになっている。既存のログをバッチモードで処理させることも可能となっている。
BarnyardはSnortには含まれていないため、オフィシャルページ(http://sourceforge.net/projects/barnyard/)より、ソースファイルをダウンロードする。
一般的なビルド方法でビルドができる。設定ファイル(barnyard.conf)のサンプルがあるので、テキトウなディレクトリに格納する。今回はSnortの設定ファイルと同じディレクトリに格納した。
$ ./configure
$ make
$ make check
$ make install
# cp etc/barnyard.conf /etc/snort/conf.d/
$ ./configure
$ make
$ make check
$ make install
# cp etc/barnyard.conf /etc/snort/conf.d/
- ソースを追加する。
- Makefile.amに追加したソースを追加する。
- 初期化コールバックを呼び出すようにする。
- Barnyardを再ビルドする。
新しいプラグインは、以下のようにsrc/output-plugins/のディレクトリにヘッダファイルとソースファイルに分割して格納する。
src/output-plugins/op_alert_newplugin.h
src/output-plugins/op_alert_newplugin.c
src/output-plugins/Makefile.amのlibop_a_SOURCEの最後に追加したソースファイルを追加する。
提供されているop_plugbase.cに、追加するプラグインのヘッダのインクルードと初期化コールバックの呼び出しを追加する。
Barnyardで提供されるMakefileでは、プラグインの追加・変更を行う場合はBarnyard本体の再ビルドが必要となる。
src/output-plugins/op_plugbase.cの/* Output plug-in include files */と書かれている辺りに#include "op_alert_newplugin.h"を追加する。
void LoadOutputPlugins()の最後に、OpAlertNewpulugin_Init();の呼び出しを追加する。
autojunk.sh実行して、Barnyardを再ビルドする。(configureからやり直す)
プラグイン内では、以下の構造体を使ってUnifiedファイルにアクセスすることができる。
/* Unified alert message format * * One per event notification, all the important data for people to know */ typedef struct _UnifiedAlertRecord { Event event; struct timeval ts; /* event timestamp */ u_int32_t sip; /* src ip */ u_int32_t dip; /* dest ip */ u_int16_t sp; /* src port */ u_int16_t dp; /* dest port */ u_int32_t protocol; /* protocol id */ u_int32_t flags; /* any other flags (fragmented, etc) */ } UnifiedAlertRecord; typedef struct _Event { u_int32_t sig_generator; /* which part of snort generated the alert? */ u_int32_t sig_id; /* sig id for this generator */ u_int32_t sig_rev; /* sig revision for this id */ u_int32_t classification; /* event classification */ u_int32_t priority; /* event priority */ u_int32_t event_id; /* event ID */ u_int32_t event_reference; /* reference to other events that have gone off, * such as in the case of tagged packets... */ struct timeval ref_time; /* reference time for the event reference */ } Event;
BarnyardはSnortと同様にC言語で書かれているため、プラグインや使いたいライブラリがC++で書かれている場合は、configure.inの修正などが必要となる。
C++では関数のオーバロードが行えるため、関数名に引数の形式を合わせたものを使って関数を識別している(マングル)。C言語はマングルを理解しないため、C言語から呼ばれる関数はヘッダ類にextern "C"を追加してマングルさせないようにする。
LoadOutputPlugins()から呼び出されるOpNewpulugin_Init()はextern "C"を追加してマングルさせないようにする。
C++用のコンパイラを使えるように、configure.inにAC_PROG_CXXを追加する。
使用するライブラリはsrc/Makefile.amに追加で記述する。以下はlibstadc++を追加する例。
C++では関数のオーバロードが行えるため、関数名に引数の形式を合わせたものを使って関数を識別している(マングル)。C言語はマングルを理解しないため、C言語から呼ばれる関数はヘッダ類にextern "C"を追加してマングルさせないようにする。
extern "C" { #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "barnyard.h" #include "util.h" #include "input-plugins/dp_alert.h" #include "output-plugins/op_plugbase.h" #include "classification.h" #include "sid.h" #include <netinet/in.h> } // end of extern "C"
LoadOutputPlugins()から呼び出されるOpNewpulugin_Init()はextern "C"を追加してマングルさせないようにする。
extern "C" void OpAlertCu_Init() {
C++用のコンパイラを使えるように、configure.inにAC_PROG_CXXを追加する。
# Disable annoying practice of recursively re-running the autotools AM_MAINTAINER_MODE AC_PROG_CC_STDC AC_PROG_CC AC_PROG_CXX AC_PROG_LIBTOOL AC_PROG_RANLIB AC_C_BIGENDIAN AC_C_INLINE
使用するライブラリはsrc/Makefile.amに追加で記述する。以下はlibstadc++を追加する例。
barnyard_LDADD = output-plugins/libop.a input-plugins/libdp.a -lstdc++
最新コメント