Next Up Previous Contents References
プリプロセッサ

2.4 プリプロセッサ

プリプロセッサはSnortのバージョン1.5から導入されました。プリプロセッサ 機能を通じて、ユーザやプログラマはモジュール型のプラグインを容易に Snortに組み込み、機能を拡張できます。プリプロセッサのコードは侵入検知 エンジンが呼び出される前に実行されますが、パケットがデコードされた後に 実行されます。この機構により、パケットの修正や分析を帯域外(out of band) 方式で行うことができます。

preprocessorキーワードを通じてプリプロセッサの読み込み・設定を 行います。Snortルール内のpreprocessorディレクティブの形式は 次の通りです。

preprocessor <name>: <options>

preprocessor minfrag: 128

Figure 36: Preprocessorディレクティブ形式の例

2.4.1 HTTP デコード

HTTPのURI文字列を処理し、そのデータを確かなASCII文字列に変換するために、 HTTPデコード機能が利用できます。たとえば、HTTP規格は%20の文字列が 単一の空白(例: )として解釈されるよう、文字に対する16進エンコー ディングを定義しています。Webサーバは、様々な規格に準拠するように 書かれているだけでなく、おびただしい種類のクライアントにも対応 できるよう設計されています。MicrosoftのWebサーバは特定のバグだけに 対応するだけでなく、付加的な種類のエンコード方式も処理できます。

Table 5: HTTPデコードオプション

オプション 目的 Webサーバ
unicode Multibyte encoding standard IIS (all versions 3+)
iis_alt_unicode %u### encodings IIS
double_encode IIS encoding bugs IIS 3,4,5 versions prior to MS01-44
iis_flip_slash interpret as / IIS
full_whitespace interpret tabs as spaces Apache

2.4.1.1 書式

http_decode:<port list> [unicode] [iis_alt_unicode]\
              double_encode] [iis_flip_slash] [full_whitespace]

preprocessor http_decode: 80 8080 unicode iis_flip_slash iis_alt_unicode

Figure 37: HTTPデコードディレクティブの形式例

2.4.2 Portscan Detector

Snort PortscanプリプロセッサはPatric Mullen氏によって開発されました。

2.4.2.1 Snort Portscan プリプロセッサの機能

ポートスキャンは、T秒間にPを超えるポート番号へのTCP接続試行、 またはT秒間にPを超えるポート番号に送信されるUDPパケットと 定義されます。ポート番号は複数の宛先IPアドレスに 拡張でき、複数のIPに渡る同一のポート番号も対象となります。 現在のバージョンでは単独->単独、または単独->多数のポート スキャンを検知できます。次のフルリリースでは、分散型ポート スキャン(複数->単独または複数->複数)に対応する予定です。 ポートスキャンはNULL, FIN, SYNFIN, XMASなどの単一のステルス スキャンパケットとも定義されます。これは、Snortの標準配布 ファイルに含まれるscan-libから、ステルススキャンパケットの 部分をコメントアウトすべきであることを意味しています (訳注:バージョン2.0.2の配布物には当該ファイルを確認できな かったため、この記述は古い可能性がある)。 ポートスキャンモジュールを利用する際のメリットとしては、これらの アラートが各パケットごとにではなく、各スキャンごとに出力される 点が挙げられます。外部ログ取得機能を利用すれば、ログファイルを 参照することでスキャンのテクニックやタイプを確認できます。

このモジュールに対する引数は次の通りです。

2.4.2.2 書式

portscan: <monitor network> <number of ports> <detection period> <file path>

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

Figure 38: Portscan Preprocessor設定例

2.4.3 Portscan Ignorehosts

もう1つのPatric Mullen氏から提供されたモジュールは、ポートスキャン 検知システムの挙動を変更するものです。運用中のサーバ(NTP, NFS, DNSサーバなど)がポートスキャン検知機構を誤動作させる傾向がある 場合は、ポートスキャン検知プラグインに特定のホストからのTCP SYNや UDPポートスキャンを無視するよう設定できます。このモジュールに 対する引数は、無視する対象のIPアドレス/CIDRブロックのリストです。

2.4.3.1 書式

portscan-ignorehosts: <host list>

preprocessor portscan-ignorehosts: 192.168.1.5/32 192.168.3.0/24

Figure 39: Portscan Ignorehosts モジュールの設定例

2.4.4 Frag2

Snort 1.8で導入されたFrag2は新しいIPフラグメント再構築 プリプロセッサです。Frag2は(訳注:以前利用されていた)defragプリ プロセッサを置き換えるよう設計されています。このフラグメント再構築 機構は、メモリの利用効率を高めるとともに、Snortの他の部分で 利用されているものと同じメモリ管理ルーチンを利用することを 目的としています。

Frag2ではメモリ利用量とフラグメント化タイムアウトオプションを 設定可能です。引数が未設定の場合、frag2は4194304バイト (4MB)のデフォルトメモリと60秒のタイムアウト時間を 利用します。タイムアウト時間は、まだ再構築が行われていない フラグメントを廃棄するまでの待ち時間を設定する際に利用します。

