Snortにリアルタイム警告を実装する(2/3)

前回は、Snortにリアルタイム警告を実装する際の注意点を見てきた。これらの点をクリアしたら、次はいよいよ実装だ。今回は、swatchを使って警告を処理する方法について解説したい。なお、次回は、分散型の3層スキーマでの警告の設定を扱う予定だ。

この記事は、Jack Koziolの新著『 Intrusion Detection with Snort 』からの一部抜粋である。

サーバ/センサのハイブリッドでリアルタイム警告を実装するのは比較的簡単である。電子メール経由のリアルタイム警告を利用するには、 sendmail などの電子メール・アプリケーションが必要だが、他にも必要に応じて、ポケットベル用のアプリケーションやSMS(Short Message Service)ゲートウェイをインストールする必要がある。sendmailのインストールと構成に関しては、数多くのオンライン・リソースや書籍がある。ソース・ディストリビューションに付属のマニュアルもかなり充実した内容なので、配置に役立つはずだ。

sendmailを配置したら、次にそのセキュリティについて考える必要がある。sendmailのセキュリティはこれまでにたびたび問題となっているので、適切な対策を講じる必要がある。この対策が済んだら、alert_syslog出力プラグインを通じて警告をsyslogに送るよう、Snortを構成する。snort.confまたはbarnyard.confファイルを開いて、alert_syslog出力プラグインの設定行のコメントを取り除いて有効にする。Barnyardがインストールされている場合には、同様の変更をSnortではなくBarnyardで行う。設定行は次のようになるはずだ。

output alert_syslog: LOG_AUTH LOG_ALERT

では、手動またはNMAPで、疑わしいトラフィックを生成してみよう。/var/log/snort/alertファイルを開いて、Snortがsyslogをロギングしていることを確認する。次に示すように、適切な優先度が割り当てられた警告のリストが含まれているはずだ。

