|
●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)
|
※$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)
|
※参考: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 |