Snort 1.8.7では、fragrouteのような回避テクニックの利用を検知する ために効果的なオプションがいくつか追加されました。

2.4.4.1 書式

preprocessor frag2: [memcap <xxx>], [timeout <xx>], [min_ttl <xx>], \
                    [detect_state_problems], [ttl_limit <xx>] 
timeout <seconds> ステートテーブルに不活発なストリームを 保持している時間、セッションが再び活動していることが確認されれば、 掃き出し済みセッションが自動的に再び取り込まれます。デフォルトの 値は30秒です。
memcap <bytes> メモリ容量をバイト数で設定し、この限界 を超過すると積極的にfrag2が不活発な再構築済みパケットを取り除きます。 デフォルトの値は4MBです。
detect_state_problems 重複フラグメントのようなイベントに 関するアラートを有効にします
min_ttl frag2が受け付ける最低のTTLの値を設定します
ttl_limit アラートを出力しないようにする誤差値を設定します (初期フラグメント TTL +/- TTL リミット)

preprocessor frag2: memcap 16777216, timeout 30

Figure 40: Frag2 プリプロセッサの設定

2.4.5 Stream4

stream4モジュールはSnortにTCPストリームの再構築およびステートフル解析 機能を提供します。堅牢なストリーム再構築機能を通じて、Snortはstickや snot攻撃のような“ステートレス”攻撃を無視できるようになります。 stream4は同時に256を超えるTCPストリームを追跡できる大規模なスケーラ ビリティも提供します。stream4はデフォルトの設定で32,768の同時TCP 接続を処理できる拡張性を備えているはずです。

Stream4はstream4プリプロセッサ、stream4に関連する再構築プラグインの 2つの構成可能なモジュールが含まれています。以下にstream_assemble のオプションをリストアップします。

2.4.5.1 Stream4形式

preprocessor stream4: [noinspect], [keepstats], [timeout <seconds>], \
            [memcap <bytes>], [detect_scans], [detect_state_problems], \
            [disable_evasion_alerts], [ttl_limit <count>]
noinspect ステートフル検査を無効にします
keepstats <logdir>/session.logにセッションサマリー情報を記録します
timeout <seconds> ステートテーブルに不活発なストリームを 保持している時間、セッションが再び活動していることが確認されれば、 掃き出し済みセッションが自動的に再び取り込まれます。デフォルトの 値は30秒です。
memcap <bytes> メモリ容量をバイト数で設定し、この限界 を超過すると積極的にstream4が不活発な再構築済みパケットを取り除きます。 デフォルトの値は8MBです。
detect_scans ポートスキャンに対するアラートを有効にします。
detect_state_problems 回避的RSTパケット(evasive RST packets)、 データにおけるSYNパケット、範囲外のウィンドウシーケンス番号といった ストリームイベントに対するアラートを有効にします。
disable_evasion_alerts TCPオーバーラップなどのイベントに 対してアラートを無効にします
ttl_limit アラートを出力しないようにする誤差値を設定します

2.4.5.2 Stream4_Reassemble形式

preprocessor stream4_reassemble: [clientonly], [serveronly],\
                                 [noalerts], [ports <portlist>]
clientonly コネクションのクライアント側にのみ再構築を提供します
serveronly コネクションのサーバ側にのみ再構築を提供します
noalerts 挿入または回避攻撃(insertion or evasion attacks)の 可能性があるイベントに対してアラートを出力しません
ports<portlist> - 再構築を実行するポートのリストを空白で 区切りで指定します。allはすべてのポート番号に再構築を提供します。 デフォルト値ではポート番号21 23 25 53 80 110 111 143および513向けに 再構築を提供します。

2.4.5.3 注

snort.confファイル内で引数を設定せずに、stream4とstream4_reassemble ディレクティブを設定した場合、表6と 表7に示したデフォルトの値が 設定されます。

stream4は新しいコマンドラインスイッチとして``-z''を導入しています。 TCPトラフィックにおいて-zスイッチを指定した場合、Snortはスリーウェイ ハンドシェイクを通じて確立されたストリーム、または協調的な双方向の 活動が観測された場合のストリーム(つまりあるトラフィックが一方向に なってしまい、RSTまたはFIN以外のトラフィックが送信者に戻ってくる ことが確認された場合)に対してのみアラートを発動します。-zが有効な 状態の場合、Snortは完全にTCPベースstick/snot攻撃を無視します。

Table 6: Stream4のデフォルト値

Option Default
Session Timeout 30 seconds
Session Memory Cap 8388608 bytes
Stateful Inspection ACTIVE
Stream Stats INACTIVE
State Problem Alerts INACTIVE
Portscan Alerts INACTIVE

Table 7: Stream4_reassembleのデフォルト値

Option Default
Reassemble Client ACTIVE
Reassemble Server INACTIVE
Reassemble Ports 21 23 25 53 80 143 110 111 513 1433
Reassembly Alerts ACTIVE

2.4.6 Conversation

