トップ  > サーバ設定:運用  > サーバ公開後のセキュリティ対策  > 不正アクセス検知システム導入(Snort+BASE+Oinkmaster)

不正アクセス検知システム導入(Snort+BASE+Oinkmaster)  (最終更新日:2011/09/30)

不正アクセス検知システム(IDS=Intrusion Detection System)をインストールします。

ここでは、ネットワーク型IDSのSnortを導入します。(他にはホスト型IDSと呼ばれるものもあります。)

ネットワーク型IDSはネットワークを監視し、ホスト型IDSはインストールされたホストそのもを監視します。

Snortが抽出した不正アクセスログをWebブラウザ上で確認できるBASEを導入します。

Snortが参照するルールファイルはOinkmasterを導入し、自動で最新化するようにします。

Webサーバ構築(Apache)データベースサーバ構築(MySQL)が導入されていること。

Snortインストール

1.パッケージインストール
RPMforge+EPELリポジトリが導入されいない場合こちらを参照してインストールします。

[root@sv ~]# yum install libpcap-devel libdnet libdnet-devel mysql-devel pcre-devel php-mysql ← Snortに必要なパッケージをインストール
2.daqインストール
[root@sv ~]# wget http://www.snort.org/downloads/1096 -O daq-0.6.1-1.src.rpm ← Snortに必要なdaqをダウンロード(そのままダウンロードするとファイルが長くなるのでファイル名を指定して保存)
※最新版はこちらで確認。(2011/09/30時点。daq-0.6.1-1.src.rpm)

[root@sv ~]# rpm -Uvh daq-0.6.1-1.src.rpm ← daqのSPECファイルのインストール
   1:daq                    警告: ユーザ rjordan は存在しません - root を使用します
警告: グループ rjordan は存在しません - root を使用します
########################################### [100%]
警告: ユーザ rjordan は存在しません - root を使用します
警告: グループ rjordan は存在しません - root を使用します

[root@sv ~]# LDFLAGS="-L/lib64" rpmbuild -bb /root/rpmbuild/SPECS/daq.spec ← daqのRPMパッケージ作成
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.JJjPv5
・
・
・
書き込み完了: /root/rpmbuild/RPMS/x86_64/daq-0.6.1-1.x86_64.rpm
書き込み完了: /root/rpmbuild/RPMS/x86_64/daq-debuginfo-0.6.1-1.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.R2GgMo
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd daq-0.6.1
+ rm -rf /root/rpmbuild/BUILDROOT/daq-0.6.1-1.x86_64
+ exit 0 ← 成功

[root@sv ~]# rpm -Uvh /root/rpmbuild/RPMS/x86_64/daq-0.6.1-1.x86_64.rpm ← 作成したRPMパッケージをインストール
準備中...                ########################################### [100%]
   1:daq                    ########################################### [100%]

[root@sv ~]# mv daq-0.6.1-1.src.rpm app/ ← ダウンロードしたファイルは念のため保存

[root@sv ~]# mv /root/rpmbuild/RPMS/x86_64/daq-* app/ ← 作成したRPMパッケージは念のため保存
2.daqインストール
[root@sv ~]# wget http://www.snort.org/downloads/1105 -O snort-2.9.1-1.src.rpm ← snortダウンロード(そのままダウンロードするとファイルが長くなるのでファイル名を指定して保存)
※最新版はこちらで確認。(2011/09/30時点。snort-2.9.1-1.src.rpm)

[root@sv ~]# rpm -Uvh snort-2.9.1-1.src.rpm ← snortのSPECファイルのインストール
   1:snort                  ########################################### [100%]

