不正アクセス検知システム(Snort)の導入

不正アクセスを検知する為にネットワーク型IDS(Intrusion Detection System)として「Snort」を導入する。
また、Webブラウザで不正アクセスログを確認する為、「SnortSnarf」も導入する。
そして、「Snort」が不正アクセスとして判断するルールファイルの最新化を自動化する為、「Oinkmaster」を導入する。
なお、「Apache」の設定は完了済みとする。

「Snort」のインストール

「Snort」用のユーザを作成する。

FreeBSD# pw useradd -n snort -u 10000 -d /usr/local/etc/snort -s /nonexistent

「Snort」のインストール

FreeBSD# cd /usr/ports/security/snort <= 作業ディレクトリへ移動
FreeBSD# make install clean <= 「Snort」のインストール
インストールの際に聞かれるオプションは以下をチェック
[X] FLEXRESP    Flexible response to events
「Snort」の設定

「Snort」の設定

FreeBSD# cp /usr/local/etc/snort/unicode.map-sample /usr/local/etc/snort/unicode.map
FreeBSD# cp /usr/local/etc/snort/classification.config-sample /usr/local/etc/snort/classification.config
FreeBSD# cp /usr/local/etc/snort/reference.config-sample /usr/local/etc/snort/reference.config
 <= サンプルファイルのコピー
FreeBSD# cp /usr/local/etc/snort/snort.conf-sample /usr/local/etc/snort/snort.conf
 <= サンプル設定ファイルのコピー
FreeBSD# chmod 644 /usr/local/etc/snort/snort.conf <= 設定ファイルに書き込み権限付加
FreeBSD# vi /usr/local/etc/snort/snort.conf <= 設定ファイルの編集
var HOME_NET any
↓
var HOME_NET 192.168.0.0/24 <= 監視対象とするネットワークアドレスを指定

var EXTERNAL_NET any
↓
var EXTERNAL_NET !$HOME_NET <= ローカルネットワークからのアクセスは不正アクセスとしない

preprocessor portscan: $HOME_NET 5 7 portscan.log <= 最下行へ追加(ポートスキャンを検知する)
preprocessor portscan: より右の内容は
 検知したいホスト/ネットワークのIPアドレス
 検知量
 検知時間(秒)
 ログの位置
となり、検知時間(秒)以内に検知量以上のコネクションが発生した場合にポートスキャンと判断する

ディレクトリの作成

ルールファイルを置く場所とログファイルを出力するディレクトリを作成する。

FreeBSD# mkdir /usr/local/etc/snort/rules <= ルールファイル用ディレクトリの作成
FreeBSD# chown snort:snort /usr/local/etc/snort/rules <= オーナの変更
FreeBSD# mkdir /var/log/snort <= ログファイル用ディレクトリの作成
FreeBSD# chown snort:snort /var/log/snort <= オーナの変更

ルールファイルのインストール

ルールファイルの取得にwgetを用いているが、導入していない場合、portsよりインストールする。
wgetの場所は /usr/ports/ftp/wget になる。

FreeBSD# wget http://www.snort.org/pub-bin/downloads.cgi/Download/vrt_pr/snortrules-pr-2.4.tar.gz
 <= ルールファイルのダウンロード
FreeBSD# tar xzf snortrules-pr-2.4.tar.gz <= ダウンロードしたファイルの展開
FreeBSD# cp -r ./rules/* /usr/local/etc/snort/rules/ <= ルールファイルのコピー

ダウンロード・展開で出来たファイル・ディレクトリの削除
FreeBSD# rm -rf ./rules
FreeBSD# rm -rf ./doc
FreeBSD# rm -f ./snortrules-pr-2.4.tar.gz
「Snort」の起動

「Snort」をデーモンモードで起動する。

FreeBSD# /usr/local/bin/snort -Dde -u snort -g snort -c /usr/local/etc/snort/snort.conf -l /var/log/snort

なお、「Snort」起動時の主なオプションは以下の通り。

