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

最終更新日: 2020.12.29

■概要

クラッカーによるLinuxサーバーへの不正アクセスを検知するシステム(IDS=Intrusion Detection System)を導入する。
ここでは、不正アクセス検知システムにネットワーク型IDSのSnortを導入する。
また、Snortが抽出した不正アクセスログをWebブラウザ上で確認できるようにするためにSnortSnarfも導入する。
なお、Snortが不正アクセスの判断をするために参照するルールファイルの最新化は、Oinkmasterを導入して自動化する。



■Snortインストール

[root@centos ~]# yum -y install libpcap-devel ← snortのRPM作成に必要なパッケージインストール

[root@centos ~]# wget http://www.snort.org/dl/current/snort-2.6.1.4.tar.gz ← snortダウンロード

※最新版のURLはダウンロードページで確認すること

[root@centos ~]# rpmbuild -tb --clean snort-2.6.1.4.tar.gz ← snortのRPMパッケージ作成
※時間がかかる
rpmbuildが「ビルド依存性の失敗」で異常終了した場合

[root@centos ~]# rpm -Uvh /usr/src/redhat/RPMS/i386/snort-2.6.1.4-1.i386.rpm ← 作成したRPMパッケージをインストール
準備中...                ########################################### [100%]
   1:snort                  ########################################### [100%]

[root@centos ~]# rm -f /usr/src/redhat/RPMS/i386/snort-* ← 作成したRPMパッケージを削除

[root@centos ~]# rm -f snort-2.6.1.4.tar.gz ← ダウンロードしたファイルを削除

[root@centos ~]# vi /etc/yum.conf ← yum設定ファイル編集
exclude=snort ← yumのアップデート対象からsnortを除外する

■Snort設定

(1)Snort設定
[root@centos ~]# vi /etc/snort/snort.conf ← snort設定ファイル編集
var HOME_NET any
↓
var HOME_NET 192.168.1.0/24 ← 内部ネットワークアドレスを指定

var EXTERNAL_NET any
↓
var EXTERNAL_NET !$HOME_NET ← 内部からのアクセスを不正アクセスとして扱わない

(2)Snortルールファイル入手
Snort動作に必須のルールファイル(Sourcefire VRT Certified Rules)を入手するため、ユーザー登録する

ユーザー登録時のメールアドレス宛にユーザー名とパスワードが記載されたメールがくるのでログインする

Snortルールファイル(Sourcefire VRT Certified Rules)をダウンロードする
※一度ダウンロードすると以後約10分間はダウンロードできないので注意

ダウンロードしたSnortルールファイル(Sourcefire VRT Certified Rules)をWinSCP等でサーバーの/rootディレクトリへアップロードしておく

[root@centos ~]# tar zxvf snortrules-snapshot-CURRENT.tar.gz
 ← snortルールファイル(Sourcefire VRT Certified Rules)展開

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

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

[root@centos ~]# rm -f snortrules-snapshot-CURRENT.tar.gz ← ダウンロードしたファイルを削除

[root@centos ~]# wget http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules-CURRENT.tar.gz
 ← snortルールファイル(Community Rules)ダウンロード

[root@centos ~]# tar zxvf Community-Rules-CURRENT.tar.gz ← 展開

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

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

[root@centos ~]# rm -f Community-Rules-CURRENT.tar.gz ← ダウンロードしたファイルを削除

(3)Snortログローテーションエラー対処
cronから以下のようなエラーメールがroot宛に送られてくることの対処
error: error accessing /var/log/snort/*: No such file or directory
error: snort:4 glob failed for /var/log/snort/*/*log
[root@centos ~]# 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 {

■Snort起動

[root@centos ~]# /etc/rc.d/init.d/snortd start ← snort起動
Starting snort:                                            [  OK  ]

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

[root@centos ~]# chkconfig --list snortd ← snort自動起動設定確認
snortd          0:off   1:off   2:on    3:on    4:on    5:on    6:off ← ランレベル2〜5のonを確認

■Snort確認

内部からのpingを検知するようにSnortを仮設定し、Snortが内部からのpingを検知できるか確認する。
※自ホストから自ホストへのアクセスは検知しないので、必ず他のマシンからアクセスを行うこと
[root@centos ~]# vi /etc/snort/snort.conf ← Snort設定ファイル編集
以下を最終行へ追加
alert icmp $HOME_NET any -> $HOME_NET any (msg:"ICMP traffic";sid:777;)