[root@sv ~]# MYSQL_LIB_DIR=/usr/lib64/mysql CFLAGS="-I/usr/lib64/mysql -I/lib64 -I/usr/include/mysql" LDFLAGS="-L/usr/lib64/mysql -L/lib64 -L/usr/lib64" rpmbuild -bb /root/rpmbuild/SPECS/snort.spec --with mysql ← SnortのRPMパッケージ作成
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.dg5dbc
・
・
・
書き込み完了: /root/rpmbuild/RPMS/x86_64/snort-2.9.1-1.x86_64.rpm
書き込み完了: /root/rpmbuild/RPMS/x86_64/snort-mysql-2.9.1-1.x86_64.rpm
書き込み完了: /root/rpmbuild/RPMS/x86_64/snort-debuginfo-2.9.1-1.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.Bsd8cw
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd snort-2.9.1
+ /bin/rm -rf /root/rpmbuild/BUILDROOT/snort-2.9.1-1.x86_64
+ exit 0 ← 成功

[root@sv ~]# rpm -Uvh /root/rpmbuild/RPMS/x86_64/snort-2.9.1-1.x86_64.rpm ← 作成したRPMパッケージをインストール
準備中...                ########################################### [100%]
   1:snort                  ########################################### [100%]
[root@sv ~]# rpm -Uvh /root/rpmbuild/RPMS/x86_64/snort-mysql-2.9.1-1.x86_64.rpm ← 作成したRPMパッケージをインストール
準備中...                ########################################### [100%]
   1:snort-mysql            ########################################### [100%]

[root@sv ~]# mv snort-2.9.1-1.src.rpm app/ ← ダウンロードしたファイルは念のため保存

[root@sv ~]# mv /root/rpmbuild/RPMS/x86_64/snort-* app/ ← 作成したRPMパッケージは念のため保存

[root@sv ~]# vi /etc/yum.conf ← yum設定ファイル編集
[main]の最下部に以下を追加
gpgcheck=1
plugins=1
exclude=snort ← yumアップデートの対象から除外する。

Snort設定

1.Snort初期設定
[root@sv ~]# vi /etc/snort/snort.conf ← snort設定ファイル編集

# Setup the network addresses you are protecting
ipvar HOME_NET any
↓
ipvar HOME_NET 192.168.0.0/24 ← 内部ネットワークアドレスを入力

# Set up the external network addresses. Leave as "any" in most situations
ipvar EXTERNAL_NET any
↓
ipvar EXTERNAL_NET !$HOME_NET ← 内部からのアクセスを不正アクセスとしない

# Path to your rules files (this can be a relative path)
# Note for Windows users:  You are advised to make this an absolute path,
# such as:  c:\snort\rules
var RULE_PATH ../rules
↓
var RULE_PATH /etc/snort/rules ← ルールファイルのディレクトりを指定

var SO_RULE_PATH ../so_rules
↓
var SO_RULE_PATH /etc/snort/so_rules ← ルールファイルのディレクトりを指定

var PREPROC_RULE_PATH ../preproc_rules
↓
var PREPROC_RULE_PATH /etc/snort/preproc_rules ← ルールファイルのディレクトりを指定

# path to dynamic preprocessor libraries
dynamicpreprocessor directory /usr/local/lib/snort_dynamicpreprocessor/
↓
dynamicpreprocessor directory /usr/lib64/snort-2.9.1_dynamicpreprocessor/ ← dynamicpreprocessor directoryパスを指定

# path to base preprocessor engine
dynamicengine /usr/local/lib/snort_dynamicengine/libsf_engine.so
↓
dynamicengine /usr/lib64/snort-2.9.1_dynamicengine/libsf_engine.so ← dynamicengineパスを指定

FATAL ERROR: /etc/snort/snort.conf(445) Unknown preprocessor: "sip".
FATAL ERROR: /etc/snort/snort.conf(453) Unknown preprocessor: "imap".
FATAL ERROR: /etc/snort/snort.conf(461) Unknown preprocessor: "pop".
で起動しないことへの対処