Conversationプリプロセッサを利用すると、SnortはTCPにおいて spp_stream4で行われている方法ではなく、プロトコルに 基づいて対話の状況を得ることができます。将来的には、これに よってバイトカウントやファーストトーカー(first talker)の 状況に対応するルールを記述できるようになるでしょう。

現在、Conversationプリプロセッサはstream4と同じメモリ防御 メカニズムを利用しており、DoS攻撃の際に自衛できます。

Conversationプリプロセッサは、ネットワーク上で許容されない IPプロトコルを含んだパケットを受信するとアラートメッセージを 生成できます。allowed_ip_protocolsで許容するプロトコル 番号のリストを設定すると、許容されないパケットを受け取った 場合にアラートを発動して、そのパケットを記録します。

書式

preprocessor conversation: [allowed_ip_protocols <protonumbers|all>], \
                           [timeout <sec>], [alert_odd_protocols], \
                           [max_conversations <number>]

Table 8: Conversationデフォルト値

Option Default
allowed_ip_protocols all
timeout 60
alert_odd_protocols disabled
max_conversations 65335

2.4.7 Portscan2

このモジュールを利用ポートスキャンを検知できます。このモジュールは 対話(conversation)が新しく行われているものなのかを知るために、 conversationプリプロセッサ(第2.4.6節)を必要とします。

このモジュールは高速nmapスキャンのような高速スキャンの捕捉を 意図したものです。

2.4.7.1 書式

preprocessor portscan2:  [scanners_max <num>], [targets_max <num>], \
                         [target_limit <num>], [port_limit <num>], \
                         [timeout <sec>]
scaners_max 同時にサポートするネットワークをスキャンする ホストの数
targets_max ホストを表すために割り当てるべきノードの数
target_limit スキャンが呼び出される前にスキャナーが通信 するホストの数
port_limit スキャナーが呼び出される前にスキャナーが通信 するポートの数
timeout スキャナーの活動を忘れ去る秒数

Table 9: Portscan2のデフォルト値

Option Default
scanners_max 1000
targets_max 1000
target_limit 5
port_limit 20
timeout 60

2.4.8 Portscan2 Ignoreports

これら二つのプリプロセッサはPortscan2プリプロセッサの動作を一部変更し、 特定のTCPおよびUDPポートを宛先や送信元とするアラートを無視するよう 設定するものです。

特定のポートを宛先とするアラートを無視するには、portscan2-ignoreports-to を利用します。特定のポートを送信元とするアラートを無視するには、 portscan2-ignoreports-fromを利用します。これら二つのディレクティブは snort.confの portscan2 preprocessor の指定より後の行に設定する必要があります。 また、ポート番号は空白区切りのリストで指定する必要があります。

2.4.8.1 書式

preprocessor portscan2-ignoreports-from: <port list>
preprocessor portscan2-ignoreports-to: <port list>

2.4.8.2 例

 
preprocessor portscan2-ignoreports-from: 53  80
preprocessor portscan2-ignoreports-to: 80 1080

Figure 41: Portscan2 Ignoreports モジュールの設定例

2.4.9 Telnet デコード

telnet_decodeプリプロセッサを利用すれば、Snortはセッションデータから のtelnetの制御文字列を正規化できます。1.9.0以降のSnortでは引数として (プリプロセッサを)利用するポートのリストを指定します。また1.9.0では、 Snortはパケットそのものから個々のデータバッファに正規化することで、 rawbytes content修飾子(第2.3.38節)を使って生データを 記録。または検査できます。

デフォルトの設定ではポート番号 21, 23, 25, 119で動作します。

2.4.9.1 書式

preprocessor telnet_decode: <ports> 

2.4.10 RPC デコード

rpc_decodeプリプロセッサは、パケットをパケットバッファに正規化する ことで、複数のフラグメント化したRPCの記録を、単一のフラグメント化して いない記録に正規化します。stream4が有効になっている場合、クライアント 側のトラフィックのみを処理します。デフォルト設定では、ポート番号111と 32771で動作します。

2.4.10.1 書式

preprocessor rpc_decode: <ports> [ alert_fragments ] \
   [no_alert_multiple_requests] [no_alert_large_fragments] \
   [no_alert_incomplete]

2.4.11 Perf Monitor

このモジュールは、パフォーマンス統計データを元に、Snortの さまざまな状況を調整するために利用します。このモジュールの 出力形式や引数形式は予告なしに変更されることがあります。

2.4.12 Http Flow

このモジュールを利用すれば、SnortはHTTPヘッダの後のHTTPサーバーの 応答を無視できるようになります。

Table 10: RPC Decoderオプション

オプション 目的
alert_fragments フラグメント化したRPC記録に対してアラートを出力する
no_alert_multiple_requests 1つのパケット内に複数の記録が存在する場合でもアラートを出力しない
no_alert_large_fragments フラグメント化した記録の合計が1つのパケットを上回った場合でもアラートを 出力しない
no_alert_incomplete 単一のフラグメント記録が1つのパケットのサイズを上回った場合でも アラートを出力しない


Next Up Previous Contents References