[root@centos ~]# /etc/rc.d/init.d/snortd restart ← Snort再起動
Stopping snort:                                            [  OK  ]
Starting snort:                                            [  OK  ]

C:\Documents and Settings\xxxxxxxx>ping サーバーIPアドレス ← 内部Windowsマシンからサーバーへpingを発行

[root@centos ~]# tail /var/log/snort/alert ← Snortのログを表示
以下のように内部からのpingアクセスのログが記録されていることを確認
03/01-09:35:28.184572  [**] [1:777:0] ICMP traffic [**] [Priority: 0] {ICMP} 192.168.1.10 -> 192.168.1.2
03/01-09:35:28.184711  [**] [1:777:0] ICMP traffic [**] [Priority: 0] {ICMP} 192.168.1.2 -> 192.168.1.10
03/01-09:35:29.185049  [**] [1:777:0] ICMP traffic [**] [Priority: 0] {ICMP} 192.168.1.10 -> 192.168.1.2
03/01-09:35:29.185168  [**] [1:777:0] ICMP traffic [**] [Priority: 0] {ICMP} 192.168.1.2 -> 192.168.1.10
03/01-09:35:30.185067  [**] [1:777:0] ICMP traffic [**] [Priority: 0] {ICMP} 192.168.1.10 -> 192.168.1.2
03/01-09:35:30.185184  [**] [1:777:0] ICMP traffic [**] [Priority: 0] {ICMP} 192.168.1.2 -> 192.168.1.10
03/01-09:35:31.186234  [**] [1:777:0] ICMP traffic [**] [Priority: 0] {ICMP} 192.168.1.10 -> 192.168.1.2
03/01-09:35:31.186353  [**] [1:777:0] ICMP traffic [**] [Priority: 0] {ICMP} 192.168.1.2 -> 192.168.1.10

[root@centos ~]# vi /etc/snort/snort.conf ← Snort設定ファイル編集
alert icmp $HOME_NET any -> $HOME_NET any (msg:"ICMP traffic";sid:777;) ← 削除

[root@centos ~]# /etc/rc.d/init.d/snortd restart ← Snort再起動
Stopping snort:                                            [  OK  ]
Starting snort:                                            [  OK  ]

■SnortSnarfインストール

(1)PerlのTime-modulesインストール
[root@centos ~]# cpan2rpm --install Time-modules ← SnortSnarfに必要なPerlのTime-modulesをインストール
※cpan2rpmコマンドについてはPerlモジュールパッケージ管理システム導入(cpan2rpm)を参照
Installing package
Preparing...                ########################################### [100%]
   1:perl-Time-modules      ########################################### [100%]
-- Done --

[root@centos ~]# rm -f /usr/src/redhat/RPMS/noarch/perl-Time-modules* ← 作成されたRPMを削除

[root@centos ~]# rm -f /usr/src/redhat/SRPMS/perl-Time-modules* ← 作成されたSRPMを削除

[root@centos ~]# rpmbuild --rmsource --rmspec /usr/src/redhat/SPECS/Time-modules.spec ← RPM作成後始末

[root@centos ~]# vi /etc/yum.conf ← yum設定ファイル編集
exclude=snort perl-Time-modules ← yumのアップデート対象からperl-Time-modulesを除外する

(2)SnortSnarfインストール
[root@centos ~]# wget http://www.snort.org/dl/contrib/data_analysis/snortsnarf/SnortSnarf-050314.1.tar.gz
 ← SnortSnarfダウンロード

※最新版のURLはダウンロードページで確認すること

[root@centos ~]# tar zxvf SnortSnarf-050314.1.tar.gz ← 展開

[root@centos ~]# mkdir /usr/local/snortsnarf ← SnortSnarfインストール先ディレクトリ作成

[root@centos ~]# cp SnortSnarf-050314.1/snortsnarf.pl /usr/local/snortsnarf/
 ← snortsnarf.plをSnortSnarfインストール先へコピー

[root@centos ~]# cp -r SnortSnarf-050314.1/include/ /usr/local/snortsnarf/
 ← includeディレクトリをSnortSnarfインストール先へコピー

[root@centos ~]# rm -rf SnortSnarf-050314.1 ← 展開してできたディレクトリを削除

[root@centos ~]# rm -f SnortSnarf-050314.1.tar.gz ← ダウンロードしたファイルを削除