[**] [1:1704:1 ] WEB–CGI cal_make.pl directory traversal attempt [**]
[Classification: Web Application Attack ] [Priority:1 ]
09/16-10:04:15.816116 192.168.1.1:3140 ->192.168.1.2:80
TCP TTL:128 TOS:0x0 ID:12817 IpLen:20 DgmLen:131 DF
***AP***Seq:0xDEFC8E6D Ack:0x1A519F30 Win:0x4470 TcpLen:20
[Xref =>http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2001-0463 ]
[Xref =>http://www.securityfocus.com/bid/2663 ]

[**] [1:1122:2 ] WEB–MISC /etc/passwd [**]
[Classification: Attempted Information Leak ] [Priority:2 ]
09/16-10:04:15.826116 192.168.1.1:3143 ->192.168.1.2:80
TCP TTL:128 TOS:0x0 ID:12832 IpLen:20 DgmLen:149 DF
***AP***Seq:0xDEFF5454 Ack:0x1A51AF74 Win:0x4470 TcpLen:20

[**] [1:1730:1 ] WEB–CGI ustorekeeper.pl directory traversal [**]
[Classification: Web Application Attack ] [Priority:1 ]
09/16-10:04:15.836116 192.168 1.1:3144 ->192.168.1.2:80
TCP TTL:128 TOS:0x0 ID:12837 IpLen:20 DgmLen:141 DF
***AP***Seq:0xDEFFEE00 Ack:0x1AB7B107 Win:0x4470 TcpLen:20

[**] [1:1721:1 ] WEB–CGI adcycle access [**]
[Classification:sid ] [Priority:2 ]
09/16-10:04:15.846116 192.168.1.1:3148 ->192.168 1.2:80
TCP TTL:128 TOS:0x0 ID:12857 IpLen:20 DgmLen:76 DF
***AP***Seq:0xDF035110 Ack:0x1A9AEFA4 Win:0x4470 TcpLen:20

swatchのインストール

警告をロギングするにあたって、syslogを監視するために swatch をインストールする必要がある。swatchが機能するには、次の4つのPerlモジュールが必要だ。

Date::Calc
Date::Parse
File::Tail
nTime::HiRes

これらのモジュールは、ほとんどのLinuxディストリビューションに含まれているが、ない場合には、http://search.cpan.orgから入手できる。次のコマンドを実行して、モジュールをコンパイルし、インストールする。

perl Makefile.PL
make
make test
make install
make realclean

モジュールのインストールが完了したら、swatchをダウンロードし、モジュールのインストールに使ったものと同じコマンドでインストールする。

swatchの構成

swatchは、SnortやBarnyardと同様、コマンドラインの引数と構成ファイルで制御される。swatchの構成ファイルは.swatchrcだ。.swatchrcファイルでは、swatchがログ内で監視する文字列と、実行するアクションを指定する。

リアルタイム警告の構成に使用できるいくつかのコマンドを次に紹介する。

watchforこれは、ログ内で監視する文字列をswatchに指定するためのコマンドだ。どのような文字列でも指定できるが、ここでは、優先順位を表す特定の数字だけを監視するよう指定する。次の例は、優先順位が1の警告をモニタするよう指定したwatchforコマンドだ。

watchfor /Priority \:1/

パターン・マッチングで使用される正規表現については、 http://japhy.perlmonk.org/book/ などのサイトを参照してほしい。

echo echoコマンドは、条件に合致した行を表示する。これは、電子メールの本文やポケットベルの表示に、警告についての情報を追加するのに利用できる。

exec 外部のプログラムを実行するためのコマンド。ポケットベル用プログラムやその他のスクリプトを実行するには、execの後にプログラムの完全パスを指定する。実行されるコマンドに警告を追加したい場合は、execコマンドに$Nを追加するとN行分が、$0を追加すると警告全体が追加される。

mail このコマンドは、ローカル・システムまたは指定された電子メール・アドレスに電子メールを送信する。複数の電子メール・アドレスを/etc/aliasesディレクトリにある別名ファイルに格納しておき、その別名ファイルをmailコマンドに指定することもできる。

throttle このコマンドは、検出する警告の数を制限するのに使用される。throttleが設定されていると、指定された期間、文字列に合致する警告は検出されない。電子メール・サーバの負荷や、アカウントの負担を軽減するために利用できる。

この他にも、swatchには、高度な機能を実現する数多くのコマンドが用意されているが、電子メールまたはポケットベルで警告を送るためには、ここで紹介したコマンドで十分だ。これらを使って、さまざまな方法でリアルタイム警告を実装できる。

.swatchrcファイルを開き、次のコマンドを追加する(「@」記号はバックスラッシュでエスケープする必要がある)。

watchfor /Priority \:1/
echo=normal
mail=user \@domain.com, subject=Snort Security Alert!

この構成では、優先度が1のすべての警告を監視し、user@domain.comにその警告を送るようになっている。ポケットベル用のプログラムを呼び出すには、mailコマンドをexecコマンドで置き換えればよい。 sendmailとの統合が可能なポケットベル・ゲートウェイに QuickPage がある。QuickPage経由でポケットベルに電子メールを送るには、次のコマンドを追加する。

watchfor /Priority \:1/
echo=normal
exec /usr/local/bin/qpage -f snort@domain.com -p IDS_admin ‘$0 ‘
throttle 00:00:10

このコマンドは、QuickPageプログラムを呼び出して、snort@domain.comという電子メール・アドレスからIDS_adminにメッセージを送る。qpageコマンドに警告全体を送るために、$0が指定されているほか、throttleコマンドによって、メッセージが送られた後10秒間は優先度1の警告を無視するようになっている。この他に、次のコマンドを使って、ローカルPCで警告音を鳴らすこともできる。

watchfor /Priority \:2/
bell 5

このコマンドは、優先度2の警告が発せられると、PCで警告音を5回鳴らす(ただし、こんなことをしたら隣席の同僚との関係が悪化するのは間違いないだろう)。

なお、通知方法は1つしか指定できないわけではない。必要ならば、これらの3つとも指定できる。希望どおりの方法で通知が行われるよう.swatchrcファイルを構成したら、swatchを実行しよう。swatchで使用できるコマンドライン・オプションのうち、特に便利なものを次に紹介する。

-c .swatchrcファイルの場所を指定する。

–input-record-separator 各警告のデリミタを指定する。デフォルトでは、改行記号(\n)がデリミタとして使われる。

-p コマンドから直接出力された情報を表示する。特定のイベントを示すコマンドの出力をモニタするのに使用する。

-t セキュリティ関連のイベントを監視する対象のファイルを指定する。

–daemon デーモン・モードを有効にする。

以上のオプションを使用した、swatchの起動コマンドの例を次に示す。

./swatch -c /usr/local/.swatchrc /var/log/snort/alert –daemon

このコマンドは、設定ファイル/usr/local/.swatchrcを使って、デーモン・モードでswatchを起動する。また、/var/log/ディレクトリのsyslogファイルをモニタする。このコマンドを実行すると、swatchは次のように、警告の最初の行だけを送信するはずだ。

[**] [1:1704:1 ] WEB–CGI cal_make.pl directory traversal attempt [**]

これはなぜかというと、表示するレコードのデリミタにデフォルトの「\n」が使用されているためだ。IPアドレス、時刻、TCPフラグなど、この他のメタ情報を参照したい場合には、警告の他の行を追加する必要がある。

警告全体を送信するには、tailコマンドとswatchのパイプ機能を利用すればよい。

./swatch -c /usr/local/.swatchrc –input-record-separator=”\n \n “
-p=”tail -f /var/log/snort/alert ” –daemon

-pスイッチは、tailコマンドを使って、警告ファイル内の新しいデータを監視する。レコードのデリミタには、改行文字2つ(\n \n)を使うよう指定している。これで、警告全体を受け取ることができるはずだ。

[**] [1:1704:1 ] WEB–CGI cal_make.pl directory traversal attempt [**]
[Classification:Web Application Attack ] [Priority:1 ]
09/16-10:04:15.816116 192.168.1.1:3140 ->192.168.1.2:80
TCP TTL:128 TOS:0x0 ID:12817 IpLen:20 DgmLen:131 DF
***AP***Seq:0xDEFC8E6D Ack:0x1A519F30 Win:0x4470 TcpLen:20
[Xref =>http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2001-0463 ]
[Xref =>http://www.securityfocus.com/bid/2663 ]

サーバ/センサのハイブリッド向けのswatchのインストールとリアルタイム警告についての解説はこれで終了だ。最終回である次回は、3層スキーマでSnort警告を実装する方法について見ていく。

Jack Koziolは、シカゴ西部に本拠地を置く国民健康保険関連企業の情報セキュリティ部門のマネージャである。1998年以来、ネットワークセキュリティの分野で活躍している。Eコマース、ヘルスケア、金融などの業界で、上級管理職として、実働環境で大規模なSnortベースの侵入検知システムを構築してきた。Information Security Magazine誌では「Hack and Defend」やCISSPのレビュー・セッション・コースの講師を務め、情報セキュリティに関するさまざまな記事を執筆している。

3へ
1へ