| 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で、それ以外のルールファイルをインクルードするように記述されています。 また、それぞれのルールファイルは大まかにジャンル分けされており、ファイル名からおおよそ機能が想像できるような名前付けがされてます。
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には以下のようなプリプロセッサが準備されています。
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 について解説しましょう。 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に対しては、アクションの種類によるルールの適応順のみが有効で、実際のルールファイル内での記述順は気にしていません。よって、自分でルールを記述する場合には注意が必要です。 |