■SnortSnarf設定

(1)SnortSnarf設定
SnortSnarf実行時に以下のエラーメッセージが出力されることの対処
Using an array as a reference is deprecated at include/SnortSnarf/HTMLMemStorage.pm line 290.
Using an array as a reference is deprecated at include/SnortSnarf/HTMLAnomMemStorage.pm line 266.
[root@centos ~]# vi /usr/local/snortsnarf/include/SnortSnarf/HTMLMemStorage.pm ← SnortSnarfのpmファイル編集
        return @arr->[($first-1)..$end];
	↓
        return @arr[($first-1)..$end]; ← "->"削除

[root@centos ~]# vi /usr/local/snortsnarf/include/SnortSnarf/HTMLAnomMemStorage.pm ← SnortSnarfのpmファイル編集
        return @arr->[($first-1)..$end];
	↓
        return @arr[($first-1)..$end]; ← "->"削除

(2)Webサーバー設定
[root@centos ~]# mkdir /var/www/snort ← SnortSnarfによるHTML出力先ディレクトリ作成

[root@centos ~]# vi /etc/httpd/conf.d/snort.conf ← SnortSnarf用Webサーバー設定ファイル新規作成
Alias /snort /var/www/snort

以下は内部からのみアクセスできるようにする場合のみ
<Location /snort>
    Require local
    Require ip 192.168.1.0/24 ← 内部ネットワークアドレスを指定
</Location>

[root@centos ~]# systemctl reload httpd ← Webサーバー設定反映

(3)SnortSnarf実行スクリプト作成
[root@centos ~]# vi snortsnarf.sh ← SnortSnarf実行スクリプト作成
#!/bin/bash

cd /usr/local/snortsnarf
if [ -s /var/log/snort/alert ]; then
    if [ -s /var/log/snort/portscan.log ]; then
        ./snortsnarf.pl -dns -d /var/www/snort /var/log/snort/alert /var/log/snort/portscan.log
    else
        ./snortsnarf.pl -dns -d /var/www/snort /var/log/snort/alert
    fi
fi

[root@centos ~]# chmod 700 snortsnarf.sh ← SnortSnarf実行スクリプトへ実行権限付加

■SnortSnarf確認

[root@centos ~]# ./snortsnarf.sh ← SnortSnarf実行

http://サーバー名/snort/にアクセスし、「SnortSnarf start page」が表示されることを確認

■SnortSnarf日本語化

(1)SnortSnarf日本語化ファイル取得
[root@centos ~]# cd /usr/local/snortsnarf/include/SnortSnarf/ ← ディレクトリ移動

[root@centos SnortSnarf]# mv HTMLOutput.pm HTMLOutput.pm.org ← デフォルトのHTMLOutput.pmをリネーム

[root@centos SnortSnarf]# wget http://mt-fuji.ddo.jp/~fujito/Linux/secu_soft/s2/HTMLOutput.pm
 ← 日本語化HTMLOutput.pmダウンロード

※最新版のURLはダウンロードページで確認すること

