火曜日, 10月 10, 2006

SQLgrey

 佐藤さんのブログ記事で、SQLgreyというものがあることを知った。postgreyから派生したグレイリスティングサーバで、動的IPアドレスっぽいFQDNパターンと、メールサーバっぽいFQDNパターンを検査する正規表現が用意されていて、動的IPアドレスっぽいパターンにマッチしてメールサーバっぽいパターンにマッチしなければグレイリスティングをかけるという方式だそうである。コンセプトは佐藤さんのRgreyと同じである。

動的IPアドレスっぽいパターン:
(^|[0-9.x_-])(abo|br(e|oa)dband|cabel|(hk)?cablep?|catv|cbl|cidr|d?client2?|cust(omer)?s?|dhcp|dial?(in|up)?|d[iu]p|[asx]?dsld?|dyn(a(dsl|mic)?)?|home|in-addr|modem(cable)?|(di)?pool|ppp|ptr|rev|static|user|YahooBB[0-9]{12}|c:alnum:?{6,}(\.[a-z]{3})?\.virtua|[1-9]Cust[0-9]+|AC[A-Z][0-9A-F]{5}\.ipt|pcp[0-9]{6,}pcs|S0106:alnum:?{12,}\.[a-z]{2})[0-9.x_-]

メールサーバっぽいパターン:
^(.+[._-])*(apache|bounce|bulk|delay|d?ns|external|extranet|filter|firewall|forward|gateway|gw|m?liste?s?|(bulk|dead|mass|send|[eqw])?mail(er)?|e?mail(agent|host|hub|scan(ner)?)|messagerie|mta|v?mx|out(bound)?|pop|postfix|w?proxy|rela(is|y)|serveu?r|smarthost|v?smtp|web|www)(gate|mail|mx|pool|out|server)?[0-9]*[._-]

すげえな…
 S25Rの一般規則を一つの正規表現にまとめたものと比較してみようか。

^(unknown|[^.]*[0-9][^0-9.]+[0-9]|[^.]*[0-9]{5}|([^\.]+\.)?[0-9][^.]*\.[^.]+\..+\.[a-z]|[^.]*[0-9]\.[^.]*[0-9]-[0-9]|[^.]*[0-9]\.[^.]*[0-9]\.[^.]+\..+\.|(dhcp|dialup|ppp|adsl)[^.]*[0-9])

こっちの方がずっと短い。
 ついでに、9月23日の記事「Becky!でのフィルタリング」で紹介した簡易一般規則をPostfix向けに手直しすると…

^(unknown|[0-9]|[^.]*[0-9][0-9][0-9][0-9][0-9]|[^.]*[0-9]+(([a-z]|-)+|\.)[0-9])

もちろん、さらにシンプルである。これは、Postfixではさらに短く

^(unknown|[0-9]|[^.]*([0-9]{5}|[0-9]([^0-9.]+|\.)[0-9]))

とも書ける(Becky!では通用しないが)。
 で、2006年7月に私のサイトへ不正メールを送り込もうとしたホスト4423個をどれだけ引っかけることができるかを比較してみた。その際、SQLgreyでの動的IPアドレスっぽいパターンの正規表現は、egrepコマンドにかかるようにするため、および「unknown」も引っかけるために、以下のように書き換えた。「:alnum:?」という書き方は謎だったが、不正メール送信の常連さんのFQDNからよきに推察して「[0-9a-f]」と書き換えた。

(unknown|(^|[0-9.x_-])(abo|br(e|oa)dband|cabel|(hk)?cablep?|catv|cbl|cidr|d?client2?|cust(omer)?s?|dhcp|dial?(in|up)?|d[iu]p|[asx]?dsld?|dyn(a(dsl|mic)?)?|home|in-addr|modem(cable)?|(di)?pool|ppp|ptr|rev|static|user|YahooBB[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]|c[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]+(\.[a-z][a-z][a-z])?\.virtua|[1-9]Cust[0-9]+|AC[A-Z][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]\.ipt|pcp[0-9][0-9][0-9][0-9][0-9][0-9]+pcs|S0106[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]+\.[a-z][a-z])[0-9.x_-])

 その結果…

SQLgrey:3781個(85.5%)
簡易一般規則:4331個(97.9%)
S25R一般規則:4344個(98.2%)

なんてこったい。SQLgreyは、ものすごい正規表現の割に、S25Rの一般規則に比べて8倍もの不正メール送信元ホストを見逃しているではないか。しかも、catv.ne.jpやadsl.ne.jpやhome.ne.jp(いずれも実在する)をドメインごと引っかけてしまう。こんなものを使うよりも、S25Rのルールを取り入れたRgreyを選ぶべきである。
 自慢じゃないけど(自慢だけど)、私が作ったルールの方がはるかに簡潔でしかも効果的である。

0 件のコメント: