| SNORTで侵入検出 |
|
1.はじめに UNIXホスト動かして管理者なんかやってると、色々と気苦労が多くて困ります。そのひとつにネットワークを経由した攻撃や不正利用があげられるでしょう。 ヘタにホストに侵入されたりすると、あっと言う間に管理者権限奪って好き放題やられます。ホスト上にWarezとかmp3なんかをガンガン置かれたり、IRCサーバ建てられたり、セキュリティホール直してくれたり:-)、パスクラッカーフル回転とか。人のCPUリソース勝手に使うなって。 まだ自分の管理下だけで被害が済んでればいいけど、踏み台にされて他のネットワークやホストに攻撃なんか仕掛けられた日にゃタマりません。ある日突然milドメインの管理者から丁寧なお手紙頂いたり、制服を着た人がホストを丸ごと持って行っちゃったりします。 誰だってこんな目に逢いたくないですよね。ボクも逢いたくないですけど、タマに巻き込まれます。ホスト数台の管理者なら未だ幸せな方です。ネットワーク管理者なんかやってた日にゃ、数十台から数千台のホストに関する苦情を一手に引受けます。もう針の筵状態。引受けたくなくても来ます。いつの間にか英文でのお詫びメールが得意になりますね。 しかも自分は何も悪くないのに、上司にゃ怒られる、同僚には冷たい目でみられる。あげくの果てには、原因となってるホストの持ち主からもエラそうな口きかれます。首しめたろうか!と思うのは一度や二度ではありません。こうしてネットワーク管理者は度重なる心労で疲労困憊が続いて、ある日突然に出社拒否とかしちゃいます。 あ、話が思いっきり外れましたね。でも言いたいことは少しは解ってもらえます?ネットワーク管理者は日がな一日コンソール眺めているだけじゃ無いんですよ。結構大変なお仕事なんです。 |
|
2.Snortってなに? それじゃそろそろ本題に入りましょうか。そうそうSnortですよね。 SnortとはIDSと呼ばれるソフトウェアで、日本語だと侵入検知システムなどと呼ばれたりします。要するにホストになんかの悪さをしてくる行為を検出して知らせてくれたりするわけです。 IDSの検知手法にはシグネチャマッチングとか統計からの異常状態検出とかとかイロイロと手法があるみたいですけど、Snortも最も良く使われているであろう、シグネチャマッチングにより検出を行ってくれます。要するにネットワークからホストに届くデータと手元にあるパターンデータを照会して、同じ物のみを検出するといった手法です。 このパターンデータ(シグネチャなどと呼びますが)にDoS攻撃やポートスキャン、バッファーオーバーフロー攻撃などのパターンを登録しておけば、ある程度の攻撃・不正利用を検出して報告してくれるわけです。また使い方によっては、自ホストのみを監視対象にしたり、ネットワークごと監視したりすることも可能なのです。 またSnortはGNU General Public LicenseのもとでFreewareとして公開されていますので、市販のIDSの様に数十万から数百万の費用を費やすことなく、またそれらの商用IDSと比べても決して遜色の無い、高性能なIDSを手に入れることが可能なのです。 みなさんもさっそく自分の管理するホストでSnortを動作させて、IDSの重要性とSnortの能力を経験してみてください。 Snortに限らずフリーウェア等は、それらを利用する事に関する全ての責任を各管理者が負わなければなりません。それだけは注意してください。 良い事ばかりじゃないです。解らない事は自力でドキュメントを読んだり、Webサイトを徘徊して資料を揃えたりしてください。自力で調べてそれでも解らない場合はNewsGroupやMLに投稿してみましょう。くれぐれも、ドキュメントを読めば直ぐに解るような質問を人に尋ねないこと。 それでは気合を入れてsnortをインストールしましょう。 |
|
3.sourceの入手 sourceは http://www.snort.org に行って取ってきてください。いちおうrpm形式のバイナリや、WindowsNT用のバイナリなんかもありますが、ここはぐっと堪えてsourceからmakeしましょう。特に理由はありませんが。 「何処にあるか解らない」なんて言わないでくださいね。ちゃんとコンテンツを読んでください。重要な情報が書かれているんですから。 現時点では1.6.3-patch2が最新のようです。この直後に1.7が出ました ちなみにsnortはlibpcap上で動作しますので、libpcapをインストールしてない人は、先にそちらを済ませましょう。libpcapは http://www.tcpdump.org/ あたりで手に入ります。libpcapのインストールもちゃんとドキュメント読んで正しくインストールしとかないと、Snortのmake時にイタイ目に遭います。痛い目にあってもボクにメールしないでください。ちゃんとドキュメント読まない方が悪いんです。 |
|
4.sourceの展開 取ってきたsourceを適当なディレクトリに展開します。snort-1.6.3-patch2ディレクトリが作成されますので、cdしてください。 まずはREADMEなんぞに軽く目を通しては如何でしょうか。そんなヒマ無いって人でもINSTALLには目を通してください。 |
|
5.make & install makeは至極簡単。ドキュメントにもあるように、以下のとおりにタイプするだけです。
1.) *** Make sure you have libpcap installed!!! ***
2.) ./configure
3.) make
4.) make install
5.) make a sample rules file (if you want to use rules,
check out the included snort-lib file)
6.) snort -?
7.) If you've used previous versions of Snort, you may
need to rewrite your rules to make them compliant
to the rules format. See the RULES.SAMPLE file
for the rules format.
8.) Have fun!
ボクが言うまでもないでしょうけど、4.)の作業はroot権限じゃないと正常に出来ません。 |
|
6.execution makeまでは簡単ですね。とりあえずSnortが動くようになります。でもこれだけだとSnortは単なるパケットモニタとしてしか働きません。Snortは、どのパケットをキャプチャしたときにどのように振舞うかを記述したシグネチャファイルと呼ばれる物が必要になります。 とりあえずはSnortをmakeしたディレクトリを覗いてみてください。xxxx-libというファイルが見つかると思います。これらがsnortに標準で添付されているシグネチャファイルです。当面はこれらのシグネチャファイルを使って運用していっても十分でしょう。 適当なディレクトリにxxxx-libファイルを移動しましょう。ボクは/usr/local/snortディレクトリを作成して、これらのシグネチャを格納しておきました。シグネチャファイルを移動して一箇所に集めたら、適当なエディタでsnort-libを編集してください。 var HOME_NET xxx.xxx.xxx.xxx/xx 上記の行を探し出して、自分のネットワーク番号を指定します。 var DNS_SERVER xxx.xxx.xxx.xxx/xx 上記の行を探し出して、本ホストのDNSサーバのIPアドレスを指定してください。 var DNS_SERVER 192.168.0.1/32 192.168.128.1/32 のように複数書くことも可能です。 それではsnortを起動してみましょう。以下のコマンドをタイプしてください。 /usr/local/bin/snort -Dde -c snort-lib -h xxx.xxx.xxx.xxx/32 -l /var/log/snort xxx.xxx.xxx.xxxのところは自ホストのIPアドレスを指定します。/var/log/snortディレクトリはあらかじめ作成しておきましょう。 もし起動に失敗した場合は、/var/log/messagesあたりに記録が残ってます。 |
|
7.checking log 起動したらしばらく放っておきます。そうですね、インターネットに繋がってて、httpやsmtpのサービスを運用しているホストなら、ものの数分でログが/var/log/snortの中に出来ます。繋がっていないホストの場合は、別の手持ちのホストからPingを沢山打ったり、Portscanをかけたり、Explotバキュンとかってやってください。 如何でしょう?以下のような感じで/var/log/snortディレクトリ内に記録されているはずです。 xxx.165.238.191/ xxx.249.117.166/ xx.28.28.224/ xxx.165.238.197/ xxx.249.64.47/ snort.alert.log xxx.165.238.199/ xxx.250.112.137/ xxx.165.238.204/ xxx.250.40.69/また、/var/log/snort_portscan.logも作成されているはずです。 それでは、snort.alert.logをちょっとエディタ等で開いて見てみましょう。
[**] Traceroute [**]
12/21-11:22:06.486057 8:0:20:93:E4:2C -> FF:FF:FF:FF:FF:FF type:0x800 len:0x76
xx.xx.x75.129:14000 -> xx.xx.x75.255:14000 UDP TTL:1 TOS:0x0 ID:9194 DF
Len: 84
[**] spp_portscan: PORTSCAN DETECTED from xx.xx.x75.137 (THRESHOLD 4
connections exceeded in 0 se\conds) [**]
12/21-11:23:01.215042
[**] WinGate 1080 Attempt [**]
12/21-11:23:01.248689 0:D0:B7:9A:63:88 -> 0:30:68:1:10:76 type:0x800 len:0x3C
xx.xx.x75.137:50430 -> xx.xx.x75.140:1080 TCP TTL:54 TOS:0x0 ID:12603
******S* Seq: 0x8BEC2856 Ack: 0x0 Win: 0xC00
[**] Traceroute [**]
12/21-11:27:06.603982 8:0:20:93:E4:2C -> FF:FF:FF:FF:FF:FF type:0x800 len:0x76
xx.xx.x75.129:14000 -> xx.xx.x75.255:14000 UDP TTL:1 TOS:0x0 ID:9195 DF
Len: 84
こーんなカンジで記録されます。ところが、TracerouteとかPingなんかまで記録してくれるので、ログがどうしても冗長になりがちです。Proxyを動かしているホストなんかでは、Wingateの嵐に見舞われます。 |
|
8.changing snort's rules これらで特に記録する必要の無いシグネチャを整理しなければなりません。また自分で検出項目やシグネチャを追加したい場合にも、Snortは柔軟に対応してくれるのです。またこれらのシグネチャの記述方法も洗練されていて、ちょっと調べれば誰でもシグネチャが書けるようになります。まぁ機能が足りないって意見もあるでしょうけど、とりあえず無視。 それでは、まずは通常では不要と思われるシグネチャをいくつか削除してみましょう。 Snortの運用を続けていくと、どうしても退屈なメッセージが多くなります。pingなんて記録してくれなくても良いですよね。それらのログメッセージをシグネチャファイルの中から探しだします。grepコマンドとエディタのfind機能を使うと結構ラクチンです。 例えばTracerouteのシグネチャなら「grep Traceroute *」なんかで探し出せますよね。
# grep Traceroute *
misc-lib:alert udp !$HOME_NET any -> $HOME_NET any
(msg:"IDS003 - MISC-Traceroute UDP";ttl:"1";)
misc-lib:alert tcp !$HOME_NET any -> $HOME_NET any
(msg:"MISC-Traceroute TCP";ttl:"1";)
misc-lib:alert icmp !$HOME_NET any -> !$HOME_NET any
(msg:"IDS238 - Traceroute IPOPTS"; ipopts: rr;itype: 0;)
misc-lib:alert udp !$HOME_NET any -> $HOME_NET !520
(msg:"IDS115 - MISC-Traceroute-UDP";TTL:1;)
misc-lib:alert icmp !$HOME_NET any -> $HOME_NET any
(msg:"IDS118 - MISC-Traceroute ICMP";ttl:1;itype:8;)
scan-lib:# Windows Traceroutes
scan-lib:alert icmp any any -> $HOME_NET any
(msg:"Windows Traceroute"; TTL: 1; itype: 8;)
scan-lib:# Standard Traceroutes
scan-lib:alert udp any any -> $HOME_NET any (msg:"Traceroute"; TTL: 1;)
標準でついてきたシグネチャファイルなら上記のように、misc-libとscan-libの中にtracerouteに関する記述があることが分かります。 では早速misc-libをエディタで開いて修正してみましょう。
alert udp !$HOME_NET any -> $HOME_NET any
(msg:"IDS003 - MISC-Traceroute UDP";ttl:"1";)
alert tcp !$HOME_NET any -> $HOME_NET any
(msg:"MISC-Traceroute TCP";ttl:"1";)
alert tcp !$HOME_NET !53 -> $HOME_NET 1080
(msg:"MISC-WinGate-1080-Attempt";flags:S;)
*上記のシグネチャは改行入れてありますけど、本当のシグネチャは1パターンが1行に収まっていますので、注意してください。 こんなカンジで記述されていますので、行ごと削除するなり、#でコメントアウトするなりしてください。このようにして、自分で不要と思われるシグネチャを整理してゆきます。通常の運用では削除する一方で追加ってコトはなかなか無いと思われます。シグネチャの書き方については、また後ほど説明します。 ひととおりシグネチャの整理が終わりましたら、いったんsnortをkillして再起動しましょう。 当分のあいだは、上記のシグネチャ整理に明け暮れるんじゃないですかね。むろん、ちゃんとログを読んでください。 |