(2)SnortSnarf文字化け対策
[root@centos SnortSnarf]# vi HTMLOutput.pm ← HTMLOutput.pm編集
sub print_page_head {
    my($self,$page_title,$page_type,$page_h2) = @_;

    print "<html>\n<head>\n";
    print "<title>$page_title</title>\n";
    print "<meta http-equiv=\"Content-type\" content=\"text/html; charset=Shift_JIS\">\n"; ← 追加(文字化け対処)

(3)SnortSnarf実行時エラー対策
SnortSnarf実行時に以下のようなエラーエラーメッセージが出力されることの対策
 Argument "*undef*" isn't numeric in multiplication (*) at include/SnortSnarf/HTMLOutput.pm line 836.
 Use of uninitialized value in multiplication (*) at include/SnortSnarf/HTMLOutput.pm line 836.
 Use of uninitialized value in multiplication (*) at include/SnortSnarf/HTMLOutput.pm line 836.
 Use of uninitialized value in addition (+) at include/SnortSnarf/HTMLOutput.pm line 836.
[root@centos SnortSnarf]# vi HTMLOutput.pm ← HTMLOutput.pm編集
sub ip_to_num {
    以下を追加
    if ($_[0] ne '*undef*') {
        my @byte= split(/\./,$_[0]);
        return $byte[0]*256*256*256 + $byte[1]*256*256 + $byte[2]*256 + $byte[3];
    }
    #my @byte= split(/\./,$_[0]); ← 行頭に#を追加(コメントアウト)
    #return $byte[0]*256*256*256 + $byte[1]*256*256 + $byte[2]*256 + $byte[3]; ← 行頭に#を追加(コメントアウト)
}

[root@centos SnortSnarf]# cd ← ホームディレクトリへ戻る

(4)SnortSnarf日本語化確認
[root@centos ~]# ./snortsnarf.sh ← SnortSnarf実行

http://サーバー名/snort/にアクセスし、「SnortSnarf ページの開始」が表示されることを確認

■SnortSnarf定期自動実行設定

[root@centos ~]# mv snortsnarf.sh /etc/cron.hourly/ ← SnortSnarf実行スクリプトを1時間ごとに実行するディレクトリへ移動

■ルールファイルの自動更新

(1)Oinkmasterインストール
[root@centos ~]# wget http://jaist.dl.sourceforge.net/sourceforge/oinkmaster/oinkmaster-2.0.tar.gz ← Oinkmasterダウンロード

※最新版のURLはダウンロードページで確認

[root@centos ~]# tar zxvf oinkmaster-2.0.tar.gz ← Oinkmaster展開

[root@centos ~]# cp oinkmaster-2.0/oinkmaster.pl /usr/local/bin/ ← oinkmaster.plを所定のディレクトリへコピー

[root@centos ~]# cp oinkmaster-2.0/oinkmaster.conf /etc/ ← oinkmaster.confを所定のディレクトリへコピー

[root@centos ~]# cp oinkmaster-2.0/oinkmaster.1 /usr/share/man/man1/ ← oinkmaster.1を所定のディレクトリへコピー

[root@centos ~]# rm -rf oinkmaster-2.0/ ← Oinkmaster展開先ディレクトリを削除

[root@centos ~]# rm -f oinkmaster-2.0.tar.gz ← ダウンロードしたOinkmasterを削除

(2)Oinkmaster設定
Snortルールファイル(Sourcefire VRT Certified Rules)をダウンロードするには「Oink Code」が必要なので、ログインして、ページ下部の「Oink Code」欄の「Get Code」ボタンを押下して「Oink Code」を取得する
[root@centos ~]# vi /etc/oinkmaster.conf ← Oinkmaster設定ファイル編集
# Example for Snort-current ("current" means cvs snapshots).
# url = http://www.snort.org/pub-bin/oinkmaster.cgi/<oinkcode>/snortrules-snapshot-CURRENT.tar.gz
url = http://www.snort.org/pub-bin/oinkmaster.cgi/Oink Code貼り付け/snortrules-snapshot-CURRENT.tar.gz ← 追加

# Example for Community rules
# 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-CURRENT.tar.gz ← 追加

(3)Oinkmaster確認
[root@centos ~]# oinkmaster.pl -o /etc/snort/rules/ ← Oinkmaster実行
Loading /etc/oinkmaster.conf
Downloading file from http://www.snort.org/pub-bin/oinkmaster.cgi/*oinkcode*/snortrules-snapshot-CURRENT.tar.gz... done.
Archive successfully downloaded, unpacking... done.
Downloading file from http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules-CURRENT.tar.gz... done.
Archive successfully downloaded, unpacking... done.
Setting up rules structures... done.
Processing downloaded rules... disabled 0, enabled 0, modified 0, total=10230
Setting up rules structures... done.
Comparing new files to the old ones... done.
Updating local rules files... done.

[***] Results from Oinkmaster started 20070425 20:12:25 [***]
・
・
・

(4)Oinkmaster定期自動実行設定
[root@centos ~]# vi /etc/cron.daily/snort-rule-update ← Oinkmaster定期自動実行スクリプト作成
#!/bin/bash

/usr/local/bin/oinkmaster.pl -o /etc/snort/rules/ 2>&1 | logger -t oinkmaster
/etc/rc.d/init.d/snortd restart > /dev/null

[root@centos ~]# chmod +x /etc/cron.daily/snort-rule-update ← Oinkmaster定期自動実行スクリプトへ実行権限付加


■関連コンテンツ




▲このページのトップへ戻る

ご自由にリンクしてください(連絡は不要です)
本ページへのご意見・ご要望、誤字・脱字・リンク切れ等のご連絡はこちらからお願いします