起動オプション 説明
-b ログをtcpdumpのフォーマットで保存する。
-c 設定ファイルを指定。
-d アプリケーション層のデータをダンプする。
-D デーモンモードで起動。
特に指定がなければ、/var/log/snort/alertファイルにログを出力する。
-e リンク層のパケットのヘッダを表示したり、ログとして保存する。
-g 「Snort」を起動するユーザの属するグループを指定。
-h 自分の属するネットワークを指定。
-i パケットをスニファするインターフェイス名を指定。
-l ログを保存するディレクトリを指定。
-u 「Snort」を起動するユーザを指定。
-v コンソールにパケットを表示する。

「Snort」の自動起動

FreeBSD# vi /etc/rc.conf <= 設定ファイルの編集
snort_enable="YES" <= 追加
snort_flags="-Dde -u snort -g snort -l /var/log/snort" <= 追加
snort_interface="fxp0" <= 追加
snort_conf="/usr/local/etc/snort/snort.conf" <= 追加
「SnortSnarf」のインストール

「SnortSnarf」のインストール

FreeBSD# cd /usr/ports/security/snortsnarf <= 作業ディレクトリへ移動
FreeBSD# make install clean <= 「SnortSnarf」のインストール
「SnortSnarf」の設定

「SnortSnarf」の設定

「SnortSnarf」の実行時に以下のエラーメッセージが出力されることへの対処。
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.

FreeBSD# vi /usr/local/libdata/snortsnarf/SnortSnarf/HTMLMemStorage.pm <= SnortSnarfのpmファイルの編集
return @arr->[($first-1)..$end];
↓
return @arr[($first-1)..$end]; <= "->" を削除

FreeBSD# vi /usr/local/libdata/snortsnarf/SnortSnarf/HTMLAnomMemStorage.pm <= SnortSnarfのpmファイルの編集
return @arr->[($first-1)..$end];
↓
return @arr[($first-1)..$end]; <= "->" を削除

「Apache」の設定

「SnortSnarf」によるHTML出力先ディレクトリを作成し、「Apache」からアクセス出来るようにする。

FreeBSD# mkdir /usr/local/www/snort <= 「SnortSnarf」によるHTML出力先ディレクトリの作成

FreeBSD# vi /usr/local/etc/apache21/httpd.conf <= 設定ファイルの編集
Alias /snort /usr/local/www/snort <= 追加

内部からのみアクセスする場合
<Location /snort>
    Order deny,allow
    Deny from All
    Allow from 127.0.0.1
    Allow from 192.168.0 <= ローカルネットワークのIPアドレスを指定
    Allow from ::1
</Location>
ここまで

外部からもアクセスする場合
<Location /snort>
    Order deny,allow
    Deny from All
    Allow from All
    Allow from ::1
</Location>
ここまで


FreeBSD# /usr/local/sbin/apachectl restart<= 「Apache」の再起動
「SnortSnarf」の実行

portsからインストールした場合、カレントディレクトリに移動しなくても「SnortSnarf」を実行出来る。

FreeBSD# /usr/local/bin/snortsnarf -dns -d /usr/local/www/snort \
/var/log/snort/alert /var/log/snort/portscan.log

http://サーバのIPアドレス/snort/ とアクセスする。

「SnortSnarf」の自動実行

cronに登録し、1時間ごとに実行する。

FreeBSD# vi ~/snortsnarf.sh <= スクリプトファイルの作成
#!/bin/sh

/usr/local/bin/snortsnarf -dns -d /usr/local/www/snort /var/log/snort/alert /var/log/snort/portscan.log


FreeBSD# chmod 755 ~/snortsnarf.sh <= スクリプトに実行権限付加
FreeBSD# vi /etc/crontab <= 設定ファイルの編集
00 * * * * root /root/snortsnarf.sh <= 追加(1時間ごとにスクリプト実行)
「SnortSnarf」の日本語化