以下へ#を追加してコメントアウト
# SIP Session Initiation Protocol preprocessor.  For more information see README.sip
#preprocessor sip: max_sessions 10000, \
#   ports { 5060 5061 5600 }, \
#   methods { invite \
#             cancel \
#             ack \
#             bye \
#             register \
#             options \
#             refer \
#             subscribe \
#             update \
#             join \
#             info \
#             message \
#             notify \
#             benotify \
#             do \
#             qauth \
#             sprack \
#             publish \
#             service \
#             unsubscribe \
#             prack }, \
#   max_uri_len 512, \
#   max_call_id_len 80, \
#   max_requestName_len 20, \
#   max_from_len 256, \
#   max_to_len 256, \
#   max_via_len 1024, \
#   max_contact_len 512, \
#   max_content_len 1024

# IMAP preprocessor.  For more information see README.imap
#preprocessor imap: \
#   ports { 143 } \
#   b64_decode_depth 0 \
#   qp_decode_depth 0 \
#   bitenc_decode_depth 0 \
#   uu_decode_depth 0

# POP preprocessor. For more information see README.pop
#preprocessor pop: \
#   ports { 110 } \
#   b64_decode_depth 0 \
#   qp_decode_depth 0 \
#   bitenc_decode_depth 0 \
#   uu_decode_depth 0

# database
# output database: alert, <db_type>, user=<username> password=<password> test dbname=<name> host=<hostname>
# output database: log, <db_type>, user=<username> password=<password> test dbname=<name> host=<hostname>
output database: log, mysql, user=snort password=パスワード dbname=snort_log host=localhost ← 追加 MySQLへのログ出力設定
ユーザ・パスワード・データベースは後でMySQLの設定で必要になる為覚えておきます。

[root@sv ~]# vi /etc/sysconfig/snort ← Snort設定ファイル編集

# How should Snort alert? Valid alert modes include fast, full, none, and
# unsock.  Fast writes alerts to the default "alert" file in a single-line,
# syslog style alert message.  Full writes the alert to the "alert" file
# with the full decoded header as well as the alert message.  None turns off
# alerting. Unsock is an experimental mode that sends the alert information
# out over a UNIX socket to another process that attaches to that socket.
# -A {alert-mode}
# output alert_{type}: {options}
#ALERTMODE=fast ← コメントアウトしMySQLへログ出力できるようにする
2.Snortルールファイル入手

クライアント側で操作

Snortに必須のルールファイルを入手する為、ユーザ登録(無料)をします。

ユーザ登録時入力したメールアドレスに、ユーザ名とパスワードが記載されているのでログインする。

Download Snort RulesのRegistered User Releaseより本体にあったバージョンをダウンロードします。

※最新版はこちらで確認。(2011/09/30時点。snortrules-snapshot-2910.tar.gz)

一度ダウンロードするとしばらくダウンロード出来なくなるので注意

ダウンロードしたファイルをUSBメモリやWinSCPでサーバに移しておく。(今回はrootのカレントディレクトリを指定)

サーバ側で操作

[root@sv ~]# tar zxvf snortrules-snapshot-2910.tar.gz ← ルールファイル展開

[root@sv ~]# mkdir /usr/local/lib/snort_dynamicrules/ ← snort_dynamicrulesディレクトリ作成

[root@sv ~]# /bin/cp -r so_rules/precompiled/RHEL-6-0/x86-64/2.9.1.0/* /usr/local/lib/snort_dynamicrules/ ← ルールファイルを所定のディレクトリへコピー

[root@sv ~]# /bin/cp -r rules/* /etc/snort/rules/ ← ルールファイルを所定のディレクトリへコピー

[root@sv ~]# /bin/cp -r so_rules/ /etc/snort/ ← ルールディレクトリを所定の場所にコピー

[root@sv ~]# /bin/cp -r preproc_rules/ /etc/snort/ ← ルールディレクトリを所定の場所にコピー

[root@sv ~]# rm -rf etc/ preproc_rules/ rules/ so_rules/ ← 展開してできたディレクトリを削除

[root@sv ~]# mv snortrules-snapshot-2910.tar.gz app/ ← 移したファイルは念のため保存
3.Srortログローテーションエラー対処

cronからroot宛に以下のエラーメールが送られてくることへの対処。

