next up previous contents
Next: ルールの例 Up: ルールの記述 Previous: ルールヘッダー

ルールオプション

ルールオプションは Snort の核となる部分であり、非常に多くのオプションが 記述可能である。更に、現在も改良が加えられつつあるので、ここでは基本的 な部分についてのみ説明することにする。

ルールオプションの記述の基本は、以下の通りである。


    ( keyword: arg; [ keyword: arg; [...]] )

つまり、keyword: arg が一つのオプションを形成し、それぞれの オプションは ; で区切られる。オプションは、オプションの keyword とその引数で成り立っている。なお、全てのオプションの最後は セパレータ ; で終っている点に注意すること。

  1. msg ログの際のメッセージを指定

    
    msg: "WEB-ATTACKS ps command attempt"
    

  2. flags TCP flags の値を指定

    F FIN
    S SYN
    R RST(reset)
    P PSH(push)
    A ACK
    U URG(urgent)
    2 予約ビットの2ビット目
    1 予約ビットの1ビット目
    0 TCP flags がセットされていない

    これらのflagsは併記すれば当然andの意味で処理される。
    
       例  flags: SF     (SYN + FIN の意味)
    

    更に、以下のオペレータが用意されている。

    + 任意のflagsに一致
    * 指定したflagsのどれかに一致
    ! 指定したflagsに一致しない

    つまり、A+ は ACK ビットが立った任意のパケットに一致し(pushが 立っていても、urgent が同時に立っていても)、SF* は SYN か あるいは FIN のどちらかが立ったパケットに一致する。

  3. ipopts TCP options の指定

    IP オプションを指定出来る。主には、通常使われないIPのオプションが onになったパケットを探すために用いる。

    rr Record route
    eol End of list
    nop No op
    ts Time Stamp
    sec IP security option
    lsrr Loose source routing
    ssrr Strict source routing
    satid Stream identifier

    特に、 ssrr や lsrr は Internet 上では使われておらず、もしそうした パケットが来た場合、TCP/IPスタックに欠陥があるようなOSに対する アタックであると考えられている。なお、このオプションは一つのルールに 一つしか記述出来ない。

  4. ttl TTL の指定

    TTL (time-to-live)の値を指定する。完全一致の場合のみサポート。 実際には、traceroute などを発見するために用いる。(traceroute は、 UDP パケットを TTL を少しづつ大きくしながら送る事によって、router を発見する。)

  5. itype ICMP のメッセージタイプの指定

    数値で一つだけが指定出来る。(ICMP message type は、フィルタリングの 章を参照の事)。

  6. dsize パケットのペイロードサイズの指定

    パケットのペイロードサイズ(つまりデータ部の大きさ)を指定出来ます。 当然、完全一致では難しいので、大小関係の演算子が使え、以下のように 指定します。

    dsize: ; N byte より大きい
    dsize: ; N byte より小さい

    あるサービスへのバッファオーバーフロー攻撃の検知や、異常に大きな ICMPの検知(トロイの木馬への通信の場合もある)などの用途に使えます。

  7. content ペイロードの中身の検査

    Snort の最も強力な機能の一つであり、データの中身をチェックする事が出来る。 一般に書式は以下のように書ける。

    
        content: [!] "<content string>";
    

    例えば以下の例では、データの中に文字列 "GET" があった場合に一致する。

    
    alert tcp any any -> any any (msg:"get"; content: "GET";)
    

    但し、Snort では大文字小文字を通常区別するので、このままでは小文字が 検知出来ない。この場合、後述する nocase を用いる。

    
    alert tcp any any -> any any (msg:"get"; content: "GET"; nocase;)
    

    更に、こうした検索はデータが大きくなると速度が著しく低下するので、 ペイロード の中のどこから検索を始めて、どこまでを検索するのかを指定するオプション などもある。

    同時に、この content ではバイナリデータも検索出来るようになっており、 バイナリデータは 16進で | で括って指定する。

    
        content: "|90C8 C0FF FFFF|/bin/sh";
    

    なお、|, :, " を文字として扱いたい場合には \ でエスケープする必要がある。

    最後になったが、! は今までと同じ意味で否定である。つまり、

    
        content: !"GET";
    

    は"GET"が見付からなかった場合にマッチする。

    この他にも、TCP flags と組み合わせる事で更に無駄な検索を省く事が 出来るので、ルールを書く場合には細心の注意を払って書くようにしよう。

  8. offset 検査開始位置の指定

    content オプションに付随したオプションで、先頭からの検索位置をバイトで 指定する。このオプションと次の depth を利用することで、検索範囲を 絞る事が出来、それによって検索スピードを劇的に向上させる事が出来るが、 あまりにも検索範囲を決め打ちして狭めると逆にアタックを見逃す可能性が あるとされている。

    
        offset: <num bytes>;
    

  9. depth 検査終了位置の指定

    先に説明した通り、この depth に指定したバイト位置までが検索範囲となる。

    
        depth: <num bytes>;
    

    以下の例は User Manual の例であるが、頭から3byte目までに"GET"が見付からない 場合にalertを出す例である。
    
    alert tcp any any -> 192.168.0.0/24 21 (content: !"GET"; depth: 3;\
     nocase; dsize: >100; msg:"Long Not-Get FTP command!";)
    

  10. uricontent URI の検査

    content と同じであるが、リクエストの URI の部分のみを検索する。

    
        uricontent: [!] "<content string>";
    

  11. Classtype 警報のクラス分け

    アタックの種類に応じて、alert のレベルや優先度情報をクラス分けするための 指定。実際のクラス分けや、名前の定義、優先度などのルールについては classification.config に記述する。

    
        classtype: <class name>;
    

  12. sid Snort ID

    ルールの識別のために、ID 番号をルールに付与する。

    
        sid: <rule id>;
    

    ローカルルールは、1,000,000 以上を用いる事。

  13. rev Revision number

    アップデートや情報のために、ルールの revision number を付ける。

    
        rev: <revision number>;
    


next up previous contents
Next: ルールの例 Up: ルールの記述 Previous: ルールヘッダー
Noriyo Kanayama