Barnyard

BarnyardはSnortとは別プロセスで動作して、Snortが出力したUnifiedフォーマットのアラート/ログを解析する。Snortとは別プロセスで動作することにより、解析などの重い処理がSnortのパケット処理に影響しないようになっている。既存のログをバッチモードで処理させることも可能となっている。

Barnyardダウンロード

BarnyardはSnortには含まれていないため、オフィシャルページ(http://sourceforge.net/projects/barnyard/)より、ソースファイルをダウンロードする。

Barnyardビルド

一般的なビルド方法でビルドができる。設定ファイル(barnyard.conf)のサンプルがあるので、テキトウなディレクトリに格納する。今回はSnortの設定ファイルと同じディレクトリに格納した。
$ ./configure
$ make
$ make check
$ make install
# cp etc/barnyard.conf /etc/snort/conf.d/

プラグイン追加

  1. ソースを追加する。
  2. Makefile.amに追加したソースを追加する。
  3. 初期化コールバックを呼び出すようにする。
  4. 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ファイルにアクセスすることができる。
/* 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;

プラグインでのC++使用

BarnyardはSnortと同様にC言語で書かれているため、プラグインや使いたいライブラリがC++で書かれている場合は、configure.inの修正などが必要となる。

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++

メンバーのみ編集できます