error: error accessing /var/log/snort/*: No such file or directory

error: snort:4 glob failed for /var/log/snort/*/*log

[root@sv ~]# vi /etc/logrotate.d/snort ← snort用ログロテート設定ファイル編集

/var/log/snort/alert /var/log/snort/*log /var/log/snort/*/alert /var/log/snort/*/*log  { ← 不要な部分を削除
↓
/var/log/snort/alert /var/log/snort/*log  {

MySQL設定

[root@sv ~]# mysql -u root -p ← MySQLへrootでログイン
Enter password:  ← MySQLのrootパスワード入力(非表示)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.52 Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

/etc/snort/snort.confで設定したユーザ・パスワード・データベースを使用します。
mysql> create database snort_log; ← データベース作成
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on snort_log.* to snort@localhost identified by 'パスワード'; ← snortユーザ作成
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges; ← snortユーザの権限を反映
Query OK, 0 rows affected (0.00 sec)

mysql> exit ← ログアウト
Bye

[root@sv ~]# mysql -u snort -p snort_log < /usr/share/snort-2.9.1/schemas/create_mysql ← snort_log初期データベース作成
Enter password:  ← snortユーザのパスワード入力(非表示)

Snort起動

[root@sv ~]# /etc/rc.d/init.d/snortd start ← snort起動
Starting snort: Spawning daemon child...
My daemon child 26105 lives...
Daemon parent exiting
                                                           [  OK  ]

[root@sv ~]# chkconfig snortd on ← snort自動起動設定

[root@sv ~]# chkconfig --list snortd ← snort自動起動設定確認
snortd          0:off   1:off   2:on    3:on    4:on    5:on    6:off

Baseインストール

RPMforge+EPELリポジトリが導入されいない場合こちらを参照してインストールします。

[root@sv ~]# yum install php-adodb php-pear-Image-Graph ← BASEに必要なパッケージをインストール

[root@sv ~]# wget http://jaist.dl.sourceforge.net/sourceforge/secureideas/base-1.4.5.tar.gz ← BASEダウンロード
※最新版はこちらで確認。(2011/09/30時点。base-1.4.5.tar.gz)

[root@sv ~]# tar zxvf base-1.4.5.tar.gz ← BASE展開

[root@sv ~]# mv base-1.4.5 /var/www/base ← BASE展開先ディレクトリを移動

[root@sv ~]# chown -R apache:apache /var/www/base/ ← BASE展開先ディレクトリ所有者をapacheに変更

[root@sv ~]# mv base-1.4.5.tar.gz app/ ← ダウンロードしたファイルは念のため保存

Base設定

1.BASE設定
[root@sv ~]# cp /var/www/base/base_conf.php.dist /var/www/base/base_conf.php ← BASE設定ファイルをサンプルよりコピー

[root@sv ~]# vi /var/www/base/base_conf.php ← BASE設定ファイル編集

$BASE_Language = 'japanese'; ← 日本語化

$BASE_urlpath = '/base'; ← BASE展開先ディレクトリ名

$DBlib_path = '/usr/share/php/adodb'; ← ADOdbインストール先指定

$alert_dbname   = 'snort_log';
$alert_host     = 'localhost';
$alert_port     = '';
$alert_user     = 'snort';
$alert_password = 'パスワード'; ← MySQL_Snortパスワード
2.Apache設定
[root@sv ~]# vi /etc/httpd/conf.d/base.conf ← Apache用BASE設定ファイル作成
ここから----------
Alias /base /var/www/base
<Directory "/var/www/base">
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
    Allow from 192.168.0.0/24 ← 内部ネットワークアドレス(例:192.168.0.0/24)を指定
</Directory>
----------ここまで

[root@sv ~]# /etc/rc.d/init.d/httpd reload ← Apache設定反映
httpd を再読み込み中:                                      [  OK  ]

BASE確認

http://サーバ名/base/へアクセス

「セットアップページ」を選択

「Create BASE AG」を選択

「Main Page」を選択

セットアップ完了