日本語化された「HTMLOutput.pm」をダウンロードする。
ダウンロードにはwgetを用いているが、導入していない場合、portsよりインストールする。
wgetの場所は /usr/ports/ftp/wget になる。
また、ダウンロードする「HTMLOutput.pm」の日本語コードはSJISの為、文字化けしてしまうので文字コードをEUCに変換する。
文字コードの変換にはnkfを用いているが、導入していない場合、portsよりインストールする。
nkfの場所は /usr/ports/japanese/nkf になる。
なお、日本語化ファイルに変更した後は「SnortSnarf」を実行する必要があるが、ここでは上記で作成したスクリプトにより実行している。

FreeBSD# cd /usr/local/libdata/snortsnarf/SnortSnarf
FreeBSD# mv HTMLOutput.pm HTMLOutput.pm.org <= オリジナルファイルをリネーム
FreeBSD# wget http://mt-fuji.ddo.jp/~fujito/Linux/secu_soft/s2/HTMLOutput.pm
 <= 日本語化ファイルのダウンロード
FreeBSD# mv HTMLOutput.pm HTMLOutput.pm.tmp <= ダウンロードしたファイルをリネーム
FreeBSD# nkf -e HTMLOutput.pm.tmp > HTMLOutput.pm <= 文字コードをEUCに変換
FreeBSD# rm -f HTMLOutput.pm.tmp <= 文字コードがSJISのファイルを削除
FreeBSD# /root/snortsnarf.sh <= 「SnortSnarf」の実行
「Oinkmaster」のインストール

「Oinkmaster」のインストール

FreeBSD# cd /usr/ports/security/oinkmaster <= 作業ディレクトリへ移動
FreeBSD# make install clean <= 「Oinkmaster」のインストール

FreeBSD# rehash <= パスを通す
「Oinkmaster」の設定
FreeBSD# chmod 644 /usr/local/etc/oinkmaster.conf <= 設定ファイルに書き込み権限付加
FreeBSD# vi /usr/local/etc/oinkmaster.conf <= 設定ファイルの編集
# url = http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules.tar.gz
↓
url = http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules-2.4.tar.gz
 <= ルールファイルのダウンロード元を指定
「Oinkmaster」の実行

いきなりすべてのルールを変更するのは危険なので、「Oinkmaster」実行時に現在のルールファイルをバックアップするようにする。

FreeBSD# mkdir /usr/local/etc/snort/rules/backup <= バックアップ用ディレクトリの作成
FreeBSD# chmod 770 /usr/local/etc/snort/rules/backup <= ディレクトリのパーミッションを変更

「Oinkmaster」の実行

FreeBSD# oinkmaster \
-C /usr/local/etc/oinkmaster.conf -o /usr/local/etc/snort/rules/ -b /usr/local/etc/snort/rules/backup/

「Snort」の設定

「Oinkmaster」でCommunityのルールファイルをダウンロードするように設定したので、 Communityのルールファイルを読み込むようにする。

FreeBSD# vi /usr/local/etc/snort/snort.conf <= 設定ファイルの編集
以下のように読み込ませたいルールファイルを追加する
include $RULE_PATH/community-bot.rules

「Snort」の再起動

「Snort」を再起動し、ルールファイルを読み込みなおす。

FreeBSD# kill -KILL `cat /var/run/snort_fxp0.pid`
FreeBSD# /usr/local/bin/snort -Dde -u snort -g snort -c /usr/local/etc/snort/snort.conf -l /var/log/snort

「Oinkmaster」の自動実行

cronに登録し、毎日12時に実行する。
また、ルールファイルを更新したら「Snort」も再起動させる。

FreeBSD# vi ~/oinkmaster.sh <= スクリプトファイルの作成
#!/bin/sh

/usr/local/bin/oinkmaster -C /usr/local/etc/oinkmaster.conf -o /usr/local/etc/snort/rules/ -b /usr/local/etc/snort/rules/backup/
kill -KILL `cat /var/run/snort_fxp0.pid`
/usr/local/bin/snort -Dde -u snort -g snort -c /usr/local/etc/snort/snort.conf -l /var/log/snort


FreeBSD# chmod 755 ~/oinkmaster.sh <= スクリプトに実行権限付加
FreeBSD# vi /etc/crontab <= cronの編集
00 12 * * * root /root/oinkmaster.sh <= 追加
▲ページのトップへ