SNORTを使い倒す


1.はじめに

「SNORTを使おう」で始まったこのメモも、まだ4ヶ月しか経っていないのですが、すでに情報が旧くなってる部分が目立ったり、「もうちょっと詳しい説明無いの?」という意見があったりなんかして、いい加減に更新しなきゃならない時期なんだなぁとかって実感しつつも、うだうだ過ごす毎日です。なんか燃え尽きたかもしれません。

本題はそうじゃなくって、前回のメモはsnortの導入について書きましたので、今回はsnort-1.7とwww.snort.orgで公開される最新版のルールセットを使った運用に関するコトあたりを中心に、もうちょっと掘り下げていってみようとかって考えてます。

例によって徐々に書いてゆく方法を採ってますので、その点は了解してください。

あと、つまんないコトですけど、なんか間違いとかあったら言って下さいね。何も反応無いのも、それはそれで辛いもんです。春だしね。関係ないか。




2.snortの導入

これは今更言うまでもありません。「SNORTを使おう」を読んで下さい。1.6.3だろーが、1.7だろーがあんまり変わりません。ルールセット〜のあたりが違うかな。インストールまで終わったら、こっちに戻ってきてください。




3.ルールセットの入手

snortの最新ルールセットは http://www.snort.org/snort-files.htm から入手できます。このページの中程に以下のように地味にアーカイブが置いてありますので、UPDATEの日付を確認して最新版を入手しましょう。

Snort.org Rulesets: snortrules.tar.gz
UPDATED RULESET RELEASED 03/28/2001

無事にダウンロードできたら、適当な作業用ディレクトリの中で解凍すると以下のようなファイルが現れます。
メインはsnort.confで、それ以外のルールファイルをインクルードするように記述されています。
また、それぞれのルールファイルは大まかにジャンル分けされており、ファイル名からおおよそ機能が想像できるような名前付けがされてます。

snort.confルールセットのメインファイル
local.rulesユーザが独自に追加したルール等を記述するためのファイル
exploit.rulesバッファーオーバーフローなどの攻撃を検知する
scan.rules一部のステルスポートスキャンやスキャナツールを検知する
finger.rulesfingerサービスに対するプロービングや攻撃を検知する
ftp.rulesftpサービスに対するプロービングや攻撃などを検知する
telnet.rulestelnetサービスに対するアクセスや攻撃などを検知する
smtp.rulessmtpサービスに対する攻撃などを検知する
rpc.rulesrpcサービスに対するプロービングや攻撃などを検知する
rservices.rulesr系のサービスに対するアクセスや攻撃などを検知する
backdoor.rulesさまざまなバックドアツールを検出する
dos.rulesDoSを検出するためのルール
ddos.rules分散DoSのクライアント・サーバ間のコントロール通信を検知する
dns.rulesdnsサービスに対するプロービングや攻撃などを検知する
netbios.rulesnetbios関係のアクセスや攻撃などを検知する
web-cgi.ruleshttpサーバ上で動作するcgiに対する攻撃等を検知する
web-coldfusion.rulesWebアプリケーションサーバColdFusionへの攻撃等を検知する
web-frontpage.rulesMS-Frontpageを悪用した行為を検知する
web-iis.rulesMS-IISサーバに対する攻撃などを検知する
web-misc.rulesその他のhttpに対する攻撃などを検知する
icmp.rulesicmpに対するプロービング等を検知する
misc.rulestracerouteやrootkitなどに関する通信を検知する

03/28/2001のtarボールには何故かsnort.confが入っていませんので、別途 http://www.snort.org/snort-files.htm#Rules からsnort.confだけ入手する必用があります。(今は直ってるのかな?)




4.動かしてみる

無事にルールセットの解凍が済みましたら、snort.conf内の以下の部分を、自分のネットワーク環境にあわせて修正します。

var HOME_NET 10.1.1.0/24

説明するまでも無いと思うのですが、10.1.1.0/24ってのはネットワーク番号とネットマスクのビット数ですよぉ。クラスCなら255.255.255.0のマスクですから、8ビットが3つで24です。たとえばおウチネットでIP8個貰えた幸運な貴方の場合は、255.255.255.248で29になります。

ま、プロミスカスモードにしないで、ホストベースで検知するのでしたら、自分の IPアドレス/32 と記述しちゃって良いです。

これだけでとりあえずはルールセットが動くようになります。-cオプションでsnort.confを指定してsnortを起動してみましょう。

snort.confで他のルールをインクルードしている場合は、全てのルールがカレントディレクトリにあって、なおかつカレントディレクトリからsnortを起動しないと、ちゃんとルールを呼び出さずにsnortが異常終了してしまいます。

うまく起動しない場合は、-Dオプションを外して起動するとエラーメッセージが表示されますので、何が原因で起動しないのか知ることができます。



5.いろいろいじくってみる

新しいルールセットがちゃんと動作することが確認できましたら、ちょっとカスタマイズしてみましょう。


5−1.snortのプリプロセッサ

snort自身が持っていない機能を外部モジュールとして実現するために、snortは以下のような機能をプリプロセッサという方法により実現しています。

snort-1.7には以下のようなプリプロセッサが準備されています。

