■IDSの導入による不正侵入の検知とネットワーク管理
Snortのルール構造とその作成方法
Snortのルールセットにはさまざまなルールが記述されており、そのパターンにマッチングしたものが検出される。では、ルールにはどのような内容が記述されているのだろうか。今回はルールの概要を把握するとともに、新規に簡単なルールを作成してみよう

●Snortのルール構造

 Snortのルールセットがある場所は、インストールされる環境によって異なる。前回までの設定では「/etc/snort」以下にあるのだが、各ルールセットにはそれぞれ個別にルールが記述されている。

 ルールは

ルールヘッダ(ルールオプション)

 という形で記述されている。では、ここで実際の例として、「web-cgi.rules」にある、phfに関するルールを見てみよう。

# cd /etc/snort
# grep phf *.rules
web-cgi.rules:alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WEB
-CGI phf arbitrary command execution attempt";flags:A+; uricontent:"/phf"; nocas
e; content:"QALIAS"; nocase; content:"%0a/"; reference:bugtraq,629; reference:ar
achnids,128; reference:cve,CVE-1999-0067; classtype:web-application-attack; sid:
1762; rev:1;)
web-cgi.rules:alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WEB
-CGI phf access";flags:A+; uricontent:"/phf"; nocase;
reference:bugtraq,629; ref
erence:arachnids,128; reference:cve,CVE-1999-0067; classtype:web-application-ac
tivity; sid:886; rev:8;)

 ルールセットweb-cgi.rulesには、2つのphfに関するルールが記述されているが、今回は単純な内容である二つ目のルールを例として取り上げてみよう。まず、わかりやすくするために、このルールからreference以下の部分は切り離す。

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WEB-CGI phf access";flags:A+; uricontent:"/phf"; nocase; )

 では、順番に見ていこう。まず、( )でくくられた記述(ルールオプション)の前にある部分

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

までの概要は表1のようになる。

表1■ルールに書かれている内容(1)

alert アラートを出す
tcp プロトコルの指定。「tcp」はTCPを指定している。他にUDP/ICMPが指定できる。ただし、いずれか一つの指定のみ
$EXTERNAL_NET any 外部ネットワークのすべて(any)のポート
-> 通信の方向を指定している。この場合「$EXTERNAL_NET any」から「$HTTP_SERVERS $HTTP_PORTS」へのアクセスということになる。ほかに「<-」や「<>」の指定方法がある。方向を見ればどの方向への通信か分かると思う
$HTTP_SERVERS $HTTP_PORTS Webサーバのアドレス、ポート

※$EXTERNAL_NET、$HTTP_SERVERS、$HTTP_PORTS それぞれ、設定ファイル「/etc/snort/snort.conf」で指定したものになる。(第1回参照) 

 つまり、web-cgi.rulesに記述されているのは、「外部のネットワークからWebサーバに対して、ルールオプション()内に記述された条件にあてはまるアクセスがあった場合は、アラートを出す」と解釈することができる。

 例えば、サーバのアドレスが、192.168.1.5だと仮定し、そのサーバへの全てのTCPトラフィックを記録する場合の記述は、

alert tcp any any > 192.168.1.5 any

とすればいいわけだ。

 次にルールオプションである( )内を見てみよう。

(msg:"WEB-CGI phf access";flags:A+; uricontent:"/phf"; nocase; )

ここでの内容は、表2のようになる

表2■ルールに書かれている内容(2)

msg:"WEB-CGI phf access"; ログ等へのアラートメッセージについて記述されている。この場合「WEB-CGI phf access」がそれにあたる
flags:A+; flagsはTCPフラグを表している。AはACKフラグ、+はACKフラグの立っているもの。ほかにFIN/SYN/RST/PSH/URG/及び予約ビット(2/1)の指定ができる
uricontent:"/phf"; URI(Uniform Resource Identifiers)情報が、/phfにマッチしたものを検出する※
nocase; 大文字・小文字を区別する。指定しない場合は大文字・小文字の区別無しに検出される

※参考:URI[Uniform Resource Identifier]:[URI-RFC2396]

 なお、このルールオプションで、「URI情報に(大文字、小文字が区別された)/phfが含まれ、ACKフラグの立っているパケットがあれば」という指定をしていることがわかる。ルールヘッダとあわせてみると、

 alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WEB
-CGI phf access";flags:A+; uricontent:"/phf"; nocase; )
外部のネットワークからWebサーバに対して、URI情報に(大文字、小文字が区別された)/phfが含まれ、ACKフラグの立っているパケットがあれば、WEB-CGI phf accessのアラートを出す

を表したルール、ということになる。実際にWebサーバを運営し、このルールセット(web-cgi.rules)を利用しているのであれば、ブラウザで「http://サーバのアドレス/phf/」と入力してアクセスしてみよう。下記のようなアラートがログに残っているだろう。(ローカル環境でのテストは、外部ネットワークの指定がanyになっている必要がある)。

# cd /var/log/snort
# grep phf alert
07/14-23:52:57.224726 [**] [1:886:8] WEB-CGI phf access [**] [Classification:
sid] [Priority: 2] {TCP} 192.168.1.3:50521 -> 192.168.1.4:80

 つまり、URI情報に/phfのあるものは検出される。たとえば、「http://サーバのアドレス/hoge/hoge/hoge/hoge/phf/」としても/phfが含まれていれば同じアラートがでるわけだ。たとえば、外部ネットワークからのアクセスでURI情報に「warez」が含まれるものはアラートを出すというルールを記述するならば、これを例として、

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"warez access";flags:A+; uricontent:"/warez";)

 とすれば、実用性はないが、URI情報に「/warez」が含まれるアクセスがあればアラートを出すというルールが作成できる。

 もうひとつ、ntpdのバッファーオーバーフローに関するルールを見てみよう。

alert udp $EXTERNAL_NET any -> $HOME_NET 123 (msg:"EXPLOIT ntpdx o verflow attempt"; dsize: >128; reference:arachnids,492; reference:bugtraq,2540; classtype:attempted-admin; sid:312; rev:2;)

 これは、「外部ネットワークから、ローカルネットワーク:UDPポート123番に対し、パケットペイロードサイズ(dsize)が128バイト以上のアクセスがあった際にアラートを出力する」というルールになる。このようにしてほかのルールを見ていけば、新規に作成する際の参考となるだろう。

1/5 NEXT