The Snort FAQ The Snort Core Team この文書について意見や要望はいつでも歓迎します。erek@snort.orgまでE-メールを ください。もしこのドキュメントに貢献しているのに名前が書かれていないなら、メールを ください。 多くの人々がこのFAQに貢献されています。 Marty Roesch Fyodor Yarochkin Dragos Ruiu Jed Pickel Max Vision Michael Davis Joe McAlerney Joe Stewart Erek Adams Roman Danyliw Christopher Cramer Frank Knobbe Phil Wood Toby Kohlenberg Ramin Alidousti Jim Hankins Dennis Hollingworth Paul Howell Stef Mit Ofir Arkin Jason Haar Blake Frantz Lars Norman S?dergaard Brent Erickson Brian Caswell Scot Wiedenfeld Chris Green Jeff Wirth Edin Dizdarevic Detmar Liesen Don Ng Matt Kettler Joe Lyman Jim Burwell Jed Haile Andrew Hutchinson Jeff Nathan Alberto Gonzalez Jason Haar Dragos Ruiu: このバージョンのガイドはWiley and Sons publishersが私を支えてくれる という親切で寛大な後援によって提供されています。またsnortの開発者である Jeff NathanとJed Haileがこのドキュメントのために時間を割いてくれ、その他のsnort チュートリアルが出版予定です。 日本語版翻訳 : しかP、やまひら、山岸、みやこだ、なかの、葛野、しだれざくら 日本語版監訳 : 日本Snortユーザ会 (http://www.snort.gr.jp) コンテンツワーキンググループ 目次 *目次 * 1 背景 +1.1 snortの開発者の名前はどう発音するのですか? +1.2 Fyodor Yarochkinはnmapを作ったFyodorと同一人物ですか? +1.3 どこでsnortに関する情報をもっと入手できますか? +1.4 どこでIDSに関する情報を入手したり、講座を受けることができますか? +1.5 snortは断片化したIPパケットを扱いますか? +1.6 snortはTCPストリームの再構築を実行しますか? +1.7 snortはステートフルなプロトコル解析を行いますか? +1.8 スイッチを使ったネットワークを使っています。それでもsnortを使えますか? +1.9 "stick"や"snot"のようなIDS用ノイズジェネレータに対してsnortは脆弱ですか? +1.10 snortはポリモーフィックな変異をするシェルコードを用いることで回避できますか? +1.11 snortはアラートを生成するとき、パケットすべてを記録しますか? * 2 利用開始にあたって +2.1 どこでBlueHat BSD-Linux-RT用のバイナリパッケージを見つけることができますか? +2.2 どうやってsnortを実行するのですか? +2.3 どこにログファイルは置かれますか?どのような名前ですか? +2.4 なぜ/var/log/snortに関してsnortがエラーを出力するのですか? +2.5 snortセンサーを設置するよい物理的場所はどこですか? +2.6 libpcapがパーみしょんに問題があると出力します。どうすればいいですか? +2.7 RedHatを持っているのですが.... +2.8 どこで最新バージョンのlibpcapを入手できますか? +2.9 どこで最新バージョンのWinpcapを入手できますか? +2.10 必要なWinpcapのバージョンは何ですか? +2.11 なぜsnortをビルドする時、"missing reference"エラーが出るのですか? +2.12 なぜsnortをビルドする時"yylex"や"lex_init"のエラーで失敗するのですか? +2.13 snortボックスを作ろうとしています。××なハードウェアで○○くらいのトラフィックを扱えますか? (××にはハードウェアのリスト、○○はトラフィック量をそれぞれいれてください) +2.14 CIDRネットマスクとは何ですか? +2.15 tcpdumpファイルを読み込む"-r"スィッチの用途は何ですか? * 3 Snortの設定 +3.1 どのようにすればsnortを"ステルス"インターフェースで設置できますか? +3.2 どのようにすれば受信専用のイーサネットケーブルを作れますか? +3.3 HOME_NETとEXTERNAL_NETとは何ですか? +3.4 ネットワークが複数のサブネットに分かれています。どのようにHOME_NETを定義すればよいですか? +3.5 どのようにEXTERNAL_NETを設定すればよいですか? +3.6 どのようにすれば複数のインターフェースを同時に使ってsnortを実行できますか? +3.7 インターフェースにIPアドレスが動的に割り当てられます。このインターフェースでsnortを使えますか? +3.8 ひとつのネットワークカードに2つのエイリアスを定義しています。snortにそれぞれのアドレスでlistenさせる事はできます。 +3.9 どのようにすれば、特定のホスト(ホスト群)から入ってくるトラフィックだけ無視させることができますか? +3.10 どのようにすればsnortでパケットヘッダと同様にパケットペイロードを記録できるようにできますか? +3.11 なぜ/var/log/snortにIPアドレスのサブディレクトリができないのでしょうか? +3.12 なぜportscanプラグインはportscan-ignorehostsリストに記載されたホストからのステルススキャンを記録してしまうのですか? +3.13 ステルススキャンとは何ですか? +3.14 SYNFINスキャンとは何ですか?(同上!) +3.15 コマンドラインとルールファイル、どちらが優先されますか? +3.16 ルールの適用順序はどのようになっていますか? +3.17 どのようにstream4を設定できますか? +3.18 新しい/変更されたルールセットはどこで入手可能ですか?どのようにすればマージできますか? +3.19 どのようにすればCVSから最新のsnortを入手できますか? +3.20 どのようにすればリモートのsyslogマシンを使えますか? +3.21 どのようにすればACIDをビルドできますか? * 4 ルールとアラート +4.1 ルールファイルを読み込むときにエラーが生じます。 +4.2 snortが"Rule IP addr ("1.1.1.1") didn't x-late, WTF?"とメッセージを出します。 +4.3 snortをファイアウォールの内側に設置するととても静かです.... +4.4 snortはIPTables/IPChains/IPF/PFによってフィルタされたパケットを見るのですか? +4.5 非常に多くのあるアラートタイプを受け取っています。何をすればいいでしょうか?もっと詳しい情報はどこで得られますか? +4.6 これらすべての偽アラートはなんでしょうか? +4.7 /var/log/snort内のサブディレクトリにできるICMPファイルはどうでしょうか? +4.8 なぜpassルールで記述したパケットがアラートを発生させてしまうのでしょうか? +4.9 "ICMP distination unreachable"アラートは何でしょうか? +4.10 なぜsnortのルールはP(PSH)フラグとA(ACK)フラグがセットされたものが多いのでしょうか? +4.11 snortが"BACKDOOR SIGNATURE..."というアラートを発しました。トロイの木馬がインストールされているのでしょうか? +4.12 "CGI Null Byte attack"とは何ですか? +4.13 ACIDでは、なぜ一部のアラートは"unknown"IPアドレスのように見えるのでしょうか? +4.14 ACIDでアラートに優先順位を割り当てることは可能ですか? +4.15 "SMB Name Wildcard"あらーととは何ですか? +4.16 SYNFINスキャンって何?(また出てきたよ・・・このネタ、前にもあったはず。) +4.17 とても多くの"IIS Unicode attack detected"や"CGI Null Byte attack detected"の誤検知が生じます。 どうしたらこの検知を止めることができますか? +4.18 どうしたらsnortのアラートやログをテストできますか? +4.19 アラートとログの違いは何ですか? +4.20 ルールのキーワードにANDやORを一緒に使えますか?(だと思う、フォロープリーズ) +4.21 snortはMACアドレスによるルールを引き金にできますか? +4.22 どうすればルールの使用をとめることができますか? +4.23 どうすれば一部のホストを除くすべてのアドレスを定義できますか? +4.24 新しいルールを追加したりルールをコメントアウトした後どうすればsnortをリロードできますか? +4.25 ルールで、distanceとwithinキーワードはコンテンツの検索をどの位置に変更しますか?(だと思う。フォロープリーズ) +4.26 ルールでどうすればポートのリストを指定できますか? +4.27 どうすれば80番以外のポートを使用しているWebサーバを保護できますか? +4.28 どうすれば"spp:possible EVASIVE RST detection"アラートをとめることができますか? +4.29 自分のルールと衝突しないようなプライベートのSID番号の範囲はどこですか? +4.30 変数やルールでどれくらい長いアドレスリストを使えますか? * 5 気の利いた機能 +5.1 Barnyardについて話しているのを聞きました。何ですか? +5.2 どうすればsnortのログをレポートに処理できますか? +5.3 どうすれば複数のデータベースや出力プラグインにログを取れますか? +5.4 どうすればイーサネットカードなしや他のコンピュータとつながっていないコンピュータでsnortをテストできますか? +5.5 どうすればsnortをWin32のサービスとして起動できますか? +5.6 snortを使ってipfilter/ipfwファイアウォールのルールを追加することはできますか? +5.7 snortを使って攻撃トラフィックをブロックする最善の方法は何ですか? +5.8 snortが"react"キーワードについてエラーを出力するのですが... +5.9 どうすればsnortからアラートをEメールで受け取ることができるようになりますか? +5.10 どうすれば特定の種類のトラフィックを記録し、syslogにアラートを送ることができますか? +5.11 アラートがあがったとき、snortが外部プログラムを起動することは可能ですか? +5.12 どうすればHTTPのURLやSMTPのトラフィックをsnortを使って記録することができるのですか? +5.13 どうすればACIDのようにsnortのDBからsnortのアーカイブ用DBにデータを移すことができますか? +5.14 記録されたソースのアドレスやそれがどこから来るのかをもっと調べるためのリソースは何ですか? +5.15 どうすればこのトラフィックを理解し、IDSのアラート分析をすることができるでしょうか? +5.16 どうすれば記録されたパケットの詳細について調査できますか? * 6 問題について +6.1 snortのバグを見つけたようです。さて、どうすればいいですか? +6.2 SMBアラートが動かないのですが、何が間違っていますか? +6.3 snortが"Garbage Packet with Null Pointer discarded!"とメッセージを出します。はて? +6.4 snortが"Ran Out Of Space"とメッセージを出します。何だって? +6.5 長い作業を行うとき、ACIDのDB接続がタイムアウトします。(e.g.多くのアラートを削除するとき) +6.6 なぜACIDはセンサーの番号を変更してしまうのでしょうか?どうすれば固定にできますか? +6.7 なぜsnortはLinuxではパケットロスの統計は利用できない、とレポートしてくるのですか? +6.8 /var/log/snortディレクトリが肥大化するのですが.... +6.9 なぜACIDでアラートを消そうとすると"error deleting alert"とメッセージが出るのですか? +6.10 Lynxで見るとACIDが壊れているように見える。 +6.11 "snort [pid] uses obsolete (PF_INET, SOCK_PACKET)"というワーニングが出る。何が違うのですか? +6.12 HPUXでlan0を使おうとするとopen: recv_ack: promisc_phys: Invalid argumentと出る。 +6.13 十分なディスク容量があるのに"can not create file"エラーでsnortが死んでしまう。何が間違っているのだろう? +6.14 Windowsでsnortを使うとき、"OpenPcap() error upon startup: ERROR: OpenPcap() device open: Error opening adapter"とエラーががでる。間違っていますか? +6.15 snortがデータベースに記録しない! +6.16 Portscanをデータベースに記録しない。 +6.17 snortがsyslogに記録しない。 +6.18 $DNSサーバ変数に代入しているIPアドレスからのポートスキャンメッセージが大量に出てしまう。 +6.19 なぜchrootしたsnortはSIGHUPシグナルを送ると死んでしまうのでしょうか? +6.20 snortがクラッシュしました。どのようにリスタートすればいいですか? +6.21 どうしてオートスイッチハブ上の10Mや100Mトラフィックを監視できないのですか? +6.22 snortをインストールしようとすると"bad interpreter: No such file or directory"と言われます。 +6.23 Win32で、どのインターフェースも表示されないのです。 +6.24 Win32で動きません。どうしたらこの問題がsnort側かwinpcap側か知ることができますか? +6.25 新しいルールセットをダウンロードしてきたらそのルールについてsnortがエラーを出し止ります。 +6.26 どうしたらACID+MySQLでスピードアップできますか? +6.27 なぜ多くの"SMTP RCPT TO overflow"アラートを受け取るのでしょう? +6.28 非常に多くの*ICMP Ping Speedera*アラートを受けます。問題ですか? +6.29 なぜunifiedアラートは+/-N時間ずれるのでしょうか? +6.30 snortを起動しようとすると"ERROR: Unable to open rules file: /root/.snortrc or /root//root/.snortrc"というエラーを受け取ります。これを直すのにはどうすればいいでしょうか? * 7 開発 +7.1 どうすればsnortをデバッグモードにできますか? * 8 その他もろもろ +8.1 "snort drinking game"って何ですか? 1. 背景 1.1 Snort の開発者の名前はどう発音するのですか? 明示するなら、Roesch は "fresh" の "f" を抜いたような発音です。それから、 "Ruiu" は "screw you" の "sc" を抜いたような発音 (寒い朝に貴方の車のエンジンが なかなかかからない時の音に似ています) で、Jed の名字は "pick-el" のような感じ です。"Pickle" じゃないですよ。 1.2 Fyodor Yarochkin は nmap を作った Fyodor と同一人物ですか? ちがいます。nmap の作者である fyodor@insecure.org は, 彼のペンネームです。 そして Snort の Fyodor は私の本名です。えぇ、私のメール ボックスも彼と 同じようにメッセージで溢れかえっています。だから、今更どちらも変えられないと 思います。:-) 1.3 どこで Snort に関する情報をもっと入手できますか? ウェブサイト (http://www.snort.org/) を確認してみましょう。他の良い資料として ソース ディストリビューション内の、Snort ユーザーズ マニュアルや USAGE ファイル も役立ちます。また Snort-users という素晴らしいメーリング リストもあります。 http://www.snort.org/lists.html へサインアップすることでその情報を見つける ことができます。また irc.freenode.het の #snort へも接続可能です。 * 翻訳時追記 日本語ウェブサイトとして http://www.snort.gr.jp 、日本語メーリングリストとして http://www.snort.gr.jp/ML/listinfo.cgi も提供されています。ご活用ください。 1.4 どこで IDS に関する情報を入手したり、講座を受けることができますか? 次に提示するコースにて侵入検知に関する講座を受け付けています。 * SANS - http://www.sans.org * Usenix - http://www.usenix.org/event/ * Networld/Interop - http://www.key3media.com/interop/ * CanSecWest - http://www.cansecwest.com Snort に関する本がいくつか出版されています。 +--------------------------------------------------------------------------------------------------------+ | | | | | | |----------------------------------+---------------------------+----------------+--------------+---------| | Snort: The Complete Guide | Jeff Nathan, Dragos Ruiu, | Wiley&Sons | 0471455970 | 06/2003 | |----------------------------------+---------------------------+----------------+--------------+---------| | to Intrusion Detection | Jed Haile | | | | |----------------------------------+---------------------------+----------------+--------------+---------| | Intrusion Detection with Snort: | Rafeeq Rehman | Prentice Hall | I0131407333 | 05/2003 | |----------------------------------+---------------------------+----------------+--------------+---------| | Advanced IDS Techniques | | | | | |----------------------------------+---------------------------+----------------+--------------+---------| | Snort Intrusion Detection | Ryan Russell | Syngress Media | 1931836744 | 02/2003 | |----------------------------------+---------------------------+----------------+--------------+---------| | Snort Intrusion Detection | Jack Koziol | New Riders | 157870281X | 04/2003 | |----------------------------------+---------------------------+----------------+--------------+---------| | | | | | | +--------------------------------------------------------------------------------------------------------+ 侵入検知に関する多くの良書が利用できます。その中から何冊か紹介します。 +-------------------------------------------------------------------------------------+ | | | | |---------------------------------------------------+--------------------+------------| | Network Intrusion Detection An Analyst's Handbook | Stephen Northcutt | 0735708681 | |---------------------------------------------------+--------------------+------------| | Intrusion Signatures and Analysis | Stephen Northcutt | 0735710635 | |---------------------------------------------------+--------------------+------------| | TCP/IP Illustrated, Volume 1 The Protocols | W. Richard Stevens | 0201633469 | |---------------------------------------------------+--------------------+------------| | Intrusion Detection | Rebecca G. Bace | 1578701856 | |---------------------------------------------------+--------------------+------------| | | | | +-------------------------------------------------------------------------------------+ * 翻訳時追記 +------------------------------------------------------------------------------------------------+ | | | | |------------------------------------------------+----------------------------------+------------| | Snort 2.1 Intrusion Detection, Second Edition | Jay Beale and the Snort Dev Team | 1931836043 | |------------------------------------------------+----------------------------------+------------| | Managing Security with Snort & IDS Tools | Kerry J. Cox | 0596006616 | |------------------------------------------------+----------------------------------+------------| | | | | +------------------------------------------------------------------------------------------------+ +----------------------------------------------------------------------------------+ | | | | |--------------------------------------+-----------------------+-------------------| | ネットワーク不正侵入検知 | 矢野博之監修 | ISBN4-7981-0142-7 | | | エクストランス訳 | | |--------------------------------------+-----------------------+-------------------| | ネットワーク侵入解析ガイド | 武田圭史監修 | ISBN4-89471-450-7 | | (侵入検知のためのトラフィック解析法) | クイープ訳 | | |--------------------------------------+-----------------------+-------------------| | 詳解 TCP/IP Vol.1 プロトコル | 井上尚司監訳 | ISBN4-89471-320-9 | | | 橘康雄訳 | | |--------------------------------------+-----------------------+-------------------| | 不正侵入検知[IDS]入門 | 日吉龍著 | ISBN4-7741-1985-7 | |--------------------------------------+-----------------------+-------------------| | Snort2.0侵入検知 | 渡辺勝弘/鹿田幸治 | ISBN4-7973-2533-X | | | Snort翻訳プロジェクト | | |--------------------------------------+-----------------------+-------------------| | | | | +----------------------------------------------------------------------------------+ 1.5 Snort は断片化した IP パケットを修復して取り扱えますか? はい。"preprocessor frag2" を使用してください。 1.6 Snort は TCP ストリームの再構築を実行しますか? はい。セッションをステートフルに解析してログを取得したり、TCP の再構築を したり、他にもいろいろできます。stream4 プリプロセッサを確認してください。 (FAQ 3.17 を参照) 1.7 Snort はステートフルなプロトコル解析を行いますか? はい。(FAQ 3.17 を参照) もちろん行えます。 1.8 スイッチを使ったネットワークを使っています。それでも Snort を使えますか? 要約バージョン: スイッチを使ったネットワークでのスニフが可能かどうかは、どのような種類の スイッチを使用しているかに依存します。もしトラフィックのミラーリングが可能な スイッチを使っているならば、すべてのトラフィックを Snort マシンのポートに ミラーリングしてください。 拡張バージョン: スイッチ環境で NIDS を配置するにはそれぞれに長所や欠点がありますがいくつかの 方法があります。どの方法があなたのニーズに当てはまるかは、貴方がどんな種類の セグメントを監視したいのかと、予算に依存します。以下に一般的な方法を示します。 1. スイッチ ミラー もしスイッチがトラフィックのミラーリングが可能ならば、Snort マシンの ポートに全てのトラフィックをミラーリングしてください。 + 長所: - 簡単です。その機能はほとんどの標準的なスイッチに備わっています。 + 欠点: - スイッチが Fast Ethernet スイッチであれば、最大で 100 Mbit/s を ミラーリング可能です。各スイッチのポートはそれぞれの方向に 100 Mbit/s づつ扱うことが可能で、1 つのポートあたりの大域幅は最大で 200 Mbit/s に 達します。従って、ネットワークに高負荷がかかれば全てのパケットを複製 できません。 - 幾つかのスイッチはポート ミラーリングにより性能悪化を起こします。 2. ハブ 対象 LAN (line) にハブを挿入すれば、全てのトラフィックを簡単に確認 できます。きちんと動作しているホーム ネットワークでは 50% 以上の負荷による コリジョンが発生するとデータが失われるでしょう。ですから 10 Mbps のハブは ちょうど T1/E1、DSL やケーブル モデムに適すでしょう。DS3 やそれ以上のもので あれば、タップについて詳しく調べた方が良いでしょう。 + 長所: - 簡単です。 - スイッチの性能に影響を及ぼしません。また設定変更の必要もありません。 - 低コストです。 + 欠点: - 全二重の機能は失われます。 - 単一点障害の可能性を追加してしまいます。 - 負荷レベルが 50% を超える場合、コリジョンによってデータが損失します。 3. ネットワーク タップ ネットワーク タップを使用します (例えば Shomiti/Finisar^[*] や Netoptics^ [*] 等)。Jeff Nathan 氏の記した文書からいくつかの良い情報を発見できる でしょう。その文書は http://www.snort.org/docs/#deploy にあります。 + 長所: - スイッチの性能に影響を及ぼしません。特別な設定も必要ありません。 - ステルス、つまりスイッチに向けてデータを送りません。 - 一箇所がダメになっても、例えば電源障害があっても "fail-open" します。 + 欠点: - データストリームが TX と RX に分離するので、NIC が 2 枚必要です。 - ステートフルな分析機能を失いたくなければ、2 つのデータストリームを 結合、つまりマージしなければなりません。チャネルボンディングを使用 すれば可能です。そのための情報は http://sourceforge.net/projects/bonding にありますが、コストが かかります。 4. お金をかける (前述のネットワーク タップを使って) すべてのスイッチ ポートを監視するが、 すべての入ってくるパケット (スィッチ ポートの RX 接続)だけをタップし、 それらのタップしたポートを、ひとつの専用ギガビットポートに 10 個の RX タップを監視させる能力のあるギガビット IDS 機器を接続した専用のギガビット スイッチに接続する。 + 長所: - 最大の補償範囲となります。(すなわちすべてのスイッチ ポートを監視できる) - パフォーマンスの低下とスイッチの再設定がありません。 + 欠点: - 非常に高価になります。(直訳: 金、金、金!) 1.9 "Stick" や "Snot"のような IDS 用ノイズジェネレータに対して Snort は脆弱 ですか? 今では、プリプロセッサ (FAQ 3.17 を参照) を使うことでそのようなたぐいのノイズ ジェネレータを無効にすることができます。Stream4 プリプロセッサを有効にしていない 状態でも、高度に最適化されているため、落ちたり、多くのアラートを失うことなく アラートの嵐を切り抜けられます。 多量のアラートを生成するツールの使用は、防御ツールから解析者に対して誰かがツールを 使って密かに行動していることを警告することになります。 1.10 Snort はポリモーフィックな変異をするシェルコードを用いることで回避 できますか? はい。そしてそれらはいくつかの NOP 検知シグネチャをすり抜けることができます。 しかし、通常利用するルールはそのような混乱によって影響を受けてはいけません。 fnord プロセッサは変化したりあやふやな NOP と同等スレッドの長い文字列を検知 しようとします。 1.11 Snort はアラートを生成するとき、パケットすべてを記録しますか? はい。パケットはアラートの原因となるパケットのソースホストと同じIPアドレスの ディレクトリに保存されます。バイナリログを使用しているのなら、ログ ディレクトリにパケットキャプチャファイル (.pcap) が作成されるでしょう。 2 利用開始にあたって 2.1 BlueHat BSD-Linux-RT 向けのバイナリパッケージはどこにありますか? 次の手順でどうぞ: wget http://www.snort.org/downloads/snort-stable.tgz tar zxvf snort-stable.tgz cd snort-stable ./configure make su make install mkdir /var/log/snort cd etc vi snort.conf snort -D -c snort.conf exit とここまで来て、我々が提供するアンインストーラーを使用したいならば :-) cd snort-stable; make uninstall というわけなのですが、どうしてもバイナリパッケージを使用したいなら http://www.snort.org/dl/binaries/ にあります。またたいていの BSD ポートツリーにも Snort は含まれています。 2.2 snort の起動はどうすればいいのですか? 次のコマンドで Snort をスニファーモードで起動して、パケットを認識しているか確認 してください。 snort -dv 続いて、ルールファイル中に防御するネットワークを HOME_NET 変数に適切に設定 された状態で snort を実行します。デフォルトのルールファイルは snort のディストリ ビューションに "snort.conf" という名前で付属しています。次のコマンドで、このルール ファイルを使用して snort が実行されます。 snort -A full -c snort.conf 正しく設定されているようなら、別のウインドウで次のコマンドを実行して、使用している インタフェイスが promiscuous モードにセットされているか確認してください。 ifconfig -a ifconfig コマンドの出力結果はインタフェイスが promiscuous モードで動作していること を表示しているはずです。そうでなければ、手動で promiscuous モードに設定する方法 が必要です。 注意 : snort のデフォルト出力モード (-A full オプション) は非常にうまく調整された 環境以外では使用しないほうが良いです。このモードは snort を最もスローに実行する 方法であり、ファイルシステムにおける inode 生成に関連する問題からの回復が困難 なのです。 実際の環境で IDS を実行する場合には、"-A fast -b" オプションのように fast alert モードと tcpdump バイナリログを組み合わせたり、unified format の組み合わせを使用 してください (FAQ [*] を参照のこと)。 2.3 ログファイルはどこに置かれますか?またどんなファイル名ですか? デフォルトでは /var/log/snort にログは保存されます。snort が "-l <ディレクトリ名>" オプションをつけて実行されていると、指定されたディレクトリにログが保存されます。 その昔、デーモンモード (-D オプション) で Snort を実行した場合、"snort.alert" とい うファイルが作成されていました。しかし、他との整合性を取るために変更されました。 通常モード、デーモンモードのどちらで実行しても "alert" という名前のファイルが作成 されます。 注意点として、バージョン 1.8 から 1.9 の間でファイルの命名規則に変更がありました。 新しい規則でのファイル名の後半部分には英数字がごちゃごちゃついてますが、これは UNIX のタイムスタンプです。これによりファイル名の重複を避けています。 2.4 snort が /var/log/snort について問題があると言ってるけど、これはなに? snort が alert を保存するためこのディレクトリが必要です。次のコマンドを試してみてく ださい。 mkdir -p /var/log/snort また、ログ用のディレクトリは snort を実行しているユーザ権限が設定されていることを 確認してください。 2.5 Snort センサーを設置する場所はどこが良いですか? これは、組織のポリシーや何を検知するか、ということにかなり大きく影響されます。まず 一つに、設置場所がファイアウォールの内側か外側かということが挙げられます。IDS を ファイアウォールの外部に設置する場合、ファイアウォールでブロックされたかどうかに 関わらず、すべての攻撃を検知することができます。この場合 IDS をファイアウォールの 内側に設置した場合に比べて多くのイベントを拾うため、より多くのログを出力することに つながります。ファイアウォールを通過したトラフィックにのみに興味がある場合には、ID S をファイアウォールの内側に設置してください。またリソースが許すならば、IDS をファイ アウォールの内側と外側両方に設置するのがよいでしょう。こうすれば、ネットワークに 向かってくるパケットと、ファイアウォールを通過したパケットのすべてを検知できます。 【蛇足的な補記】 注意 : この問題は FAQ に記載されているに関わらず、いまだに多くの議論を呼んでい ます。Erek Adams はこの継続的に議論されるトピックについての広範囲に渡り、また信 頼に足る議論を次のように編集された形でまとめてくれました。またハブやタップや -dr オプションについては FAQ を参照してください。 (訳注 : -drは多分Dragos Ruiu(FAQメンテナ)のサインです) ルータ/スイッチがポートミラーリング機能を有しているなら、そのポートに IDS を接続す れば良いでしょう。またハブを使用するのも選択肢として考えられます。たいていの NIDS はパッシブスニファーとして動作する NIC を装備しているはずです。 センサー設置場所については、私なら両方、つまり外部の監視と内部の監視の両方に 設置するでしょう。セキュリティ製品のディストリビュータで働いているので、過剰装備は ありがたいってわけです :) とにかく、センサーを通過しないトラフィックがモニターされる ことはありえません。そのために内部ネットワークにも IDS を設置している人たちがいる のだと思います。 ファイアウォールの「前」への設置 : 賛成意見 : 直面している攻撃の状況をより詳しく知ることが可能 反対意見 : すごーく沢山のデータに直面することになる。うんざり。ファイアウォール で NAT を使用していると、内部からのトラフィックのソースを追跡することが困難。 ファイアウォールの「後ろ」への設置 : 賛成意見 : ファイアウォールを通過したものだけをモニターすることになるね?IDS で の分析負荷の軽減になる。インターネットへ送信されるトラフィックを見てればいいし。 反対意見 : 自分の環境の状況把握が旨くできなかったり、安全だと勘違いしたりする。 ファイアウォールとの関係では IDS はどこにおけばよいか?ファイアウォールの内側、 外側という観点で賛成、反対方法の意見を詳しくみてみます。それぞれの欠点はどこにあ るのでしょうか? * NFR Security の MARCUS RANUM 氏の意見 : 「僕なら内側に置くだろう。誰かがファイ アウォールの外側を攻撃していることをどうして気に留める必要があるのかな?彼ら が侵入を成功すること、まあ、内部では IDS が検知するのだけど、それだけを気にし てる。IDS を外部に設置すると、あっという間に管理者を自己満足させてしまうことにな る。昔、攻撃があればすべて通知してくれるように設定されたファイアウォールを使っ たことがあるけど、二週間後には、警告メッセージを読まずに削除するようになってし まった。あと、IDS を内部に設置する重要なポイントは、侵入されるのは外部やファイ アウォールからだけではないということが挙げられる。内部に設置された IDS なら新 しいネットワークの追加や、攻撃者がダイアルアップ接続のような他の通り道から入っ てくることを検知できるだろう」 * IBM の CURRY 氏の意見 : 「IDS は気になるトラフィックを可能な限り見ることができ る場所に設置されるべきだろう。例を挙げると、インターネットからの攻撃が気になる なら、ファイアウォールの外側に置くことは理にかなっている。こうすることで、やっ てくるものすべてについて、何かに邪魔されることなく把握することができるようにな る。もし、ファイアウォールの内側に IDS を置くと、悪い奴らが送ってくるトラフィッ クのすべてを監視することができない。そうすると、侵入を検知することに対して影響 がでるかもしれない」 * Wheel Group の SUTTERFIELD 氏の意見 : 「IDS は概念的にはファイアウォールの内側 と外側で重要な役割を果たしている。ファイアウォールの外側で IDS は電子メールや Web のような公共のサーバに送られる正規のトラフィックを監視する。更に重要なこと に、ファイアウォール外側の IDS は、ファイアウォールがブロックするため内部シス テムでは検知されないトラフィックの監視が可能である。これは攻撃の初期段階で実施 される network sweeping を検知可能という点で特に重要である。また、外部設置された IDS のメリットには、ファイアウォールのサービスの処理が正しいかをモニターすることが 可能という点もある。ファイアウォールの内部へ IDS を設置する利点は、保護された ネットワークへの内部トラフィックの監視が可能という点である。これは、内部の脅威に 対する保護手段の一つに付け加えることが出来る。ファイアウォール内部に設置された IDS の主たる欠点は、信頼されないネットワークからの重要なトラフィックの多くを監 視することが出来ず、このために迫りきている攻撃の明白な兆候に対して警告を発する ことがないかもしれないという点である。 * ISS の CHRIS KLAUS 氏の意見 : 「ファイアウォールの外側に置くのは、大抵の場合グッ ドアイディアだね。DMZ の機器を攻撃から守ることが出来るし、内部ネットワークの保 護には他のプロセッサを割り当てることが可能だし。ファイアウォールのすぐ内側と言 うのも有用な方法だね。ファイアウォールに存在するトンネルを探していることを検知 できるし、ファイアウォールが正しく動作しているかを知る、正確なデータを得ること も可能だし。ただ、イントラネット全体というのが、おそらく IDS の実装の一番良い 設置箇所だろうな。われわれが心配しているのは (外部からの) 攻撃だけではない、 ということには皆が賛成している。内部のいたずら、不正使用、スパイ活動、窃盗、誤 用などということにも対応しなければならない。侵入検知システムは外部同様に、内部 ネットワークにおいても十分有効なもの。特に、システムを目立たず、かつ構築・導入 が簡単な場合にはね」 * GENE SPAFFORD 氏の意見 : 「IDS は、内部での不正使用やファイアウォールを潜り抜 けたある種の攻撃を検知するために、ファイアウォールの内部に設置されるべきである。 ファイアウォール外側の IDS は、ファイアウォールへの攻撃を監視する場合や、ファ イアウォールが通過を許可しないトラフィックを抽出する場合には有用な仕組みとなり える。しかし、本当の意味での IDS は、監視結果に対する対応策がない場合には、設 置された場所で見捨てられてしまうことになりがちである」 * 結論 : DRAGOS RUIU 氏 : 「ログを見たい場所を選べばいいです :-)」 2.6 Libscap がパーミッションに問題があると言ってる。どうなってるの? Snort を root 権限で実行してないか、カーネルが正しく設定されていません。 2.7 RedHat を手に入れたんだけれど…… libpcap のバージョンを確認してください。0.5 未満であれば、アップデートしてください。 2.8 どこで最新の libpcap を入手できますか? 最新のバージョンは次のサイトで入手できます。 http://www.tcpdump.org/ また、Phil Wood による Linux 向けの libpcap のパッチも見ておいたほうがいいかもしれません。 http://public.lanl.gov/cpw/ 2.9 どこで最新の Winpcap を入手できますか? http://winpcap.polito.it/ 2.10 Winpcap のどのバージョンが必要ですか? 場合によります。例えば、プロセッサ 1 つの場合、最新バージョン (3.x) の使用が可能 です。SMP の場合、古いバージョン (2.3 未満) または 3.x バージョンに http://www.ntop.org/winpcap.html のパッチをあてたもの、どちらかを使用してくださ い。 2.11 なぜ、Snort ビルド時に "missing references" エラーがでるの? libpcap の configure 時に -install-incl オプションをつける必要があります。 (RedHat の場合には、libpcap-devel パッケージ (rpm) をインストールしてください) 2.12 なぜ、"yylex" や "lex_init" エラーで Snort ビルドに失敗するの? lex と yacc ツール、または同等の GNU ツールである flex と bison をインストールす る必要があります。 2.13 Snort 箱を構築しようと思っています。手元にある <使用するハードウェア> は < 目的とするトラフィック量> を処理することは出来ますか? それはなんともいえません。ルールが少ない場合には、標準的にはパフォーマンスが上が ります。不要なルールや、どうでもいいルールは使用しないでください。「〜とマシンを 設定し、XXMBのトラフィックを扱いました」的なパフォーマンスチューニングに関する ディスカッションは数多くあります。snort-users メーリングリストのディスカッション を読んでみてください。 以下は、この話題についての Marty からの引用です。 「ハードウェアと OS の推奨」 ガイドラインとパラメータについては次の通りです。侵入検知分野は、広範に実装された ハイパフォーマンスなコンピューティング環境の一つに変化しつつあります。NIDS セン サーへ必要とされる要件と実行時の制限事項について考えてみれば、現在の NIDS に見ら れるパフォーマンスの壁を理解するのは、あまり難しくないことにそのうち気づくと思い ます。 NIDS が必要なものは次の通りです。 1. MIPS (高速な CPU) 2. RAM (いつも沢山必要) 3. I/O (早いバスと高速な NIC) 4. AODS (大量なディスクスペース : Acres Of Disk Space) また、NIDS は常に内部的に極めて高速である必要があります。この点で Snort は徐々に 良くなってきています (バージョン 1.5 のリリースで、アーキテクチャがかなりきれい になりました)。しかし、パフォーマンス面ではいまだに利用可能な NIDS のリーダーの 一つとして認識されている程度です。 OS の選択についてですが、好きな OS を使用してください。Snort 2.0 でデータ取得プ ラグイン (Data Acquisition Plugin) を実装すれば、OS 選択は検討が必要な項目になる と思いますが、現在のところ、沢山の人々が Solaris、Linux、各種 BSD、Windows 2000 上で Snort の稼動に成功しているという話を聞いています。個人的には FreeBSD 上で Snort の開発を始めましたし、Sourcefire はセンサーアプライアンスの OS に OpenBSD を使用していますが、RedHat の Turbo Packet インタフェイスがいいという話も聞いて います (Turbo Packet インタフェイスは snort 使用時に幾つかのモジュールが必要です。 RedHat のむちゃくちゃなヤツに対する私のいつもの反対意見は言うまでもないことです が)。(編注 : まあ一杯飲んで、FAQ 7.2 を見てください)。(訳注 : Marty は RedHat の むちゃくちゃなところ (Red Hat's brokeness) にいつも文句を言ってるようです。) 2.14 CIDR ネットマスクって何ですか? (http://public.pacbell.net/dedicated/cidr.html からの引用) CIDR はインターネットの新しいアドレス割り当てスキームで、旧来の Class A, B, C と いうアドレス割り当てスキームより効率的な IP アドレスの割り当てを可能にしています。 CIDR ブロック 相当する Class C の数 IP アドレス数 利用可能なアドレス数 サブネットマスク /32 1/256th of a Class C 1 1 255.255.255.255 /30 1/64th of a Class C 4 2 255.255.255.252 /29 1/32nd of a Class C 8 6 255.255.255.248 /28 1/16th of a Class C 16 14 255.255.255.240 /27 1/8th of a Class C 32 30 255.255.255.224 /26 1/4th of a Class C 64 62 255.255.255.192 /25 1/2 of a Class C 128 126 255.255.255.128 /24 1 Class C 256 254 255.255.255.0 /23 2 Class C 512 510 255.255.254.0 /22 4 Class C 1,024 1022 255.255.252.0 /21 8 Class C 2,048 2046 255.255.248.0 /20 16 Class C 4,096 4094 255.255.240.0 /19 32 Class C 8,192 8190 255.255.224.0 /18 64 Class C 16,384 16,382 255.255.192.0 /17 128 Class C 32,768 32,766 255.255.128.0 /16 256 Class C 65,536 65,534 255.255.0.0 /15 512 Class C 131,072 131,070 255.254.0.0 /14 1,024 Class C 262,144 262,142 255.252.0.0 /13 2,048 Class C 524,288 524,286 255.248.0.0 CIDR についての詳細な技術情報は次の RFC を参照してください。 * RFC 1517: Applicability Statement for the Implementation of CIDR * RFC 1518: An Architecture for IP Address Allocation with CIDR * RFC 1519: CIDR: An Address Assignment and Aggregation Strategy * RFC 1520: Exchanging Routing Information Across Provider Boundaries in the CIDR Environment RFC は http://www.rfc-editor.org/rfcsearch.html で参照可能です。 (訳注 : 日本語版が存在する上記 RFC への URL は次の通り。 * RFC 1517: クラスレスドメイン間ルーティング (CIDR) の実装に関する適用声明 http://www.ne.jp/asahi/earth/stomomi/RFC/rfc1517-j.txt ) 2.15 tcpdump ファイルを読むための "-r" スイッチの使用法は? Snort のルールファイルとあわせて使うことにより、tcpdumpのデータは敵意のあるコンテン ツ、ポートスキャンやsnortを検知に使用できることすべてについて解析する事が可能で す。 また、Snort はデコードされたフォーマットでパケットを表示することが可能であり 多くの人にとって生の tcpdump の出力を見るよりは簡単な方法です。 3. Snort の設定 3.1 どのようにすれば Snort 用の "隠された" インターフェイスを設置できますか? *BSD と Linux: ifconfig eth1 up Solaris: ifconfig eth1 plumb ifconfig eth1 up NT/W2K/XP: 注: 以下の指示に従うことは貴方自身のリスクになります。レジストリの編集は危険 ですから、最大の注意を払ってください。あなた自身のリスクにて以下のステップに 従ってください。 1. 貴方のデバイスの hex 値を取得してください。( 'snort -W' がその動作をします) 2. Regedt32 を実行してください。 3. 次のように移動します: HKEY_LOCAL_MACHINE\( \backslash \)SYSTEM\( \backslash \)CurrentControlSet\( \backslash \)Services\( \backslash \)Tcpip\( \backslash \)Parameters\( \backslash \)Interfaces\( \backslash \) {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} 4. 監視インターフェイスに設定したいネットワーク カードを選択します。 (仮に {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} の値とします) 5. IPAddress:REG_MULTI_SZ: を null に設定します。(文字列をダブルクリックし、 マルチ ストリング エディタのデータを削除し、OK をクリックします) 6. SubnetMask:REG_MULTI_SZ: を null に設定します。(文字列をダブルクリックし、 マルチ ストリング エディタのデータを削除し、OK をクリックします) 7. DefaultGateway:REG_MULTI_SZ: を null に設定します。(文字列をダブルクリック し、マルチ ストリング エディタのデータを削除し、OK をクリックします) 8. レジストリ エディタを終了し、変更箇所を保存させます。 9. コマンド プロンプトから "ipconfig" を実行し、インターフェイスから IP による 制限がなくなっていることを確認します。 もし貴方が設定したインターフェイスから IP アドレス リストを受け取れなくなった のなら、あとは簡単です。Snort に -i フラグを使用し、インターフェイスを "snort -v -d -p -i1" のように指定して実行します。 3.2 どのようにすれば受信専用のイーサネット ケーブルを作れますか? イーサネット タップを使うか、自前の "受信専用" のイーサネット ケーブルを 用意してください。とりあえず、私は次のようなケーブルを使用しています。 LAN Sniffer 1 -----\ /-- 1 2 ---\ | \-- 2 3 ---+-*------ 3 4 - | - 4 5 - | - 5 6 ---*-------- 6 7 - - 7 8 - - 8 通常であれば、スニファ側の 1 と 2 を繋ぎ、3 と 6 はそのままに LAN 側へ接続 します。LAN 側の 1 と 2 はそれぞれ 3 と 6 に繋げます。これは両端がリンクして いるようみせかけつつ、LAN からスニファへのみトラフィックを流します。また、 "incoming" トラフィックは LAN へと返されるので、このケーブルは HUB だけでうまく 動作します。スイッチ環境では使えなくもないですが、恐らく興味深い問題が生じる でしょう。スイッチが送信したパケットをまた同じポートで受け取ることになるので、 MAC アドレス テーブルを混乱させ、スイッチはすぐに落ちてしまうのです。このため、 HUB でしかうまく動作しません。 コンデンサーを使用して 100 Mbps のリンクで作業する別の方法は以下に記載されて います: http://www.geocities.com/samngms/sniffing_cable 更に: Joe Lyman は UTP Y-Cable を用います: ノイズの少ないオプション: それは一組の cat 5 ケーブルとシングル スピードの HUB が 必要です。そのアイディアは rcv ケーブルをスニファ ボックスへ行くよう配線し、xmit ケーブルは別の HUB ポートから獲ます。これは貴方にリンク ライトを点灯させ、rcv のみのスニファを許可させるでしょう。xmit できないのは、xmit ケーブルが繋がっていない からです。これは Netgear シングル スピード HUB を使って成功しました。デュアル スピード HUB は速度のネゴシエーションによりうまく動作しません。 使用しないピンについて。線を交差させないようにするためにこの図は逆に描かれています。 また使用するピンのみ含めました。 HUB PORT 1 HUB PORT 2 ------- ------- x x r r r r x x 6 3 2 1 1 2 3 6 | | | | | | | | | ----------------- | | | --------------------- | | | | | | | | 6 3 2 1 r r x x ---- SNIFFER x = xmit r = rcv NIC 上の xmit ケーブルからの電圧をシミュレートするためバッテリーを接続すること により、それを単一のケーブルにすることができました。しかし、バッテリーは壊れて しまいました。 通信側を切り、グランド(PIN2)に短絡する事は推奨しません。PIN 1 が完成した回路で あることを示せない場合、OS はインターフェイスを無効にします。 3.3 HOME_NET と EXTERNAL_NET とは何ですか? HOME_NET と EXTERNAL_NET は全ての Snort.Org ルールが使用する標準の変数名です。 EXTERNAL_NET は攻撃が来ると予想される (いくつかの) ネットワークで、HOME_NET は あなたが保護したい (いくつかの) ネットワークを示します。 3.4 ネットワークが複数のサブネットに分かれています。どのように HOME_NET を 定義すればよいですか? Snort 1.7 は IP リストに対応しています。単一の変数に必要なアドレス数を定義 できます。例えば: var HOME_NET [10.1.1.0/24,192.168.1.0/24] 注意:現時点ではすべてのプリプロセッサが IP リストに対応しているわけでは ありません。特に明記しない限り、任意のプリプロセッサがIP リスト変数を使用する時は HOME_NET 変数の最初の値を使用します。ポートスキャンプリプロセッサは一つの例です。 すべてのポートスキャンを検知可能にするためには 0.0.0.0/0 をプロセッサの第一引数に 指定します。 preprocessor portscan: 0.0.0.0/0 5 3 portscan.log 最適化したり、ノイジーなトラフィックや信頼しているマシンを無視するよう定義するには portscan_ignorehostsプリプロセッサを使用します。 3.5 どのように EXTERNAL_NET を設定すればよいですか? 大抵の方は EXTERNAL_NET に "any" を設定することになります。 var EXTERNAL_NET any "any"に設定すると、snortはネットワークに入ってきたり(ネットワークから)出て行く、 ルールにマッチするすべてのトラフィックに対してアラートを発します。 Snort の作業を減らすため大抵の方は "HOME_NET 以外" をセットします。 var EXTERNAL_NET !$HOME_NET これは Snort へ EXTERNAL_NET を HOME_NET 以外の全てとして定義しています。これは ほとんどの人にとって最適な設定です。 3.6 どのようにすれば複数のインターフェイスを同時に使って Snort を実行 できますか? LINUX: もしあなたが (LPF を使用可能な) Linux 2.1.x/2.2.x カーネル上で Snort を 実行していないなら、たった一つの方法は、(-i オプションでインターフェイスを 指定し) インターフェイスひとつにつきひとつのインスタンスで Snort を実行すること です。しかし、Linux 2.1.x/2.2.x(もしくはそれ以降)ではインターフェース名として"any" の指定を使用可能な、S. Krahmer の作成したパッチを当てた libpcap ライブラリを使う事が できます。この場合、Snort はすべてのインターフェースに入ってくるトラフィックを扱うこと が可能です。 *BSD: 貴方の NIC を論理インターフェイス (bridge0) として結合させた "bridge" インターフェイスを使用します。 3.7 インターフェイスに IP アドレスが動的に割り当てられます。この インターフェイスで Snort を使えますか? はい。Snort 1.7 以降では、<インターフェイス名>_ADDRESS 変数が使用可能です。この 変数の値は常に Snort を実行するインターフェイスの IP アドレス/ネットマスクに セットされています。もしインターフェイスがダウンし、再びアップする (そして IP アドレスが再び割り振られる) と、Snort をリスタートする必要があります。過去の バージョンでは、スクリプトで同様の結果を得ることができます。 3.8 ひとつのネットワーク カードに 2 つのエイリアスを定義しています。Snort に それぞれのアドレスで listen させる事はできますか? バージョン 1.7 より、次のように IP リストを定義可能です。 var HOME_NET [ 192.168.10.0/24, 10.1.1.1/16 ] 3.9 どのようにすれば、特定のホスト (ホスト群) から入ってくるトラフィックだけ 無視させることができますか? ホストからのトラフィックを無視するには二つの基本的な方法があります: * パス ルール * BPF フィルタ 詳説 1. パス ルール + 長所: ルールに基づいたパケットのコントロールを行えます。 すべての変更を"一箇所"、つまりsnort.confに置けます。 + 短所: ルールの設定を逆にすると、問題を突き止める事が頭痛の原因になります。 ひとつの不完全な記述のパスルールがあなたのネットワーク全体を"盲目"にして しまいます。 (訳注: ネットワークが盲目になるのではなく、監視するsnortが盲目になる。) さらに特殊なpassルールは、満載のネット上での重要なものを処理するためにsnort がより多くのCPUを必要とします。 + 例: 例えば ホストから来る全ての ICMP トラフィックを無視するパス ルールはこう使用します: pass icmp any -> $HOME_NET any 2. BPF フィルタ: + 長所: BPFインターフェースでパケットを捨て、処理を節約します。 それらのパケットを"決して見ない"ので、snortのスピードが向上します。 + 短所: 貧相に作られたフィルタは貴方の "弱点" になります。 + 例: 192.168.0.1 からのトラフィックを全て無視します: snort not host 192.168.0.1 ホストからの ICMP-ECHO REPLY's (ping reply) と ICMP ECHO-REQUESTS (pings) を無視します: snort ``not ( (icmp[0] = 8 or icmp[0] = 0) and host )'' 3.10 どのようにすれば Snort でパケット ヘッダと同様にパケット ペイロードを記録 できるようにできますか? コマンド ライン オプションで "-d" を使用することでパケット ペイロードを記録し、 "-b" オプションで完全なバイナリ パケットを記録します。 3.11 なぜ /var/log/snort に IP アドレスのサブディレクトリができないので しょうか? それはログ出力にどのような設定を行っているかに依存します。もしログをバイナリ フォーマットで出力していれば、テキスト形式の代わりにバイナリログを得る でしょう。"-A " をコマンド ライン上で使用していませんか? コマンド ライン オプションは .conf ファイルの設定を上書きします。 3.12 なぜ portscan プラグインは portscan-ignorehosts リストに記載されたホスト からのステルス スキャンを記録してしまうのですか? そういった種類の TCP パケットはどこから送信されたかに関わらず、本質的に疑わしい ものです。ポートスキャンディテクター(検知器)はそのようなステルスパケットは報告 されるべきという仮定の元に設計されています。仮にそれがポートスキャンの監視対象 になっていないホストからのものであってもです。ステルスパケットを無視するオプション は将来追加されるでしょう。 3.13 ステルススキャンとは何ですか? (ステルススキャンが何だっていうんだ?) ステルススキャンは次のようなスキャン形式が該当します。 * ハーフオープンあるいは SYN スキャン - 完全な TCP スリーウェイ ハンドシェイク の代わりになるような完全な接続は作りません。SYN パケットがシステムに送られ SYN/ACK パケットが受け取った場合、システム上のポートはアクティブであると 仮定されます。この場合,システムがリッスン状態になっていると判断され、RST/ACK が送られるでしょう。RST/ACK パケットを受け取った場合、システム上のポートは アクティブでないと仮定します。 * FIN スキャン - RFC793によれば、システムは特定のポートに対してFINパケットを受信 した際、閉じているTCPポートはRSTパケットを送り返すべきとされている。 * クリスマスツリースキャン - RFC793によれば、システムは特定のポートに対して FIN/URG/PUSH パケットを受信した際、閉じているTCPポートはRSTパケットを送り返すべき とされている。 * NULL スキャン - RFC793によれば、システムは特定のポートに対してIPフラグがまったく 指定されていないパケットを受信した際、閉じているTCPポートはRSTパケットを送り返す べきとされている。 * スロースキャン - 上記のスキャンのどれもがスロー スキャンとして使用可能です。 スロースキャンはアタッカーがスキャンに必要なパケットを非常に遅いペースで送信する ことです。時にこれらのスキャンは数時間、数日あるいは数週間に及ぶこともあります。 これは非常にゆっくりなので、被害者のセキュリティ対策はスキャンに「気づかない」 可能性があります。 3.14 SYNFIN スキャンとは何ですか? (SYNFIN スキャンが何だっていうんだ?) SYNFIN スキャンは SYN と FIN の両方のフラグをセットするためそう呼ばれます。 3.15 コマンドラインとルール ファイル、どちらが優先されますか? コマンドライン オプションはルール ファイルの記述よりも優先的に実行されます。 もしルール ファイルをいちいち修正せずに手早く試してみたいときには、 コマンドラインで記述することでほとんどルール ファイルを無視できるように なります。 3.16 ルールの適用順序はどのようになっていますか? FOR 2.0 =>: ドキュメント v2.0 (http://www.snort.org/docs/#devel) を見てください。 FOR <= 1.9.X: Marty は数度にわたって snort-users メーリング リストで答えてます。ここに Thu, 22 Feb 2001 00:31:53 -0500, titled "Re: [Snort-users] order of evaluation of rules" の内容を示します。 現在、Snort のルール データを保存する構造は RuleTreeNodes (RTN) と OptTreeNodes (OTN) です。 これらのデータ構造は RTN を一番最初の列に、そして OTN を RTN の下の 行へ格子状に 2 次元リンクした構造として保存させます。 これは悪名高き"lisapaper"からのASCIIイラストです。 (訳注: lisapaper は http://www.snort.org/docs/lisapaper.txt の事だと思われます) RTN RTN RTN -------------- -------------- ----- | Chain Header | | Chain Header | | Chai | | | | | | Src IP | | Src IP | | Src | Dst IP |----->| Dst IP |----->| Dst ..... | Src Port | | Src Port | | Src | Dst Port | | Dst Port | | Dst | | | | | -------------- -------------- ----- | | | | | | OTN \|/ OTN \|/ -------V------ --------V------- | Chain Option | | Chain Option | | | | : | | Content | : | TCP Flags | : | ICMP Data | | Payload Size | | etc. | | | --------------- | | | OTN \|/ -------V------ | Chain Option | | | | Content | | TCP Flags | | ICMP data | | Payload Size | | etc. | | | -------------- | | 似たルールヘッダを持つルール、(例えばすべての CGI ルール、古いステルスポートスキャン 検知ルール、ほとんどすべての 1 つのサービスに的を絞ったルール、など) は効率化のために 1 つの RTN のもとにグループ化され、適用可能な OTN はその下にぶら下がります。例として、 あなたが以下のような 3 つのルールを使用している場合、 alert tcp any any -> $HOME 80 (content: "foo"; msg: "foo";) alert tcp any any -> $HOME 80 (content: "bar"; msg: "bar";) alert tcp any any -> $HOME 80 (content: "baz"; msg: "baz";) それらすべては同じ RTN としてグループ化され、OTN は以下のようにぶら下がります。 RTN -------------------- | SIP: any | | SP: any | | DIP: $HOME | | DP: 80 | -------------------- | | OTN \|/ ---------v---------- | content: foo | | msg: foo | -------------------- | | OTN \|/ ---------v---------- | content: bar | | msg: bar | -------------------- | | OTN \|/ ---------v---------- | content: baz | | msg: baz | -------------------- こうすればチェックを行うとき、RTN を 1 度だけみればよいので効率的な方法です。 また、この配列には別の観点があります。それは関数ポインタのリストです。配列中の それぞのれのノードは関数ポインタのリストとリンクしています。 リスト中の関数は 現在のパケットが現在のルール ノードの情報と一致するかどうか決定するために実行 される必要のあるものです。 この間数ポインターのリストを持っていることで効率と 柔軟性を併せ持ちます。現在のルールが持っていない事をテストする必要が ありません。(※持っていない事というより、現在のルールが含んでいない項目について テストする必要がありません。ってかんじですかね。) (例: "any" ポート/IP アドレス、content を持つ/持たないルール、など) また、プログラム全体を修正する必要なく、任意のパケット解析機能を持たせる ことができます。(バージョン 1.5 以前の場合) いくつか、このアーキテクチャでの影響があります。ルールの順序に関するこの議論において、 興味深い事のひとつは、ルールの順序における議論のためにルールの順序を図示する事がトリッ キーであるという事です。 例えば、 alert tcp any any -> $HOME 80 (content: "foo"; msg: "foo";) alert tcp any any -> $HOME 1:1024 (flags: S; msg: "example";) alert tcp any any -> $HOME 80 (flags: S; msg: "Port 80 SYN!";) alert tcp any any -> $HOME 80 (content: "baz"; msg: "baz";) 上記のルールはこのように構築されます。 RTN RTN -------------------- -------------------- | SIP: any | | SIP: any | | SP: any |-------->| SP: any | | DIP: $HOME | | DIP: $HOME | | DP: 80 | | DP: 1-1024 | -------------------- -------------------- | | | | OTN \|/ \|/ ---------v---------- ---------v---------- | content: foo | | flags: S | | msg: foo | | msg: example | -------------------- -------------------- | | OTN \|/ ---------v---------- | flags: S | | msg: Port 80 SYN! | -------------------- | | OTN \|/ ---------v---------- | content: baz | | msg: baz | -------------------- RTNが作成される際に適用される順序により、すべてのポート80(に関連する)ルールは1から 1024までのポート(に関連する)ルールの前に確認されます。これは、ルールパーサがポート 80のトラフィック用に最初のチェーンヘッダを構築し、ルールリストにそれをつけ、そして次 のルールが新しいチェーンヘッダを必要としている様に見えるため(チェーンヘッダを)作成し 配置するからです。この場合、直感的には"example"メッセージに到達し、"Port 80 SYN!"は決 して見られる事がないように期待してしまうかもしれないが、実際には逆が真なのです。 3.17 どのように stream4 を設定できますか? Stream4 は 2 つの機能を実現する全く新しいプリプロセッサです。 * Stateful inspection of TCP sessions * TCP stream reassembly さらにロバスト性を持ったストリーム再構築能力を持ち、Snort に対する最新の "ステートレス な攻撃" (例えば stick や snot) をうち破る事を望み、Marty は stream4 を実装しました。 Stream4 は企業クラスのユーザ (256 を越えるストリームを同時に追跡し、再構築する必要の ある人々) がストリーム再構築を実行することに対処できるようにする事を意図して書かれて います。Martyは強固で安定し、かつ早くなるよう、かなり広範囲にコードの最適化を行ってい ます。実施した試験及び計算では、数千の同時接続下で十分ストリーム再構築を行え、64,000 以上の同時セッションに対しステートフル インスペクションを行うことができると確信 しています。 Stream4 は大きく、複雑なコード (約 2,000 行) からできており、実行環境に関係した多くのオプションがあります。ですから、ここでそれらを取り上げます。 preprocessor stream4: [noinspect], [keepstats], [timeout ], [memcap] btream4_reassemble defaults: Reassemble client: ACTIVE Reassemble server: INACTIVE Reassemble ports: 21 23 25 53 80 143 110 111 513 Reassembly alerts: ACTIVE Stream4 と協調して機能する新しいコマンドライン オプションとして "-z" が あります。-z スイッチを指定した場合、Snort は (TCP トラフィックにおいて) 3 way ハンドシェイク経由でストリームが確立したときか、双方向で協調したストリームが 確立したときのみアラートを出力します。(例: ある通信が一方通行になり、他方から RST か FIN が送信元に返されたとき)"-z" を指定したとき、Snort は TCP ベースの stick/snot による "攻撃" を完全に無視します。 3.18 新しい/変更されたルール セットはどこで入手可能ですか? どのようにすれば マージできますか? 新しいルールセットはCVS経由でダウンロードできますし、あるいはhttp://www.snort.orgでも 見つける事ができるでしょう。 sourceforge が運営する Snort のルールに特化したメーリングリスト、snort-sigs も あります。ルールの管理を手助けするいくつかのスクリプト / プログラムもあります: * oinkmaster: ルールセットを更新するための簡単な Perl スクリプトです。 http://www.algonet.se/~nitzer/oinkmaster/ * IDS ポリシー マネージャ: 更新したルールセットを GUIをを使用してルールセットの 更新を行い、ルールセットをSCP経由でアップロードするwin32アプリケーションです。 http://www.activeworx.com/idspm * snortpp: SID によってソートされた 1 つのマスター ファイルで多数のファイルを 管理するプログラムです。 http://dragos.com/snortpp.tgz さらに、有用かもしれないこのようなスクリプトもあります。 * []#!/bin/sh ############################################################################### # # Das Skript zum Herunterladen und installieren neuer IDS-Signaturen. # ############################################################################### MAILTO="admin@mydomain.de" MACHINE="machine1" #set -x SIGS_URL1="http://www.snort.org/dl/signatures/snortrules-stable.tar.gz" MD5_URL1="http://www.snort.org/dl/signatures/snortrules-stable.tar.gz.md5" WGET="/usr/bin/wget" #WGET_PARAMS="-N" WGET_PARAMS="-t 3 -T 5 -N -a /etc/snort/snort.log -P /etc/snort" # Wget parameters: # # -t : Retries (here 3) # -N : Get the file only if newer # -a : Append the log messages to the specified file # -P : Save the file to the specified directory # -T : Timeout ECHO="/bin/echo" TAR="/bin/tar" KILL="/bin/kill" PIDOF="/sbin/pidof" SNORT="/usr/local/bin/snort" SNORTUSER="snort" SNORTGROUP="snort" KILLSIG="SIGUSR1" SERVICE="/sbin/service" # Where is the Snort configuration dir: RULESPATH="/etc/snort/snortrules" SNORTCFGPATH="/etc/snort" MD5SUM="/usr/bin/md5sum" MD5SUM_PARAMS="" # The list of sensor interfacec divided by blanks IFACES="eth0" ############################################################################### # F U N C T I O N S # ############################################################################### ############################################################################### # Die Funktion, die Snort fuer alle def. Interfaces auf dem System startet # # # # Um sie zu erweitern muss man zwei Dinge tun: # # 1. Die Parameterliste von Interfaces erweitern # # 2. Das Konfigurationsfile unter /etc/snort/snort.conf_ethX anlegen # # # ############################################################################### restartsnort() { # Restarting Snort for all interfaces for i in $IFACES; do "$ECHO" "Setting up Snort for interface "$i"" $ECHO "Restarting Snort..." #/usr/bin/killall snort if [ -f /var/run/snort_"$i".pid ] then PID=$("$PIDOF" "$SNORT") if [ -z "$PID" ] then "$SERVICE" snort restart else #`cat /var/run/snort_"$i".pid` "$ECHO" "Restarting Snort running with PID "$PID" and reloading the rules..." "$KILL" -s "$KILLSIG" "$PID" fi else "$ECHO" "No PID file for interface "$i" found under /var/run" fi "$ECHO" "Starting Snort" "$SNORT" -a -b -c "$SNORTCFGPATH""/snort.conf_""$i" -I -D -v -i $i -u "$SNORTUSER" -g "$SNORTGROUP" PID=`cat /var/run/snort_"$i".pid` "$ECHO" "Snort running now with PID "$PID"" done } ############################################################################### # Die Funktion zum ueberpruefen, ob und wie Snort auf dem System laeuft # ############################################################################### checksnort() { SNORTS=$("$PIDOF" "$SNORT" | wc -w | awk '{print $1}') SNORT_PIDS=$(/usr/bin/find /var/run -name snort\_eth[0-9]\.pid -ls | wc -l | awk '{print $1}') "$ECHO" "Snort instances counted: $SNORTS" "$ECHO" "Snort PID files found: $SNORT_PIDS" # 1. Fall: Snort laeuft nicht oder PID-File nicht da: if [ "$SNORTS" = "0" -o "$SNORT_PIDS" = "0" ] then "$ECHO" "Snort seems to be down or no PID file there..." "$ECHO" "Restarting Snort for all Interfaces..." "$SERVICE" snort restart fi # 2. Fall: Anzahl der Instanzen ungleich der Anzahl der PID-Files if [ "$SNORTS" -gt "$SNORT_PIDS" ] then "$ECHO" "More Snort instances than found PID files..." "$ECHO" "Something is wrong outthere..." "$ECHO" "Stopping all Snort processes..." # /usr/bin/killall -9 snort "$SERVICE" snort stop "$ECHO" "Hold on... Restarting Snort now..." "$SERVICE" snort restart fi # 3. Fall: Anzahl der Instanzen stimmt mit der Anzahl der PID-files ueberein } ############################################################################### ############################################################################### getrules() { # Get the rules, since we know that they are newer... $WGET $WGET_PARAMS $SIGS_URL1 $WGET $WGET_PARAMS $MD5_URL1 "$ECHO" "Readout the checksum..." # MD5-Summe auslesen if [ -f /etc/snort/snortrules-stable.tar.gz.md5 ] then MD5SUM1=`grep MD5 \ /etc/snort/snortrules-stable.tar.gz.md5|awk '{print $4}'` else "$ECHO" "Error! No MD5-file found" exit 1 fi "$ECHO" "Generating our own checksum..." # MD5-Summe bilden if [ -f /etc/snort/snortrules-stable.tar.gz ] then MD5SUM2=`md5sum /etc/snort/snortrules-stable.tar.gz|awk '{print $1}'` else "$ECHO" "Error! No rules file found" exit 1 fi if [ "$MD5SUM1" = "$MD5SUM2" ] then "$ECHO" "The MD5-Checksum fits!" "$ECHO" "$MD5SUM1" "$ECHO" "$MD5SUM2" "$ECHO" "$MD5SUM1" >> /etc/snort/snort.log "$ECHO" "$MD5SUM2" >> /etc/snort/snort.log "$ECHO" "Proceeding..." # /bin/sleep 1 else "$ECHO" "Error! Wrong checksum! Aborting!" "$ECHO" "Install rules manually!" "$ECHO" "$MD5SUM1" >> /etc/snort/snort.log "$ECHO" "$MD5SUM2" >> /etc/snort/snort.log exit 1 fi # Extract the new rules if [ -f "/etc/snort/snortrules-stable.tar.gz" ] then "$ECHO" "Extracting Snort rules..." "$TAR" -xzvf /etc/snort/snortrules-stable.tar.gz -C /etc/snort else "$ECHO" "Lost the file! Something is wrong!" "$ECHO" "Aborting!!" exit 1 fi # Deleting old rules # Existiert das Verzeichnis ueberhaupt? if [ -d "$RULESPATH" ] then # /bin/rm "$RULESPATH"/*.rules /bin/mv -f /etc/snort/rules/*.rules "$RULESPATH" /bin/cp -f /etc/snort/rules/classification.config "$SNORTCFGPATH" else "$ECHO" "Missing rules-directory!" "$ECHO" "Aborting!" exit 1 fi # Cleaning up... /bin/rm -rf /etc/snort/rules # Give everything to root /bin/chown root:root ${RULESPATH}/* } ############################################################################### # M A I N # ############################################################################### # Error handling first FCHK=$(/usr/bin/wget -spider -N -t 3 -T 5 "$SIGS_URL1" -P /etc/snort 2>&1) ERR_MSG=$("$ECHO" "$FCHK" | egrep -oi "failed error") # Log the error message explicitly "$ECHO" "$FCHK" >> /etc/snort/snort.log # If there is a word "failed" or "error" we break.. if [ "$("$ECHO" "$FCHK"| grep -i "failed")" ] || \ [ "$("$ECHO" "$FCHK"| grep -i "error")" ] then "$ECHO" "Error getting the files. The server seems to be not available." "$ECHO" "Error message:" "$ECHO" "$FCHK" "$ECHO" "Aborting!" exit 0 fi "$ECHO" "Checking/getting files..." # First extract the wget message FCHK=$(/usr/bin/wget -spider -N -t 3 -T 5 "$SIGS_URL1" \ -P /etc/snort 2>&1 | grep "not retrieving") /bin/date >> /etc/snort/snort.log "$ECHO" "Wget-output:" "$ECHO" $FCHK # Logging what we've done and when "$ECHO" "$FCHK" >> /etc/snort/snort.log if [ -z "$FCHK" ] then "$ECHO" "The files on the server seem to be newer." "$ECHO" "We will get them now..." getrules # Reload rules "$SERVICE" snort reload # restartsnort else # "$ECHO" "The signature files on the server are older or not newer." "$ECHO" "Doing nothing for now..." "$ECHO" "Checking if Snort is running...." checksnort exit 0 fi # Send Email "$ECHO" -e "`ls -lA "$RULESPATH"`\n\nSnort running with PID $("$PIDOF"\ "$SNORT")" | mail -s "Reloaded Snort signatures on $MACHINE"\ "$MAILTO" ############################################################################### ############################################################################### exit 0 #EOF 3.19 どのようにすれば CVS から最新の Snort を入手できますか? SnortプロジェクトのSourceforge CVSレポジトリは以下の命令セットをanonymous(pserver) CVSに用いる事でチェックアウト可能です。チェックアウトしたいモジュールはmodulenameと して指定しなければいけません。パスワードを要求された場合は単にエンターキーを押すだけ です。 cvs -d:pserver:anonymous@cvs.snort.sourceforge.net:/cvsroot/snort login cvs -z3 -d:pserver:anonymous@cvs.snort.sourceforge.net:/cvsroot/snort co snort モジュール ディレクトリ内部からの最新版については -d オプションは必要 ありません。 3.20 どのようにすればリモートの syslog マシンを使えますか? syslog スイッチ (-s) を追加し、syslog.conf に次の文を追加してください。 auth.alert @managmentserverIP ファシリティとプライオリティの設定についてのより詳しい情報はsnort.confファイルを確認 してください。 syslogをUDPを介して受け取るよう、マネジメントサーバのsyslogdを設定しなければなりません。 RedHat では、/etc/sysconfig/syslog を編集し以下の文を加えることにより、これをすることができます: SYSLOGD_OPTIONS="-r -m 0" これは、印のインターバルを0に設定し(タイムスタンプを無効にする事を意味します)、 ネットワーク接続を受け取るようにしてsyslogdを実行するようにします。 その後、syslogdを再起動します。"man syslogd"に更なる情報があります。いつかsyslog-ng (次世代syslogd)を詳細に調べたくなるでしょうから。 Snort の起動例: /usr/local/bin/snort -c /etc/snort/snort.conf -I -A full -s 192.168.0.2:514 -i rl0 Win32 ユーザーへの注意事項: Frank KnobbeはWindows環境でsnort.confを無効にすることなく"-s "をコマンドラインで 使用できるようにするsnortのパッチを作成しました。言いかえるなら、言い換えるなら、snort はまだsnort.confのすべてのセッティングを使用しますが、加えて、アラートをsyslogに送るた めに"-s"のホストを使用します。 (訳注: 上と言っていることがかみ合っていない。UNIXと同じなら、コマンドラインオプション を使った時点でconfファイルの設定はすべて無効になるので、それを回避したパッチをKnobbe氏 が作成している、って事かな) パッチの保管先は次に示します。 http://www.snort.org/dl/contrib/patches/win32syslog/ 3.21 どのようにすれば ACID をビルドできますか? 各パッケージのドキュメントをすべてしっかり読んでください。ACIDを動作させるためには、 依存する多くのパッケージがあるので多くの作業量となります。 Apache を動作させる、PHP を動作させる、GD を動作させる (多くのライブラリーが GD に 依存しています)、ADODB パッケージや PHplot も必要とします。設定をたくさん行います。 Solaris 8 上の作業では、Sun の信頼するフリーウェア サイト (sunfreeware.com) から使用するバイナリ パッケージを取得するという典型的な作業があります。大きな 問題に PHP および GD ライブラリがありました。GD 自身が動作するためにパッケージ 群とライブラリを必要とします。つまり libpng スタッフ、libjpeg スタッフ (jpeg を 望む場合) などを必要とします。GD のためにreadme を熟読してください。これらを 得てそれをさらに必要に応じてコンパイルするか、あるいはいくつかのバイナリ パッケージを得ます。PHP は正確にコンパイルすることが最も困難なものです。PHP パッケージをコンパイルするには GD を正しく動作させるための多くのの "-with" フラグが必要であり、そうでなければ未解決のランタイム参照エラーが山ほど出力 されます。GD へ唯一つの "with" を単に使用するだけでは十分でありません。更に GD が使用するライブラリそれぞれで"with"を使用する必要があり、そうでなければPHPは 必要とするファンクションを見つける事ができません。PHP に処理をさせるため "configure" の行に以下を書き込んでください。 ./configure --with-mysql --with-apxs=/usr/apache/bin/apxs --with-gd --enable-sockets --with-jpeg-dir=/usr/local/lib --with-png-dir=/usr/local/ lib --with-zlib-dir=/usr/local/lib --with-xpm-dir=/usr/local/lib これらの"with"命令は基本的にそれぞれのライブラリについて-Lと-R命令を含む Makefileに影響するため、コンパイルとランタイムリンカの両方がApacheモジュール 環境において必要とされるすべての機能を見つけ出す事ができます。 ※Apacheはモジュールの実行時にLD_LIBRARY_PATHを参照するようには見えません。 (PHP も、いくつかの設定ファイルに含まれる設定オプションもです。しかし 貴方は的確に "withs" を使うことができます) 実際、ボトムアップな処理が必要です。ですから、GDが必要とするあらゆるライブラリを入手、 コンパイルし、それらとそれらのパッケージが必要とするあらゆるライブラリ/パッケージを インストールする必要があります。それから入手したGDを正しくコンパイルし、インストール したら、PHPをコンパイルします。そしてphpinfo()(これはACIDのインストールで参照されます) を呼び出すスクリプトを作り、注意深く作成されたページを調査します。 PHPが動いている事を確信したら、他のもののための"基盤"が整った事になります。 PHplot をインストールし簡単にテストします。 それが問題なければ、ADODB と ACID をインストールし、コンフィグ ファイルを微調整 すれば、そして全ての処理は開始できるはずです。(ほら、ほら) WebサイトにあるACID FAQを読む事も忘れないでください。そこにあると思われる、ACID インストールガイドにない事柄があります。すなわち、PHPの"register_globals"オプションを php.iniファイルで有効にしなければならない、という事です。(これはデフォルトのPHP設定 では無効になっています。) ACID FAQ: http://www.andrew.cmu.edu/~rdanyliw/snort/acid_faq.html 4 ルールとアラート 4.1 ルールのロード中に起こるエラー よくあるのは以下のようなもの: * ERROR telnet.rules:YYY => Port value missing in rule! * ERROR telnet.rules:YYY => Bad port number: "(msg:"blah" * ERROR telnet.rules:YYY => Couldn't resolve hostname blah なにが起こっているのでしょう? "telnet.rules"というところが構文エラーの生じたファイル名で、"yyy"はエラーの発生 した行番号です。エラーにはいろいろな可能性があります。 1.ルールにポート番号が書いてないか、無効なポート番号を入力しているか、ホスト名 がおかしいか--こういった場合はルールの作者/保守担当者が注意する必要があります。 2.ありがちなのは、ルールそのものは正確だけど、その中の変数が宣言されていない 場合です。ルール ファイルを開き、行番号に相当するルールをチェックして、その ルールに使用される変数が宣言されているかどうか確認してください。 変数に関する 詳しい情報は以下にあります。 http://www.snort.org/docs/writing_rules/chap2.html#tth_sEc2.1.2 4.2 Snortが"Rule IP addr ("1.1.1.1") didn't x-late, WTF?"というメッセージを出す が? IPアドレスを囲んでいる引用符を削除して、もう一度やってみてください。 4.3 Snortがファイアウォールの内側で、まったく静かなんだけど? ファイアウォールのルールによって、Snortプロセスへのトラフィックもブロックされて います。 注意:snortがファイアウォール ボックスそのものにインストールされている場合は、 これは当てはまりません。 4.4 snortはIPTables/IPChains/IPF/PFによってフィルタされたパケットも見ますか? snortはlibpcapを使って動作しています。一般的に、snortは、ネットワークスタック が改変する前にネットワークアダプタドライバが見たものはすべて見ます。 LinuxのIPTables、LinuxのIPChains、BSDのPFやIPF、そして、その他のパケットフィルタは ネットワーク上に存在するパケットをsnortが見ることを妨げません。 内側向けのパケットがパケットフィルタによって拒絶される場合でも、そのインターフェース をリスンしていれば、snortはそのパケットを見て分析します。snort/pcapは、ネットワーク アダプタから出てきたり、そこに向かっているパケットはすべて監視します。 しかし、snortは、ネットワーク上のデータストリームが影響を受ける範囲に関しては影響を 受けてしまう、という事に注意してください。従って、ネットワークアダプタに決して届く 事がないため、送信されているのに拒否されてしまった外向きのパケットは見ないでしょう。 OpenBSD配下では、/dev/pflogNインターフェイスを使うことによって、PFが拒絶している場合 でも、snortが使えます。 4.5 <あるアラート タイプ>が大量に出ます。どうしたらいいでしょうか?どこでもっと詳しい情報を得られますか? 他のルールに比較して、より誤警報を出しやすいルールがあります。これは、たいてい ネットワークによって異なります。まず最初に調べる必要があるのは、それが本当に 誤警報かどうかです。いくつかのルールはID番号で参照できます。以下に、よくあるID システムと、特定のアラートに関する、より詳細な詳細な情報を入手可能な場所を示し ます。(※以下に、よくある〜、は「以下に、いくつかのIDシステムと〜」だと思います。) +---------------------------------------------------------------------------------------+ | System | Example | URL | |---------+---------------+-------------------------------------------------------------| | IDS | IDS182 | http://www.whitehats.com/IDS/182 | |---------+---------------+-------------------------------------------------------------| | CVE | CVE-2000-0138 | http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2000-0138 | |---------+---------------+-------------------------------------------------------------| | Bugtraq | BugtraqID 1 | http://www.securityfocus.com/vdb/bottom.html?vid=1 | |---------+---------------+-------------------------------------------------------------| | McAfee | Mcafee 10225 | http://vil.nai.com/vil/dispVirus.asp?virus_k=10225 | |---------+---------------+-------------------------------------------------------------| | Nessus | Nessus 11073 | http://cgi.nessus.org/plugins/dump.php3?id=11073 | +---------------------------------------------------------------------------------------+ パケットのペイロードを調査し、アラートが誤警報かどうかを決める必要があります。 パケットのペイロードを記録するには、-dオプションを使います。もし、アラートが 誤警報であると確信したら、大量の誤警報を生じているマシンに対してpassルールを 作成するのもいいでしょう。もし、制御不可能なほど大量の誤警報が複数の異なった マシンで生じたら、passルールをトラフィック全体に 対して設定することもできるで しょう。これは最後の手段としてください。 4.6 これらすべての誤警報について、どう考えたらいいでしょうか? 普通、大量の誤検知の方が、なにもないよりずっとましだと考えます。必要なければ 止めてしまうこともできます。逆に小さなルールセットしかないと、Snortがきちんと 動作しており、何の心配もない、といった慢心を抱かせてしまう可能性があります。 4.7 /var/log/snort内のサブディレクトリにできるICMPファイルは一体、なんでしょう? それらのほとんどは、ネットワーク接続の試みが失敗したときのdestination unreachableやport unreachableをsnortが検知したものでしょう。 4.8 なぜpassルールに記述したパケットでアラートが出力されるのですか? ルールが適用されるデフォルトの順序は、まずalertが最初で、次にpassルール、そして logルールの順番です。この順序は50のすばらしいalertルールを書き、そして間違った passルールを誤って作ってしまい、alertルールが使用不能にならないようにするため です。 (※この順序は〜なんですが、どうしても"don't"が使われている理由がわかりません。) もし、本当にpassルールが最初に解釈されるように順序を変更したいなら コマンドラインで-oスイッチを使うか、設定のディレクティブで"order"を使ってください。 もう一つ、注意して欲しいことがあります。それは、alertがプリプロセッサから生成され ている場合があるということです。この場合は、passルールを書いても誤警報は減りません。 BPFフィルタを使う必要があります。 4.9 "ICMP destination unreachable"alertとは何ですか? ICMPは"Internet Control Message Protocol"の略語です。コネクションに失敗している わけです。ICMP unreachパケットは、そのときのオリジナルのデータグラムとIPヘッダ の 先頭64ビット(8バイト)以上ををつけて送られます。 送信先アドレスにIPパケットを 届けることができなかったとき、ICMP Destination Unreachable(メッセージタイプ3)が送信元に送られます。ICMPのコードはどうして パケットが届かなかったのかを示します。オリジナルのコードは以下の通りです: 0 (ネットワークに届かない)net unreachable 1 (ホストに届かない)host unreachable 2 (プロトコルを届けられない)protocol unreachable 3 (ポートに接続できない)port unreachable 4 (フラグメントしないといけないのにDF(フラグメントしてはいけない)ビットが セットしてある)fragmentation needed and DF bit set 5 (ソース ルーティングに失敗した)source route failed 理由に関しては「場合によりけり」です。 ICMP Unreachableエラーメッセージは2つのグループに大別できます: 1. ルータによって発行されたICMP Unreachable Error Message(16種類すべて) 2. ホストによって発行されたICMP Unreachable Error Message(2種類だけ) ホストによって発行されるもの2種類とは何でしょうか? *ICMP Port Unreachable - 送り先ホストのポートが閉じられている(言い換えれば リッスン状態になってない) *ICMP Protocol Unreachable - 試そうとしているプロトコルを送り先ホストが使用 していない ICMP TypeのフィールドとCodeフィールドの両方から、なぜパケットを届けることができ なかったかがわかります。Snortの出力するいくつかのICMPアラートはicmp-info.rules に記述されており、役に立つ情報源です。現時点ではリファレンスも関連するクラス タイプも設定されていません。 ほかのルールはやっかいな活動に関係している傾向があります。例えば、icmp.rulesにある ルールに以下のような物があります: alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP ISS Pinger"; content:"|495353504e475251|";itype:8;depth:32; reference:arachnids,158; classtype:attempted-recon; sid:465; rev:1;) これは、arachnids referenceをチェックすることにより、その重要性を確認できる ものです。classtypeは大なり小なり、そのイベントの相対的な重要性を示しています。 ターゲット ホスト側で宛先のUDPポートが閉じている、言い換えればリッスン状態に なっていないとき、 送信先ホストはICMP Port UnreachableエラーをソースIPアドレス に対し送り返します。*nixベースのマシンのtracerouteのような、これらのメッセージ を使うプログラムもあります。Windowsベースのマシン(tracert)はICMP echo request をデフォルトで使用します。 もっと詳細な情報は以下にあります: * IP ftp://ftp.isi.edu/in-notes/rfc791.txt * ICMP ftp://ftp.isi.edu/in-notes/rfc792.txt * TCP ftp://ftp.isi.edu/in-notes/rfc793.txt * UDP ftp://ftp.isi.edu/in-notes/rfc768.txt そして * http://www.iana.org/assignments/icmp-parameters いや、それどころか、以下のURLを開きやすい場所に保存しておくといいでしょう: http://www.iana.org/ また、ICMPに関するしっかりとした文書もあります。 http://www.sys-security.com/ 4.10 どうして多くのSnortルールはPフラグ(TCP PuSH)とAフラグ(TCP ACK)の セットがついているの? PAフラグつきでアラートを発するようにしているひとつの理由は誤検知を最小にするためです。 でないと、コネクションが確立しただけでアラートを受けることになります。 もしすべての 試みを見たいのであれば、シグネチャを修正するか、シグネチャを追加するか、もしくは特定 のポートで生じている試みがあるかどうか見るためにファイアウォールのログを使うかのいずれ かをする必要があります。 4.11 snortからBACKDOOR SIGNATURE…という警告が出ますが゛私 マシンにはトロイの木馬が 入っているのでしょうか? パケットのデータ部分をダンプしていれば、それをチェックしてください。これらの ルールのほとんどは単に、ポート番号にだけ基づいているため、誤警報の可能性が高い ことが分かっています。 4.12 "CGI Null Byte attacks"って何ですか? それはhttpプリプロセッサの機能の一部です。基本的に、httpのデコードルーチンが httpリクエスト中に"%00"を見つけると、このメッセージを出力します。 cookiesにURLエンコードされたバイナリが入っていたり、ポート443で流れている、SSL で暗号化された通信を検知対象としている場合にしばしば誤検知を出します。 アラート対象となったパケットを保存しているのであれば、アラートの原因となった 実際の文字列を確認する事ができます。 同様に、UnicodeのアラートはcookieやSSLで同様の誤検知の対象となります。 パケットダンプをとることが本当にアタックをされているかどうかを確認する唯一の方法です。 もっとも、これは、コンテンツを基本としたアラートすべてに言えることです。 4.13 ACIDで、どうして一部のアラートは"unknown"IPアドレスのように見えるの? Snortのデータベース プラグインはルール(シグネチャ)によってアラートが発生した時 のみパケットの情報をデータベースに記録します。 そのため、アラートがプリ-プリプロセッサ(ポートスキャンやミニフラグメント)によって 作成されたとき、ルールと一致しているわけではないので、 パケットの情報はログに書き込 まれず、その出来事だけが記録されます。 結果として、ACIDはパケットレベル(IPアドレス など)の情報を出力することができないのです。 特定のアラートは、統計上はユニーク なIPアドレスとしてでず、"unknown"なIPとしてリストされ、 アラートをデコードして もパケットに関する情報がリストされません。 4.14 ACIDを使うとき、Alertにプライオリティをつけることは可能ですか? この質問に簡単に答えると、"できません"。 ACIDは基礎となるデータベースに左右され るため、snortがプライオリティをアサインしなければ ACIDはプライオリティを持ち得 ません。それでもなお、いくつかの対処法があります。 * 異なった重要性を持つアラートをそれぞれ個別のデータベースに記録することで データベース中にプライオリティをつけくわえることが可能です。 例えば、バッファオーバーフローのようなクリティカルなアラートを一つのデータ ベースに、スキャンのようなアラートを別のデータベースに書き込みます。そして、 二つの異なったバージョン,つまり異なったデータベースのインスタンスを指し示す ACIDをロードするのです。 * 手作業でじゃますることにより、Alert Group(AG)をプライオリティ割当に使うことが できます。本質的に、この方法はそれそれのレベルのAGを作成し、手作業でアラートを 正しいグループに移動させる必要があります。 (※手作業を介する事により、Alert Group(AG)をプライオリティの割り当てとして 使う事ができます。かなぁ。じゃまするってのはちとどうかと思ったり。) 4.15 「SMB Name Wildcard」というアラートはなんですか? WhiteshatsのIDS177では(http://dev.whitehats.com/cgi/test/new.pl/Show?_id= netbios-name-query)外部ネットワークから送信されるNetbios_name_queryトラフィック と明記されています。 一般のネットワークからやってくるNetbiosトラフィックを許可する事は一般的に とても安全でないとされています。 もし、自分が使っているルールもingresトラフィックのみを参照しているのであれば、 それはなぜ大量の誤検知を見ないのか、を説明している事になります。 大量の誤検知を見ている全ての方へ。もし、自分のルールを変更して、ソースアドレスを !$HOME(または、内部ネットワークを表現するのに使われるなんらかの変数)と考える場合、 誤検知のほとんどが見えなくなるはずです。 このチェックの値はデフォルトの管理者権限共有、C$、ADMIN$などにアクセスした ことを示しています。 通常の利用では生じません。ーファイル共有をしたい場合、 共有とACLを明示的に定義するものです。 4.16 SYNFINスキャンって何? SYNFINスキャンは、SYNとFINの2つのフラグ両方をセットしていることからその名前が 付いています。 4.17 とても多くの"IIS Unicode attack detected"や"CGI Null Byte attack detected"の 誤検知を出力します。どうしたらこの誤検知を止めることができますか? これらのメッセージはhttp_decodeプリプロセッサが出力します。もしこの検知を止め たいなら -unicodeや-cginullをhttp_decodeプリプロセッサの行に続けて書いてくだ さい。 preprocessor http_decode: 80 8080 -unicode -cginull 内部のユーザーがふつうにWWWを見て回ることが、このプリプロセッサにアラートを 出力させる引き金になります。Netscapeはとりわけよく引き金になることで知られて います。 アラートを停止する代わりに、以下のような感じで外向きのhttpトラフィックをBPF フィルタで無視させることもできます。 snort -d -A fast -c snort.conf not (src net xxx.xxx and dst port 80) これは5-6ヶ月間、非常にうまく働いており、Snortは、公開webサーバに対する、 ほんとうに危険なcgi null攻撃やunicode攻撃を検知してくれます。 4.18 どうやったらSnortのアラートやログをテストできますか? 常時監視させるテストには以下のルールを試してみてください。 alert tcp any any -> any any (msg:"TCP traffic";) また、sneeze(http://snort.sourceforge.net/sneeze-1.0.tar)も調べてみて ください。の方が正確ですかね。 sneezeは誤警報発生プログラムで、Snortのシグネチャを読み、それらのルール の引き金となるようなパケットを生成します。 4.19 "Alerting"と"Logging"の違いとは? Snortには、「logging」と「alerting」という、二つの主要な出力機能があります。 alerting機能は、なにか興味深いことが生じている事を知らせるためにあります。logging 機能はすべてのパケット情報を出力形式(pcap、ascii、データベースなど)に従って 記録するためのものです。 Snortのalert動作は、snortによってイベントが検出された際、アラート機能へイベント を書き送り、出力機能でできる限り/望ましい形でログを取るという、二つのことを行う よう、ハードコート(直接プログラム)されています。 log動作は、単に、現在のパケットを、alertを発生させることなく記録していきます。 こういう仕掛けで、すべてのパケットに対してalertを発生させることなく(telnetセッション など)興味深い内容が記録できるわけです。 データベースプラグインはちょっとばかり変則的です。それは、二つの機能をきちんと分離 しないからです。 logオプションはlog機能に付属し、、alertオプションはalert機能に付属します。 つまり、実際には、dbプラグインがalertモードにあるときにはalertルールからの出力 だけを受け付け、一方、logモードのときには、ログルールとアラートルールの両方から 出力を受け付けます。 4.20 ルール キーワードはOR扱いか、AND扱いか Snortマニュアルの2.1章より: ルールを構成する要素のすべては、採択されるルール動作に対して整合している必要が あります。両方が採択される場合は、複数の要素が論理的なANDステートメントを構成 すると考えられます。同時に、snortルール ライブラリ ファイル内のさまざまな ルールは、大きな論理的ORステートメントを構成すると考えられます。 4.21 snortはMACアドレスによるルールによってトリガ可能か? まったくできないわけではありません。Snortは、パケット内のMACアドレスや、その他の L2情報のログを取っています。arpwatch(arpspoofですね)プリプロセッサは、MAC アドレスの変更によって目標を監視する事ができます。しかし、L2情報が引き金と なるルールの機能はありません。content検索キーワードとdepth、offcetキーワード はL3ペイロードから開始(適用)されますが、実際に巨大なオフセットの使用を試した 事はありません :-)。 (訳注: ちょっとわかりにくいので言い換えておきます。arpspoofプリプロセッサによって、 MACアドレスの検査はできるのですが、ルールベースはすべてL3情報にのみ適用され、 L2レベルの情報を扱う事はできません。という事です。) 4.22 ルールを無効にするには ルールは、snort.conf内にインクルードされたファイルからコールされます。 snort.confによって、snortは指定されたルール ファイルへのパスをたどり、初期化の 段階でルール ファイルをロードします。ルールはまた、snort.confに直接 インクルードすることもできます。複数のルール リスト内にある、ひとつのルール だけを無効にしたい場合は、以下のテクニックの一つを利用できます: 1.ルールを削除してsnortを再度初期化する 2.ルール行の先頭に#を挿入してコメントアウトし、snortを再起動する 3.local.rules内(もしくは好きなところ)の同じプロパティにpassルールを書いて-o オプション付でsnortを再起動する 4.23 複数のあるホスト以外の別なアドレスを定義するには? !オペレータを使ってください。つまり、以下のようになります: var EXTERNAL_NET !$HOME_NET 否定オペレータはリスト内部では動きません。したがって、以下の場合は動きません: var EXTERNAL_NET [!192.168.40.0/24,!10.14.0.0/16] しかし、以下の場合は動きます: var EXTERNAL_NET ![192.168.40.0/24,10.14.0.0/16] 4.24 新たにルールを追加したり、いくつかのルールをコメント アウトしたあと、 snortをリロードするにはどうすればいい? 通常は、kill -HUPでうまく動きます。しかし、chroot設定内で動作している場合は、 このやり方では期待通りにはいきません(FAQ 6.19を参照)。chrootの内部で動作させて いる場合は、snortプロセスをkillしたあと、再起動します。 4.25 distanceとwithinキーワードは、どこから動作して、ルール内のコンテンツ サーチを修正しますか? distanceキーワードを使うと、最も最近の一致からの相対的なオフセットとなるため、 基本的には、ワイルドカード的なメカニズムで動作します。また、新しいwithinキー ワードを使うと、snortが停止する前の、distanceの最後からどの程度の深さにするか 制限することができます。 4.26 ルール内のポートのリストを指定するには? それは不可能です。X:Yという表記によって、XとYの間のポートの範囲を指定すること ができます。ポート範囲に関しては、ユーザーマニュアルを参照してください。 4.27 ポート80以外で動作しているwebサーバをプロテクトするにはどうしたらいいで しょうか? 可能です。ごちゃごちゃしていますが、うまくいきます。新しいルールでは$HTTP_PORTS 変数を使っているので、単にその変数をリセットし、他のポートのためにルールを再読み 込みするだけです。 (訳注: わかりにくいので書き換えると、一度$HTTP_PORTSを指定し、ルールを読み込んだ後で、 再び$HTTP_PORTSに違うポートを指定し、もう一度ルールを読み込むよう、snort.confに 書けばよい、ということ。) たとえば以下のようになります: var HTTP_PORTS 80 include web.rules var HTTP_PORTS 8080 include web.rules 4.28 "spp:possible EVASIVE RST detection"というアラートをオフにするにはどう したいい? snort.conf中で、stream4に、"disable_evation_alerts”という引数を渡します。 4.29 ルールが衝突しないような、プライベートなSID番号範囲はありますか? あります。プライベートSIDは1000000から始まります。 4.30 アドレス リスト、変数、ルールは、どの程度の長さまで許されますか? 拡張以降、snortパーサには、変数とルールの制限が8キロ分あります。しかし、実際 にはこれは大きな制限事項にはなりません。 :-) (snortの(ルール)パーサには、変数とルールを展開した「後の」サイズが8Kという 制限があります。実際にはこれは大きな制限事項にはなりませんけどね。 :-)、って 感じかな?) 5. 気の利いた機能 5.1 Barnyard について話しているのを聞きました。何ですか? Barnyard は snort 用の出力システムです。Snort は ``unified'' と呼ばれる特別な バイナリを生成します。Barnyard はこのファイルを読み、そしてデータベース バックエンドへデータを送り直します。 データベース出力プラグインと異なり、Barnyardはデータベースへのアラートの 送信の失敗を検知し、送信を停止します。そして再びデータベースが接続を許可できる ようになったとき、アラートを送信する事を再開します。 5.2 どうすれば snort のログをレポートに処理できますか? 1. Barnyard(5.1) は詳細分析用のデータベースへの出力を含む多くのフォーマットへ unified 出力ファイルを処理するために使用することができます。 2. SnortSnarf、これはアラートを見やすくするために、Snort のアラートから HTML ファイルを作成するツールです。 http://www.silicondefense.com/snortsnarf/ 3. もしデータベースでログをとるようにセッティングしたい場合は ACID を試して みてください。 現在のACIDの機能を説明したドキュメントは以下にあります。 http://www.cert.org/kb/acid/ 4. Cerebus を使用すれば、個別のデータベースなしで直接 unified 出力ファイルの 表示/関連の処理をする事が出来ます。 5. シンプルなログを表示する為の、GUI フロントエンドとしては + HenWen (OSX) http://homepage.mac.com/nickzman http://home.attbi.com/~rickzman/software/HenWen1.0.sit.bin + IDS Center (Win32) http://www.packx.net/ + Puresecure (UNIX and Win32) - 以前は demarc として知られていた。 http://www.demarc.com/downloads/puresecure/ + SnortCenter (UNIX and Win32) http://users.pandora.be/larc/ + IDS Policy Manager (Win32) http://www.activeworx.com/IDSPM/ 5.3 どうすれば複数のデータベースや出力プラグインにログを取れますか? unified 出力ファイルを barnyard を通して、2つのデータベースに分離する。 あるいは・・・ 複数のアウトプットプラグインを用いることで冗長性を持たせることができます。 以下に例を示します。 複数のデータベースプラグイン(を使用する)具体例: output log_database: mysql, dbname=snort host=localhost user=xyz output log_database: mysql, dbname=snort host=remote.loghost.com user=xyz リモートのデータベースとローカルに tcpdump で保存する output log_database: mysql, dbname=snort host=remote.loghost.com user=xyz output log_tcpdump: /var/log/snort.tcpdump そして、tcpdump ファイルを Snort を使って再生し、データベースを再び作ることが できます。 警告:ログパケットを単に再生することは、状態依存するプリプロセッサのうちの いくつかが起動しないかもしれません。 5.4 どうすればイーサネットカードなしや他のコンピュータとつながっていないコンピ ュータで snort をテストできますか? 二つのダミーデバイス間をルーティングする必要があります。 modprobe -a dummy # (ダミーデバイスが使えるようカーネルが構築されている 必要があります) ifconfig dummy0 192.168.0.1 ifconfig dummy0:0 192.168.0.2 telnet 192.168.0.3 12345 二つ目の IPアドレスは1つ目と同じインターフェースに割り振り、例えば dummy1 や dummy2に割り振らず、アクセスをテストしたいアドレスはインターフェースに 割り振っていないものを使う事が重要です。Snortがプロミスキャスモードで通信 を傍受できるアドレスを使ってください。(HOME_NET=192.168.0.0/16) 5.5 どうすればsnortをWin32のサービスとして起動できますか? 1. すべてにおいて絶対パスを使用しなければいけません。すべてです。 コマンドライン、設定ファイルなどすべてです。 例:includeステートメントはフルパスを使う必要があります。 誤:"include scan-lib" 正:"include C:\snort\scan-lib" すべてのコマンドラインオプションはフルパスを使う必要があります。 誤:"snort.exe -l ./log" 正:"snort.exe -l C:\snort\log" 2. いつでもコマンドラインでログ保存ディレクトリを指定しなければなりません。 (-lを使います)もし指定しなかったら、サービスは起動せず、NT/2000において は約4分後にブートに失敗します。 3. サービスに関連する問題についてまだ心配することなしに、snort がコマンドライン から正しく起動する事を確かめます。期待したとおりのログ及び アラート出力を 生成するように、あなたの望んだコマンドライン パラメータで snort が動作する 事をテストする。この部分を動かすことができなければ、サービスとして snort が 奇跡的に動き始める希望をあまり持てません。 4. 一度正確にステップ3を動かせていれば、追加のパラメーター "/SERVICE /INSTALL" を含めるようにステップ3で使用したコマンドライン・パラメーターを修正して ください。 例えば、ステップ3のコマンドラインがこうだった場合 snort -i1 -lC:\snort\log -cC:\snort\snort.conf このように変更してください snort /SERVICE /INSTALL -i1 -lC:\snort\log -cC:\snort\snort.conf コマンド "snort /SERVICE /SHOW" の実行により、コマンドライン パラメーターが 正確に受け取られたことを確認してください。 5. コマンドの実行によりサービスを始めます。 net start snortsvc 注意 バージョン1.9(ビルド 228)、2.0(ビルド 50)、あるいは、はこれらより新しい バージョンでは、サービスを始めてから問題があれば、Win32 イベント ログ へ エントリーを追加します。 コマンドの実行によりサービスを止めます。 net stop snortsvc 6. サービスはコマンドの実行によりアンインストールすることができます。 snort /SERVICE /UNINSTALL 5.6 snort を使って ipfilter/ipfw ファイアウォールのルールを追加することは できますか? はい、追加ソフトが contrib ディレクトリにあります。しかし、このソフトは危険で あり、何をしようとしているかわかっていない人にはお勧めしません。 * SnortSam http://www.snortsam.net * さらに、inline-snort を見てもよい。 http://www.snort.org/dl/contrib/patches/snort-inline * Guardian は攻撃を検知するために snort を使用する perl スクリプトで、その後 それ以上の攻撃を拒否するために IPchains を使用します。 Guardian の ウェブ・ページで見つけることができます http://www.chaotic.org/~astevens/Guardian/index.html あるいは、ミラーを使用してもよい。 http://www.cyberwizards.com/~midnite/Guardian/index.html ただし、一つ警告しておきます。外部のバイナリを実行することはパフォーマンスに 制限を加えることになます。以下の注意を読んでください。 CHRISTOPHER CRAMER は書きました: 私は、これと同じ議論が以前に言及されたと確信します、しかしこれは真に悪い考 えのように感じます。万が一何が起こっているか悪い人間が悟り、DoS 攻撃として あなたの防御方法を利用すれば、どうしますか。詐称したIP アドレスを 持つ一連のパケットを送り始めるだけなのです。 私はあなたのサイトに侵入する事にはもはや興味を持っていませんが、あなたの 生活を地獄に落とす事にはすこし興味があります。私は、あなたからの返答の結果による データに気を使う必要もありません。(要はパケットの応答なんてどうでもいいって事?) 私がやらなければならないのは、あなたがもはや接続する事ができなくなるであろうIP アドレスのリストについて進めていくだけなのです。 翌朝にあなたが来たとき、あなたはもはや世界に接続する事ができないことを知ります。 単なる個人的な意見です。 Danger Will Robinson : 一般通念で、オート・ブロッキングが本質的に危険である と言えます。 しかしながら、テクノロジーのとんでもない先端にいることが好きな人のために (また、スキャン ログの処理 と ファイアウォール 処理 コマンドを 分離すること はとてもいい方法に聞こえます…) 忘れずに排除リストに取り込んでください、ルート サーバーのような重要なサイト、 他の重要なdnsサーバー(あなたのもの、およびあなたのユーザのための重要なサイト)、 また、一般的なホストでそれらが詐称された場合には DoS 状態であることに関する電話を 受け取りたくありません - たいてい困ったことに、休暇の初日におこります… (つまり、想像してください "危機 : CEO が彼の好きな redlite.org ゲームに接続 することができません…あなたはカリブ海から出来るだけ早く飛行機で戻らなければ なりません…") 5.7 snort を使って攻撃トラフィックをブロックする最善の方法は何ですか? snort-inline > hogwash >> SnortSAM|Guardian >> flexresp 5.8 snort が "react" キーワードについてエラーを出力するのですが... --enable-flexresp つきで configureを再実行し、リビルド、再インストールして ください。 5.9 どうすれば snort からアラートを Eメールで受け取ることができるように なりますか? できません。そのような少し役立つようにしすぎるプロセスがsnortをとても遅くして しまいます。代わりにsyslogに記録して、プレインテキストのログを解析するswatchか logsurferを使ってください。 logsurferのドキュメントによると、snortとlogsurferで対処する事で受け取れるでしょう。 http://www.obfuscation.org/emf/logsurfer/snort.txt JASON HAAR がEメール アラートの swatch (3.1ベータ)の設定例を提供しています。 http://www.theadamsfamily.net/~erek/snort/snort-swatch.conf.txt こちらに、いくつかの swatch のドキュメントがあります。 * http://www.oit.ucsb.edu/~eta/swatch/ * http://www.stanford.edu/~atkins/swatch * http://rr.sans.org/sysadmin/swatch.php * http://www.enteract.com/~lspitz/swatch.html * http://www.cert.org/security-improvement/implementations/i042.01.html Win32で動作するIDS Center (FAQ 5参照) もまたEメール アラートを出力します。 5.10 どうすれば特定の種類のトラフィックを記録し、syslog にアラートを送ること ができますか? snort.confに追加する例を示します: ruletype redalert { type alert output alert_syslog: LOG_LOCAL2 output database: alert, postgresql, user=user dbname=snort password=pwd } local.rules を開いて、こんな風に書いてみてください。 redalert tcp any any -> any any (msg:"REDRUM REDRUM"; content:"redalerttest") そして telnet で"redalerttest"と入力してみてください。すぐに両方に記録されます。 5.11 アラートがあがったとき、snort が外部プログラムを起動することは可能ですか? メインの IDS ループ内から別のプログラムを呼び出すことは、一般に悪い考えです。 何かを起動するまで待っている間 IDS は止まってしまうので信頼性を低下させますし、 そもそもパケットが処理されるのを待っているタイミングだとパケットロスを 招いてしまいます。 特に、今すぐ「うわ。僕、ちょっと席を外そうと思ってるんだけど」って ロックステディと、Windowsのタイムスライス(CPU割当時間)は全然矛盾しないでしょ (そりゃ皮肉だけど。ごめん) 他の方法を考えた方がいいです。Windows ではプロセスの呼び出しは高コストです。 IDS のタスクをできる限り中断させずぶん回してパケットを効率的に処理させ、 プロセス生成のペナルティをさけるようにした方がいいと個人的には思います。 特に、*nix に比べ、プロセス生成が非常に重い Windows では。 外部プロセスについてもです。前述の理由により、終始起きているプロセスの 方が、アラートごとに起きてくるよりももっとうまく処理できるでしょう。 よりより代理方法は swatch か logcheck で調べることです。 さらに UNIX に不慣れな人々のために、アラートをシスログにロギングして、 "tail -f /var/log/messages" を実行して、見ていてもいいかもしれません。 5.12 どうすれば HTTP の URL や SMTP のトラフィックを snort を使って記録する ことができるのですか? snort で出来ます、しかし Dug Song の dsniff パッケージの mailsnarf と urlsnarf を使えばより早くみつけられるかもしれない。利用可能な Dsniff はこちらから http://www.monkey.org/~dugsong/dsniff/ dsniffのwin32実装はこちらから。 http://www.datanerds.net/~mike/dsniff.html 5.13 どうすれば ACID のように snort の DB から snort のアーカイブ用 DB に データを移すことができますか? snort 配布 (snort_archdb-90a.tar.gz) のcontrib ディレクトリにある perl スクリプト snort_archdb.pl を使用してください。 5.14 記録されたソースのアドレスやそれがどこから来るのかをもっと調べるための リソースは何ですか? * http://www.arin.org/ * http://www.caida.org/tools/utilities/netgeo/ * http://netgeo.caida.org/perl/netgeo.cgi * http://standards.ieee.org/regauth/oui/oui.txt * http://www.codito.de/manufactor_hash * http://coffer.com/mac_find/ * http://www.idefense.com/Intell/CI022702.html * http://www.idefense.com/excelfiles/All.zip さらに "dig" も試してみてください。 5.15 どうすればこのトラフィックを理解し、IDS のアラート分析をすることができる でしょうか? 1. IP、TCPおよびUDPのいくつかの基本を理解する必要があるでしょう。宛先アドレス、 送信元アドレス、一般的なポート番号、TCPのSYN、FIN、そしてRSTが意味するものなど、 に相当する事です。インターネットでマルチインターフェースルータをうまく設定して 動かすために必要となる、基本的な知識と同様なものです。もっとも、ルータの文法を 知る必要はありませんけれど。 いくつかの実用的なオンライン リファレンス: + 本当の基礎 "intro to TCP/IP" http://pclt.cis.yale.edu/pclt/COMM/TCPIP.HTM + 適度に見る TCP/IP FAQ: http://www.itprc.com/tcpipfaq/default.htm + ファイアウォール、DMZ 等の基礎 http://www.ibiblio.org/pub/Linux/docs/HOWTO/other-formats/html_single/ Firewall-HOWTO.html 2. ネットワークの攻撃がどのように行われるかについてのいくつかの基本を理解する必要 があるでしょう。私はAlephoneの「Smashing the Stack for fun and profit」に目を通 す事を推奨します。深く理解する必要はありませんが、これを簡単に読んでおくことは 攻撃の際何が生じるのかについての事項を理解するための基礎として役立ちますし、何を 捜すべきなのかについてよりよい理解をもたらします。 http://www.insecure.org/stf/smashstack.txt 3. 安全なシステムに役立つ有用なガイド、このようなもの http://www.robertgraham.com/pubs/firewall-seen.html 4. インターネットサーバの基本(つまり:DNSとは、HTTP、FTP、SMTPなどのために)を 理解する必要があるでしょう。そのうちのほとんどはここに言われた様々な他の リファレンスでカバーされるべきです。 5. ネットワークの境界線で一般的に見られるトラフィック パターンの載った 素晴らしいリファレンス "oddball"はさらにとても有用です。 http://www.robertgraham.com/pubs/firewall-seen.html 6. さらに、"推奨された情報" セクションを見てください(FAQ 1.4を参照)。 5.16 どうすれば記録されたパケットの詳細について調査できますか? もし、unified ロギングを使用しているなら、Barnyard を使えます。(FAQ 5.1参照) あるいは、unified ログを Dragos が書いた pcap コンバータへ http://dragos.com/logtopcap.c その後、どちらかでこれらのpcapファイルの分析によりにパケット内容の付加的な 解読ができます。 * Tcpdump - http://www.tcpdump.org * Ethereal - http://www.ethereal.com 6 問題 6.1 snort にバグを見つけたようです、どうすればいいですか? いくつかの診断情報を入手し、"snort-users"(http://lists.sourceforge.net/lists/ listinfo/snort-users)に投稿して下さい。診断情報を入手するには snort を コンパイルするさいに以下のようにして下さい。: * []make clean; make CFLAGS=-ggdb または * []make clean; make "CFLAGS=-ggdb -DDEBUG" coredump をたどります * []gdb /path/to/snort /path/to/snort/core gdb> where gdb> bt gdb> print \$varname, varname, \$\$varname etc.. また、もしコアファイルが作成されなかった場合次のように snort を起動してださい * []gdb snort gdb> run snort\_args\_go\_here その後、クラッシュした際は * []gdb> where gdb> bt gdb> print \$varname, varname, \$\$varname etc.. 6.2 SMB アラートが動きません、何か間違ってますか? "./configure" を走らせた際に "-enable-smbalerts" を加えたかどうか確認して 下さい。 6.3 snort が "Garbage Packet with Null Pointer discarded!" とメッセージを 出します。はて? これはデフラグメンテーションプリプロセッサの初期バージョンに含まれる過去の バグにより引き起こされる内部診断情報です。snort の最新バージョンにアップ グレードして下さい。 6.4 snort が "Ran Out Of Space" とメッセージを出します。なぜ? これはデフラグメンテーションプリプロセッサが 32MB の静的割り当て領域の限界 に達したという内部診断情報です。 Dragosに伝えて下さい。 6.5 長期の作業を行う際に、ACID の DB がタイムアウトしてしまいます (e.g 多くのアラートを削除する時など) PHP にはスクリプトが実行できる長さを制限する内部変数セットがあります。 それは不完全なコードが無制限に実行されることを防ぎます。タイムアウトの値を 変更するには 'php.ini' 内にある 'max_execution_time' を変更して下さい。 6.6 なぜACIDはセンサーの番号を変えてしまうのですか?どうしたら一定の値に固定 できますか? op_acid_db.c において: * []/* if sensor id == 0, then we attempt attempt to determine it dynamically */ if(data-> sensor_id == 0) { data->sensor_id = AcidDbGetSensorId(data); } そして、AcidDbGetSensorId は次のようにします: * []"SELECT sid FROM sensor WHERE hostname='%s' AND interface='%s' " "AND filter='%s' AND detail='%u' AND encoding='0'", pv.hostname, pv.interface, pv.filter, op_data->detail) もしセンサーの反応を得たいならば、sensor_id を試用します。もしそうでないなら 新しいセンサーを導入します。一貫性を保つために、hostname / interface / filter そして詳細は変更しないで下さい。 6.7 なぜ snort は "Packet loss statistics are unavailable under Linux" と報告して くるのですか? Linux の IP スタックはパケットロスの状態を報告しません。これはおそらく libpcat の新しいバージョンにおいて最新の kernel 2.4+ では修正されるでしょう。 上位の kernel および libpcap では現在機能しています。 6.8 /var/log/snort ディレクトリが肥大化するのですが… 以下のファイル圧縮スクリプトを試して下さい。 * []#!/bin/sh # # Logfile rotation script for snort writen by jameso@elwood.net. # # このスクリプトはかなり基本的な物です。いくつかの設定によって開始されます。 # その日のログファイルをローテートさせ、電子メールで記録送られます。 # 一週間分の無圧縮ログの保持や、また、全てのログを tgz 圧縮にもできます。 # それらは毎夜深夜に行われます。 # このスクリプトは全てのログやルールセットなどが置かれている基本ディレクトリ # を想定しています。サブディレクトリに関しても変数の設定により範囲に含めます。 # # このスクリプトで注意しておくことは、スクリプトが 12 毎夜で動作することです。 # よって、ディレクトリ情報の日付変数が動作によ正確な日付としてマイナス 1 日 # にしたいです。日付ログのディレクトリを作成したら、ログファイルを今日の日付け # のディレクトリへ移動します。同時に、何事もなくsnort を再起動します。 # そして圧縮されてない一週間以上前のログを削除します。 # そして、今日圧縮されたログとアーカイブを保管し、メールを送信します。 # # snort がインストールされた基本ディレクトリの定義 snortbase=/usr/snort # その他の変数の定義 # logdir - ログの保管場所 # oldlogs - .tgz 形式でアーカイブしたい場所 # weeklogs - 圧縮されてない一週間分のログファイルの場所 # dirdate - その日の日付形式 - Month - Day - Year format # olddirdate - その日と同じ形式での一週間前のログディレクトリの場所 logdir=$snortbase/log oldlogs=$snortbase/oldlogs weeklogs=$snortbase/weeklogs # このスクリプトを最初に書いた時、 BSD 環境で走らせただけでした。 # これは間違いで、 BSD 環境は日付コマンドを簡単に過去に戻せました。 # いくつかの環境ではこの機能は持っていません、よって日付の部分をここで # 変更します # 変更方法は古い方法ですが、清浄です、そして、新しく加えた方法は汎用性が # あります。 # だれかに問題があった場合、修正したいと思うので修正点をしらせて下さい。 # システム変数は BSD または他の物でも、変更しないと行けません。 # もし "-v" フラグをサポートしているなら BSD に設定して下さい。 # 違うのならば他の物に設定して下さい。 system=bsd if [ $system = bsd ] then dirdate=`date -v -1d "+%m-%d-%y"` olddirdate=`date -v -8d "+%m-%d-%y"` elif [ $system = other ] month=`date "+%m"` yesterday=`expr \`date "+%d"\` - 1` eightday=`expr \`date "+%d"\` - 8` year=`date "+%y"` dirdate=$month-$yesterday-$year olddirdate=$month-$eightday-$year fi # 今日のログ用のディレクトリを作成。 if [ ! -d $weeklogs/$dirdate ] then mkdir $weeklogs/$dirdate fi # ログファイルを今日付のディレクトリへ移動して下さい。 # これは再帰的にすぐ処理されます、なぜなら多数のログファイルは # "mv *" コマンドを用いて移動するだろうからです。 # これより良い方法はまだしりません。 for logitem in `ls $logdir` ; do mv $logdir/$logitem $weeklogs/$dirdate done # snort を Kill し、ログファイルを移動したら再起動する。 kill `cat /var/run/snort_fxp0.pid` # Restart snort in the correct way for you /usr/local/bin/snort -i fxp0 -d -D -h homeiprange/28 -l /usr/snort/log \ -c /usr/snort/etc/08292k.rules > /dev/null 2>&1 # 一週間以上前の無圧縮ログファイルは削除。 if [ -d $weeklogs/$olddirdate ] then rm -r $weeklogs/$olddirdate fi # 希望する限りログファイルを圧縮し保存して下さい。 # これは sub-shell によって実行されます、なぜなら、ディレクトリを変更して # 現在のシェルにおいてスクリプトを動作させることは好まないからです。 (cd $weeklogs; tar zcvf $oldlogs/$dirdate.tgz $dirdate > /dev/null 2>&1) # 今日の分のログファイルをメールで送信。 cat $weeklogs/$dirdate/snort.alert | mail -s "Snort logs" you@domain.com cat $weeklogs/$dirdate/snort_portscan.log | mail -s "Snort portscan logs" you@do main.com 6.9 なぜ ACID でアラートを削除しようとすると 'error deleting alert' という メッセージが発生するのですか? 最もありそうなのは ACID を設定する DB ユーザが十分な権限を持っていないことに よります。データベースにアラートを記録する (INSERT, SELECT) 権利に加えて DELETE もまた必要です。 この権限に関係する問題はデータベースに手動で列を挿入し、それを削除しようと することで確認できます。 1. ACID 内で使用するのと同じ証明書 (i.e. ユーザネーム、パスワード)を持った MySQL にログインします。 mysql -u -p 2. イベントテーブルにテスト列を挿入します。 mysql> INSERT INTO event (sid, cid, signature, timestamp) VALUES (1,1000000, "test", "0"); (これはまだイベントID=1000000の列を使っていない事を仮定しています。もし使っている なら、ほかのID番号を選んでください。) 3. 新規に挿入された列を削除します: mysql> DELETE FROM event WHERE sid=1 AND cid=10000000; もし削除することができなければ、これは権限の問題であると確認できます。 mysql に root として再ログインし、GRANT コマンド(DELETE の権限を与える)を ACID の DB ユーザにして下さい。 GRANT DELETE on snort.* to acid@localhost (これは自身のアラートデータベースを 'snort'、ユーザネームを 'acid'、そして 'localhost' に記録すると仮定しています) 6.10 Lynx 上では ACID は壊れてみえます これは既に知られている問題です。Lynx は URL に付け足されたいくつかの form 引数を台無しにしてしまいます。解決策が調査されてますがネットスケープやオペラ、 IEを使用してみて下さい。 6.11 'snort [pid] uses obsolete (PF_INET, SOCK_PACKET)' という警告がでます、 何が悪いのでしょうか? 最近の Linux kernel に対して古い libpcap を使用しているからです。 Kernel が SOCK_PACKET ソケットをサポートしている限り問題にはならないでしょう。しかしながら、 警告メッセージを取り除いてしまうのには最近の libpcap のバージョンにアップグレード するべきです。(www.tcpdump.org からの取得を推奨します) 6.12 HPUX において lan0 デバイスを使用するとすると open: recv_ack: promisc_phys: Invalid argument とでます ほかに DLPI サービスを使用しているプログラムが走っていることによります。 HP-UX の実装は Linux とは違って 1つ以上の lipcap プログラムが一度に走ること を許可していません。(from snort.c) 6.13 十分なディスク容量があるのに snort が 'can not create file' エラーで 死んでしまいます。何が悪いのでしょうか? 自由に使用できる inodes を使いきってしまったようです、これは現在の パーティション上にはファイルを作成することができないということです。明らかな 解決方は rm とすることです。 ;) 6.14 Windowsでsnortを使うとき、"OpenPcap() error upon startup: ERROR: OpenPcap() device open: Error opening adapter"とエラーががでる。間違っていますか? Winpcap がインストールされてないか、相性が合わないバージョンを使用しているか でしょう。最新バージョンにアップグレードしてください (01/03/17 時点で 2.3)。 http://netgroup-serv.polito.it/winpcap/ より入手可能です。または SMP問題による ものかもしれません FAQ Q:### を見て下さい。 6.15 Snort がデータベースに記録してくれません snort がデータベースへの記録を失敗している原因はいくつか考えられます。 以下の項目をチェックしてみて下さい: 1. コンフィグレーションファイル内でデータベースプラグインの設定をしていない。 2. 古いデータベース概念を使用している、さらに ソース tarball の /contrib ディレクトリより作成スクリブトを走らせてアップデートするべきです。 3. コンフィグレーションファイルを上書きするコマンドラインオプションを使用している。 これは多くの場合 -A や -s です。補足: syslog に同様に記録しようとしている ならばコマンドラインよりむしろコンフィグレーションファイルで明示的に指定しましょう。 4. データベースコンフィグレーション自身の問題です。指定したユーザの権限が正確 かどうかデータベースがきちんと稼働しているかどうか確かめて下さい。 6.16 ポートスキャンがデータベースに記録されない 出力機能を 'log' ではなく 'alert' に変更する必要があります。ポートスキャン プリプロセッサが出力プラグイン呼び出すのは 'log' ではなく'alert' となっています。 output database: alert, mysql, user=snort dbname=snort host=localhost 6.17 Snort が syslog に記録しません snort が syslog への記録を失敗している原因はいくつか考えられます。 以下の項目をチェックしてみて下さい: * コンフィグレーションファイルを上書きするコマンドラインオプションを使用しています。 多くの場合それは -A です。 * もしかしたら間違った場所に記録しているかもしれません。syslog が正しく設定 されているか確かめて下さい。 6.18 $DNS_SERVERS 変数に代入している IP アドレスからのポートスキャンによる spp_portscan メッセージが大量に溢れています /32 ネットマスクをそれらのアドレスに加えて下さい: var DNS_SERVERS [xxx.xx.0.3/32,xxx.xxx.0.2/32] そして、 $DNS_SERVERS 変数が portscan-ignorehosts 行に加えられているか確かめて 下さい: preprocessor portscan-ignorehosts: $DNS_SERVERS 6.19 なぜ chroot した snort は SIGHUP を送ると死んでしまうのか パーミッションに関する問題です、代替手段で snort を再起動させます。 しかし長文な答えは次のようになります: execv(2) を発行することによって スクラッチより再起動させます。これは chroot した snort に HUP を送る奇妙な 副作用があり、再帰的になります。たとえば /snort を chroot し、snort には / となるようにします。snort を HUP します。 Snort は /snort/snort を / とするでしょう。 いいかえると、牢獄の中にさらにディレクトリを作るということです。HUP を4回送ると / snort/snort/snort/snortとなるでしょう。 6.20 Snort がクラッシュしました、どのように再起動したらよいでしょうか? 以下に示す二つのシェルスクリプトか deamontools (deamontools のウェブサイトを 参照)を試してみて下さい。 * []#!/bin/sh #snorthup: Snort Restarter and Crash Logger #(dr@kyx..net with help from kmaxwell@superpages.com) $conf = "snort.conf" for $IFACE in fxp0 fxp1 do if [ -f /var/run/snort_$IFACE.pid ]; then if ! ps -p `cat /var/run/snort_$IFACE.pid` > /dev/null ; then /usr/bin/logger -p user.notice snorthup: removing bogus pidfile /usr/bin/ logger -p user.notice snorthup: restarting absentee snort o n $IFACE with conf file $i rm -f /var/run/snort_$IFACE.pid /usr/local/bin/snort -D -c $conf -i $IFACE fi; else /usr/bin/ logger -p user.notice snorthup: restarting snort on $IFACE with conf file $conf /usr/local/bin/snort -D -c $conf -i $IFACE fi done もう一方: * []#!/bin/ksh # snortstartd: Snort (Re)Starter # Dom De Vitto (dom@devitto..com) # (original idea by dr@kyx..net & kmaxwell@superpages.com) # # 注意:CONF と INTERFACE の権利を手にいれたほうがいい # または、このスクリプトは snort を実行し続けようとするでしょう。 # Path to echo, sed, test, ps, grep, logger, rm, and sleep. PATH=$PATH:/usr/bin:/usr/local/bin ; export PATH # conf ファイルの場所 CONF="/usr/local/share/examples/snort/snort.conf" # どのインターフェースにおいて Snort をどうさせるか e.g.: INTERFACES="hme0 hme1" # 何秒間隔でチェックするか: CHECKEVERY=5 # Snort への絶対パス: SNORTBINARY=/usr/local/bin/snort while :; do for INT in $INTERFACES do GREPSTRING="`echo $SNORTBINARY -N -D -c $CONF -i $INT|sed 's?\/?\\\/?g'`" PSCMDLINES=`(ps augxww 2>/dev/null||ps -ef 2>/dev/null) | grep "$GREPSTRING"|wc -l` if [ $PSCMDLINES = 0 ]; then logger -p user.notice -t "$0" "Starting Snort on $INT." $SNORTBINARY -N -D -c $CONF -i $INT 2>&1 > /dev/null fi done sleep $CHECKEVERY done 6.21 どうしてオートスイッチハブ上の10Mや100Mトラフィックを監視できないのですか? 基本的にはこれは設計上の機能であり、全てのオートスィッチングハブはこのように 振舞います。すべての100Mbpsトラフィックを10Mbps CSMA/CDに詰め込むことはできないと いうだけの理由です。この問題に対して私が使っている解決策の一つは新しく安い4ポート のスイッチです。すべての10Mbpsをhub/switch等々につなぎ、そして監視に用いている 100Mbpsのhubに経路を向けますが、その際、基本的に10と100の間を取り持つための アダプタとして働く安いスイッチを間に入れます。 (訳注:フローコントロールをしてやるために間にスイッチを入れる、といった 意味合いかと。) そのような「機能」を有していないhubの悪い事は、10btデバイスをサポートするため に、もしひとつもしくは複数の10bt専用デバイスを接続した場合、hub全体の速度を落とし て10btに絞り込んでしまう。私はこの振る舞い(そしてこの証明のため帯域テストを実施 した)を古い3com office connetct 10/100hubで見た(より新しいものは2つのhubを 切り替える)。そう、言いたいポイントは、古いhabuはスイッチングの能力を持たず、 かつどのポートのトラフィックがどこに行くのかをサポートしない(スイッチではない= ARPテーブルを持たない)ため、それらは帯域を絞らなければならないのだ。 hubとスイッチはイーサネットチップセット上には大量の記憶領域を持たな い。それゆえ、あらゆる100->10の能力を持つ非レイヤー3スイッチは、チップセットが 入ってくるパケットを床に落とす前の少ない量のトラフィックであれば扱う事ができる。 それはしかし再送信のタイムアウトとエンドノードにおける再送信を犠牲にしている、 絞られた帯域であると考える事ができるだろう。 箱がbackplaneと複数のカードそしてネットワーク管理機構を持つならば、少なく とも小さな突発的トラフィックが生じたことにより取りこぼしたパケットを保持する ために作動する追加バッファを製造者(製造品かな?)が持っている可能性はとても 高い。 最も総合的なことで、もし箱が100の"全二重(full-duplex)"をサポートしているな ら、それはスイッチである(製造者にかかわらずこう呼ばれる)。もし、それが100->10を サポートしているなら五分五分の可能性で箱はMACアドレスの認識機能をサポートしている。 もし箱が単に10->10や100->100のみサポートしているならば、それはMACアドレスを認識 しない可能性が高く、それゆえhubのような機能を持つ。 多くのhubは異なるbackplaneを持っている。あるものは10であり、またあるものは100 であったりします。 定義の観点では、10、100であろうと、hubセグメントはひとつのブロードキャスト/ コリジョンドメインです。ブリッジを介してなかったり、レイヤー3の機能でルーティング しているセグメント間の"どのような"トラフィックも見る事はないでしょう。 スイッチ環境において、通常それぞれのポートが個別のコリジョンドメインですが、 ひとつの大きなブロードキャストドメインでもあります。VLANは分割されたブロード キャストドメインを作成する事ができ、基本的にはバックプレーン内のルータに 接続する事でVLANの間をワイヤスピードでルーティングできる、というレイヤー3機能を 構築できます。 スイッチを多くのポートを持つブリッジと考えましょう(まさにそのとおりです)。 いくつかのスイッチは、ポートミラーリングかスパンポートをサポートしています。 スイッチ環境においてフレームを"盗聴"したいとき(ブロードキャスト/マルチキャスト 以上(以外といったほうがいいかな?)を、です)、ユニキャストトラフィック(例えば telnet、http)を"見る"事ができる必要があります。興味を持つデバイスのポートから 解析するデバイスが刺さっているポートにトラフィックをミラーするようにポートを 設定しましょう。 こうしなければユニキャストの通話を見る事ができません。なぜなら、トラフィックは バックプレーン中で"スイッチされ"ており、ポート1のPCがポート2のサーバにデータを 送信し他のポートはそのトラフィックを受け取らないからです。もしポート2のサーバが ブロードキャストまたはマルチキャストすると、情報はすべてのポートに溢れてしまいます。 (マルチキャストはリッスンしているステーションのポートにのみトラフィックが届くよう、 いくつかのスイッチをコントロールできます。すべてのスイッチがこの機能を持っている わけではありません。 相互連結(Interconnections)に関する優れた著書は Radia Perlman によって 書かれています。(Bridge and Routers)。 補足警告:スイッチ化されたポートで全二重を扱う場合、タップ(tap)だけが救い でしょう。ShomitiのTAPを100MB FDポートに使用し、双方向のトラフィックを捕らえる ために二つのsnortを使用することでうまく使用できます。 ポートミラーリングはこのケースではうまく働きません。 6.22 Snort をインストールしようとすると: "bad interpreter: No such file or directory" といわれる 通常、このエラーはWindowsマシン上でファイルを編集する事によって生じます。 しばしば、./configureの段階で見られます。configureスクリプトは/bin/sh シェルを インタープリターとして捜すでしょう。もし/bin/shが存在しないならばこのエラーを 受けるでしょう。configureの最初の行にある、#!に続く文字列が正確かどうかチェック してください。 Windowsマシン上でファイルを編集した場合、しばしば各行の最後にCR/LF(VM)を 付け加えてしまいます。つまり、#!/bin/shが#!/bin/shVMになり、そしてctrl-V/ctrl-M が特殊文字としてほとんどのエディタのデフォルトで隠されており、問題を見つけるのは 非常に困難なよう(VM文字を)作る事ができます。UNIXライクなマシンが好まない余計な CR文字を取り除くには、単にdos2unixコマンドを実行します。 * []dos2unix もし OS に dos2unix がなければ次のようにして下さい: * []cat | tr -d ``\r'' > 6.23 Win32においてどのインターフェースもみれません インターフェースリストに何も見ることができない理由は WinPcap の問題です。 WinPcapの以前のバージョンだと 1K バッファーしかありません、もし多くのインターフェー スを持っている場合 (i.e 10+) オーバーフローしてしまいます。最新の WinPcap の バージョンでは 8Kバッファーに変更されました。問題を解決するために現在配布中のsnort ではすでに新しいWinPcapライブラリにリンクされているはずです。もっと新しいsnortのビルド を入手してみてください。 6.24 Win32で動きません。どうすればこの問題が snort か WinPcap によるものか分かりますか WinDump が WinPcap で動作するか見て下さい。これはどちらの構成要素が間違って いるか分離するのを助けます。 6.25 新しいルールセットをダウンロードしましたが、 snort がそのルールに関してエラーをだします 最初に、snort のバージョンに合った正しいルールセットをダウンロードしたか確かめて 下さい。Snort.org は一般に現在リリースされている snort に対してのルールセットと 同様に開発ブランチ向けと時々以前のバージョンの snort 向けのルールを用意します。 これは一般に"unknown keyword in rule" といったエラーになります。 もしsnortのバージョンに一致したルールを持っているならばそのsnortルールの tar ballはsnort.confファイルを含んでいることを承知しておいてください。 入手したルールに含まれるsnort.confファイルは、よりよいルールセットのサポートの ため、時々新しい.rulesファイルが付け加えられていたり、変数が追加されたりします。 新しいルールセットをダウンロードしたら新しいinclude文や変数が追加されていない か、少なくともうまく動かなかった際に助言を求めるかどうかを知るために、含まれている snort.confを簡単に見ておくべきでしょう。一般的にこの場合、ルールにおいて未定義な 何かしらを示すメッセージを得るかもしれません。 6.26 どうすれば ACID と MySQL で速度があがりますか MySQL の二つの最適化が ACID faq にあるのでチェックしてみて下さい: http://www.andrew.cmu.edu/~rdanyliw/snort/acid_faq.html * テーブルの圧縮 非常に多くの削除を実行した後、"穴(holes)" が使用されている現在のファイルに 発生し全てのクエリーの速度を低下させるでしょう。次に示すシェルスクリプトは 全ての MySQL のテーブルを検査し、圧縮します。 + []for table in `echo show tables|mysql snort|tail +2` do echo optimize table $table|mysql snort done * インデックスの作成 要求されたインデックスのうちのいくつかは初期の MySQL 生成スクリプトの中では 作成されません。次のインデックスを付け加えることで著しく性能向上ができます: tcphdr.tcp_sport tcphdr.tcp_dport acid_ag_alert.ag_sid + acid_ag_alert.ag_cid MySQL は速くなりえます。 適切なインデックス付けを設定することが必要です。もし よい MySQL の参考書が必要なら Paul DuBois の本を挙げます。この本は今の所 MySQL hのバイブルでしょう。オライリーもまた最近 Monty と the MySQL AB チームに よって書かれた参考書を出版しました。 SHOW INDEX command によって索引が既にあるかどうか確かめられます。例えば tcphdr テーブルを確かめるには、次のようなコマンドを走らせて下さい: + []mysql> show index from tcphdr; +----+------+------+-------+-------+------+-------+-----+----+-----+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Comment | +----+------+------+-------+-------+------+-------+-----+----+-----+ | tcphdr | 0 | PRIMARY | 1 | sid | A | NULL | NULL | NULL | | | tcphdr | 0 | PRIMARY | 2 | cid | A | 2543146 | NULL | NULL | | | tcphdr | 1 | tcp_sport | 1 | tcp_sport | A | NULL | NULL | NULL | | | tcphdr | 1 | tcp_dport | 1 | tcp_dport | A | NULL | NULL | NULL | | | tcphdr | 1 | tcp_flags | 1 | tcp_flags | A | NULL | NULL | NULL | | +----+------+------+-------+-------+------+-------+-----+----+-----+ 5 rows in set (0.00 sec) この場合だと、 tcphdr.tcp_sport インデックスが 3 行目に、 tcphdr.tcp_dportが 4 行目にあります もし、インデックスを作成する必要があるなら次のコマンドを走らせて下さい: + []CREATE INDEX idx_tcp_sport ON tcphdr(tcp_sport); 複数のインデックスが作成されたので、次のコマンドを行って下さい: + []CREATE INDEX idx_cpd_sid_cid ON acid_ag_alert(ag_sid,ag_cid); テーブル構造をより詳細に見たければ、DESCRIBEコマンドを使用してもよく、それに テーブル・ネームを渡すことができます: + [] mysql> DESCRIBE tcphdr; +------+-----------+---+---+-----+----+ | Field | Type | Null | Key | Default | Extra | +------+-----------+---+---+-----+----+ | sid | int(10) unsigned | | PRI | 0 | | | cid | int(10) unsigned | | PRI | 0 | | | tcp_sport | smallint(5) unsigned | | MUL | 0 | | | tcp_dport | smallint(5) unsigned | | MUL | 0 | | | tcp_seq | int(10) unsigned | YES | | NULL | | | tcp_ack | int(10) unsigned | YES | | NULL | | | tcp_off | tinyint(3) unsigned | YES | | NULL | | | tcp_res | tinyint(3) unsigned | YES | | NULL | | | tcp_flags | tinyint(3) unsigned | | MUL | 0 | | | tcp_win | smallint(5) unsigned | YES | | NULL | | | tcp_csum | smallint(5) unsigned | YES | | NULL | | | tcp_urp | smallint(5) unsigned | YES | | NULL | | +------+-----------+---+---+-----+----+ 12 rows in set (0.02 sec) 6.27 なぜ多くの "SMTP RCPT TO overflow" アラートを受け取るのでしょう? これはSMTP サーバに 800 バイトのデータを含んだ TCP フレームが向かっていくことを 探すルールによるものです。もし連続送信された場合、どの電子メールでも簡単に引き 起こせます。SMTP コマンドを連続で送信することは、いくつかのコマンドライン行が正し いレスポンスを待たないで単一のパケットで送られることを可能にします。どんなよい高 価なメールサーバも連続送信を試すことができ、結果として単一の TCP フレームに一連 のコマンドラインが含まれます。それぞれは特に大きくもないですが、合計すると用意に 800 バイトの閾値を上回ります。 とくに、巨大な受信リストなどが当てはまるでしょう。 より多くの情報はこちらにあります: http://www.faqs.org/rfcs/rfc1854.html もしメールサーバがこれらのオーバーフローに対して脆弱でないならば、このルールを 不能にし、つかの間の平和を取り戻せます… 6.28 非常に多くの *ICMP Ping Speedera* アラートを受けます。問題ですか? 全く正常です。 Windows update は speedera に基づいた DNS を利用します。もちろん、 speedera トラフィックはダイアルアップ アカウントより来るのかもしれません。(レポート にあったように) それはハッカーツールのようでしょう。;-) 6.29 なぜ unified アラートは +/- N 時間ずれるのでしょうか? まとまったログと警告ファイルは UTC で保存されます。 6.30 snort を起動しようとすると "ERROR: Unable to open rules file: /root/.snortrc or /root//root/.snortrc" というエラーを受け取ります。これを直すのにはどうすればいいでしょうか? Snortは実行の際、コマンドラインを見、そして"-c /some/path/snort.conf"をチェック します。もしそれがなければ、以下のファイルを探します。 * /etc/snort.conf * ./snort.conf * $HOMEDIR/snort.conf * $HOMEDIR/.snortrc * ./.snortrc .confが上記の場所にあり、snortがそれを見つける事ができるか確かめるか、 snortがsnort.confの絶対パスを見分けられるよう、引数-cを使ってください。 snort -c /usr/local/etc/snort.conf 7 開発 7.1 snort をデバッグ・モードにするには、どうしたらいいですか? 1.9かそれ以上のバージョンにおいて、 1. ./configure -enable-debug 2. デバッグにしたい snort のセクションを調べて(src/debug.hを参照)、定数を加えて ください。例えば Portscan2 をデバッグしたい場合は、 #define DEBUG_PORTSCAN2 0x00080000 /* 524288 / (+ conv2 ) 589824 */ portscan2 だけをデバッグするには、(原文がよくわからないため訳者意訳) export SNORT_DEBUG=524288 portscan2 と conversation の両方をデバッグするためには、 export SNORT_DEBUG=589824 3. snort を普通に実行します。大量のデバック出力をうまく処理するために、ファイル にリダイレクト出力する必要があるでしょう。 8 その他 8.1 snort drinking game は何ですか? :-) あなたがチェックしてね。 http://www.theadamsfamily.net/~erek/snort/drinking_game.txt