Minfrag 小さなフラグメントパケットの検出が可能になります。
HTTP Decode httpプロトコルで使用されるURIを正しく識別することが可能になります。
Portscan ポートスキャンを検出することが可能になります。
Defrag プラグメント化されたパケットの評価が可能になります。
Stream ストリームパケットの評価が可能になります。(ベータ版)
Spade 統計的手法による異常検出を行います。(実験用)


snort.orgからダウンロードしたsnort.conf内では、これらのプリプロセッサは総て無効になってますので、必要に応じて適当なパラメータを渡して使用してみてください。またsnort.conf内にはそれぞれのプリプロセッサについての簡単な説明と記述方法がサンプルと共に記述されています。

ここではportscanプリプロセッサについて解説しましょう。

Portscan Detector
その名のとおり、ポートスキャンを検知するためのプリプロセッサです。以下の書式で記述します。

portscan: <ネットワーク> <検知量> <検知時間> <ログの位置>

<ネットワーク>には検知したいホスト/ネットワークのIPアドレスを記述します。

<検知量> <検知時間>にはポートスキャンと判断するための基準となるしきい値を指定します。すなわち、ひとつのIPアドレスから<検知時間(秒)>内に<検知量>以上のコネクションが発生した場合には、それはポートスキャンであるとプリプロセッサが判断し、そのアラート情報を<ログの位置>で指定されたアラートファイルに記録します。

例.preprocessor portscan: 192.168.1.0/24 5 7 ./portscan.log

このプリプロセッサはしきい値によりポートスキャンか否かを判断しているのですが、ボクが知ってる限りでは、しきい値によるポートスキャンの検出は誤検知の確率が高い印象を持っています。もちろんポートスキャンをちゃんと検出してくれるのですが、それ以上に誤検知が多いみたいです。ステルス系のスキャンは比較的正しく検知する印象を持ってますので、ボクはしきい値に非現実的な値を与えてステルス系スキャン検知専用とかって使い方をしています。

ちなみにホストベースであれば、iplogの方がportscan detectorとしては優れているようなカンジですね。

また以下のプリプロセッサを与えることにより、特定のIPアドレスからのポートスキャン検知を無効にすることもできます。

preprocessor portscan-ignorehosts: <アドレスリスト>

アドレスリストには対象のホスト/ネットワークアドレスを記述します。複数記述したい場合は、それぞれをスペースで区切ってください。

例.preprocessor portscan-ignorehosts: 192.168.0.2/32 172.16.0.0/16


5−2.Output Modules

Output Modulesを使用することにより、snortのアラートなどを別の形式により記録することが可能となります。Output Modulesには以下のような機能があります。

Alert_syslogアラートをsyslog経由で出力することが可能となります。
Alert_fastアラートを1行の簡単なフォーマットにより、指定されたファイルに記録します。
Alert_fullアラートをパケットヘッダまで含めた形式で、指定されたファイルに記録します。
Alert_smbアラートメッセージをNetBIOSクライアントにWinpopup出力することが可能となります。
Alert_unixsockUNIX SOCKETに対してアラームを出力します。
Log_tcpdump指定されたファイルにTCPDUMPフォーマットにより記録します。
XMLSNML形式により、アラート、ログを記録します。
DatabaseSQLデータベースにアラート、ログを記録します。

ここでは、これらの中で alert_syslog について解説しましょう。

alert_syslogを使用すると、自由なFacilities/Prioritiesを指定して、syslog経由で記録することが可能になります。

preprocessor alert_syslog: <facility> <priority> <options>

syslogと同様に<facility>/<priority>/<options>のパラメータを記述することができます。有効なキーワードは以下のようになります。

Options
LOG_CONS, LOG_NDELAY, LOG_PERROR, LOG_PID

Facilities
LOG_AUTH, LOG_AUTHPRIV, LOG_DAEMON, LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2
LOG_LOCAL3, LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6, LOG_LOCAL7, LOG_USER

Priorities
LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING
LOG_NOTICE, LOG_INFO, LOG_DEBUG

各パラメータについてはsyslogのドキュメントを参照してください。


5−3.便利な機能

その他の知ってると少し幸せになれる機能として、ルールセットに準備されているpassアクションがあります。

特定のネットワークやホストからの通信や、特定のサービスを無視したい場合などに使用します。例えば192.168.0.1のHTTPへアクセスするパケットを総て無視したい場合は以下のように記述します。

pass tcp 172.16.0.0/16 any > 192.168.0.1 80

DNS関係のUDPトラフィックを全て無視する場合は以下のよう記述します。

pass udp any any <> 192.168.0.1 53
pass udp any 53 <> 192.168.0.1 any

ルールセットに以上のようにpassアクションを記述しましたら、-oオプションを付けてsnortを起動することにより、passアクションが有効に働くようになります。

snortの-oオプションは、snortルール内のアクションを評価する優先順位をAlert->Pass->LogからPass->Alert->Logの順に変更するためのスイッチです。

snortに対しては、アクションの種類によるルールの適応順のみが有効で、実際のルールファイル内での記述順は気にしていません。よって、自分でルールを記述する場合には注意が必要です。