2002/4/23
バージョン Snort 1.8.5
ACID 0.9.6b21
OS Red Hat Linux 7.2
公式サイト Snort http://www.snort.org/
ACID http://www.andrew.cmu.edu/~rdanyliw/snort/snortacid.html

Snortはフリーの不正侵入検知システム(IDS)です。パケットを監視、パターンを照合し、不正アクセスと思われる通信をログに記録します。これに、ACIDというソフトウェアを組み合わせれば、状況をWebブラウザからビジュアルに確認することができます。

Snortのインストール

libpcapというライブラリをインストールする必要がありますが、私の環境では最初からインストールされていたので、説明を割愛します。

まず、通常のTARボールインストール手順でインストールします。

$ tar xvfz snort-1.8.5.tar.gz

$ cd snort-1.8.5
$ ./configure

$ make

$ su

# make install

次に、設定ファイルを/etc/snortにコピーします。

# mkdir /etc/snort
# cp snort.conf /etc/snort

ルールセットを/etc/snortにコピーします。

# cp *.rules /etc/snort/
# cp classification.config /etc/snort/

snortというユーザーを作ります。

# /usr/sbin/adduser snort

ログの出力先ディレクトリを作って所有者をsnortにしておきます。

# mkdir /var/log/snort
# chown snort:snort /var/log/snort

テストのために、起動します。

# snort -i lo -u snort -g snort -c /etc/snort/snort.conf

これの状態で、ping localhostとしてみれば、/var/log/snort以下にログが出力されるのを確認できます。

確認できたら、システム起動時にデーモンとして起動するようにします。(OSの種類によって手順が異なります)

/etc/rc.d/init.d/snortを作ります。

#!/bin/sh
# chkconfig: - 91 35
# description: snort

. /etc/rc.d/init.d/functions

SERVICE="snort"
SERVER="/usr/local/bin/snort"
ARGS="-D -i eth0 -u snort -g snort -c /etc/snort/snort.conf"

case "$1" in
  start)
        echo -n "Starting $SERVICE: "
        daemon "$SERVER $ARGS"
        echo
        touch /var/lock/subsys/$SERVICE
        ;;
  stop)
        echo -n "Stopping $SERVICE: "
        killproc $SERVICE
        echo
        rm -f /var/lock/subsys/$SERVICE
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: $SERVICE {start|stop|restart}"
        exit 1
esac

exit 0

exit 0

起動設定します。

# /sbin/chkconfig --add snort

ログをPostgreSQLに記録するには

普通にインストールすると、ログはファイルに出力されます。ACIDを使うには、ログをデータベースに出力するようにする必要があります。ここではDBMSとしてPostgreSQLを使用します。

Snortはconfigureで--with-postgresqlを指定して、コンパイル、インストールされている必要があります。

$ ./configure --with-postgresql=/usr/local/pgsql

PostgreSQLのユーザーとデータベースを作り、Snortのパッケージに含まれているcontrib/create_postgresqlを流し込んでスキーマを設定します。

$ createuser snort
Shall the new user be allowed to create databases? (y/n) n
Shall the new user be allowed to create more new users? (y/n) n

$ createdb snort

$ psql -f contrib/create_postgresql snort snort

/etc/snort/snort.confに次の行を加えます。

output database: log, postgresql, user=snort dbname=snort

以上で設定は完了ですが、Snort起動時に次のようなエラーが出る場合があります。

Starting snort: /usr/local/bin/snort:
error while loading shared libraries: libpq.so.2:
cannot open shared object file: No such file or directory

この場合、/etc/ld.so.confに、次の行を追加してください。

/usr/local/pgsql/lib

そして、ldconfigを実行してください。

# /sbin/ldconfig

ACIDを設定

まず上に書いたようにデータベースにログを記録するいようにしておく必要があります。さらに、実行のためにPHP、PHPlot(もちろんGDも)、ADODBが必要です。

PHPLOTのインストール

GDは既にインストールされているという前提で、説明を省略します。

PHPLOTは次の場所からダウンロードできます。

http://www.phplot.com/

インストールは展開して適当なパスにコピーするだけです

$ tar xvfz phplot-4.4.6.tar.gz

$ su

# mv phplot-4.4.6 /usr/local/phplot
# exit

ADODBのインストール

ADODBは次の場所からダウンロードできます。

http://php.weblogs.com/ADODB/

これも展開して適当なパスにコピーするだけです。

$ tar xvfz adodb190.tgz

$ su

# mv adodb /usr/local
# exit

ACIDのインストール

準備が整ったらようやくACIDのインストールです。アーカイブをPHPが実行できるWebサーバのパス上に展開します。

$ tar xvfz acid-0.9.6b21.tar.gz

# mv acid /usr/local/apache2/htdocs/

acid_conf.phpを編集します。設定する内容は次の通りです。

$DBtype = "postgres";

$DBlib_path = "/usr/local/adodb";
$ChartLib_path = "/usr/local/phplot";

$alert_dbname   = "snort";
$alert_host     = "localhost";
$alert_port     = "";
$alert_user     = "snort";
$alert_password = "";

ACIDはPostgreSQLにTCP/IP接続しますので、PostgreSQLインストール先のdata/postgresql.confのtcpip_socketをtrueにしておきます。(PostgreSQL使用の場合)

tcpip_socket = true

これで、http://HOST/acid/のようにアクセスしてみます。うまくいくと、データベースの設定ページへ進むように案内するページが表示されます。ここでデータベースの設定をしてください。

ルールセットのメンテナンス

Snortでは、新しい脅威に対応するために、常に最新のルールセットを維持することが重要です。私は次のようなスクリプトをcronで1日1回自動実行して、ルールセットを自動更新しています。もうちょっと綺麗な方法があるかもしれませんけど。

cd /tmp
/usr/bin/wget -q http://www.snort.org/dl/signatures/snortrules.tar.gz
tar xvfz snortrules.tar.gz > /dev/null
cp -rf rules/* /etc/snort
rm -rf rules
rm snortrules.tar.gz
echo "output database: log, postgresql, user=snort dbname=snort" \
> /etc/snort/local.rules
/etc/rc.d/init.d/snort restart > /dev/null