IPアドレスの最近傍識別を行うSPAM Filter 101
ここまで公開してるのは珍しい? 部門より
今まで私は,約5年間本業の画像の研究の傍ら,SPAMフィルタの研究と開発を行なってきました.コンテンツ内のURLなどのフィンガープリントを用いた方法,ベイジアンフィルタ,など色々作ってみては,精度が十分高くないことに満足が行かず,何度も試行錯誤を繰り返しました.そして,最終的に行き着いたのが,このNNIPFと名づけたフィルタです.説明とソースはこちらのサイトにあります.(続く)
このフィルタの特殊性は,1)自分が外部からメイルを受けるときに使っている信頼できるMTAを登録しておき,そのMTAが生成したReceived:行から送信元のIPアドレスを割り出すという点,2)IPアドレスを最近傍識別することによってSPAM検出を行うという点,です.これが妥当性を持つ理由は,Received行の改竄に対応でき,しかもIPアドレスは,組織の種別によって番号の偏りがあるので,まっとうなメイルの送信元と,SPAMメイルの送信元にはかなりの偏りがあるためです.現在登録しているSPAM-IPは1万8千以上,HAM-IPは千数百程度ですが,最近傍識別は木探索を用いて一瞬で終わります.
ABUSEされたマシンから送ったまっとうなメイルがブロックされるという問題はあるかもしれませんが,私が使ってみた限りそういうケースは0でした.また,SMTP強制切断を行いRFC2821準拠でないものを落とすことで十分ではないかという話もありますが,これを用いても一旦他のMTAで中継されたメイルは通り抜けます.また,最近は専用SPAM送信マシンからRFC2821準拠で送られてくるSPAMもあるようです.こういったわけで,うちの組織も入り口でRFC2821のチェックをしてますが,私個人の場合は毎日10通以上は楽に通り抜けてきます.
そこでやっぱりフィルターは必要になるのですが,コンテンツを見て識別するフィルターはやっぱりミスをしますし,なかなか学習がいつどのように行なわれるのかが分からず,うまく御すことが難しいと思っておられる方は多いと思います.NNIPFは最近傍識別を用いたことで,これまで我々が開発してきたどんなフィルタよりも,精度が高く,学習も一瞬で終わるという性質をもちます.また,MTA上でSPAM検出をしますので,検出されたメイルはダウンロードされません.つまり,出張先のPHS接続で,SPAMばかりダウンロードするといったことが起きません.また,誤識別や,検出漏れなどがあった場合には,WEBインタフェースから修正を行なうことができます.このフィルタの長所はこういったところですが,逆に短所はというと,
の2点です.ですから,個々人で利用するよりもメイルの管理者が導入してユーザに利用法を教えるという形が取られると思います. Perlで書かれたフリーソフトですので,ご自由にお使いください.
- MTA+POP/IMAPサーバ+WEBサーバという3つの機能の揃ったLinux上でしか動かない
- メイルのメカニズムが分かっていない素人には設定や運用が難しい
ベイジアンフィルタだと (スコア:3, 参考になる)
バグレポート (スコア:3, 参考になる)
というのは、メール送信者IPアドレスを抽出する(NNIPF/PERL/header.plの中のmain'HeaderAnalysis)時に、メールヘッダの最初から走査して、Received:行の内、最後にMTAOBのリストに一致したものからメール送信者IPアドレスを抽出しているように見えます(違ったらすまん)。普通、Received:行は、新しいものが最初の方に来ますから、MTAOBのリストと一致するものの中で、一番古いものと一致することになります。
という事は、MTAOBのリストを知っているスパマーは、偽のReceived:行を紛れ込ませることによって、この偽のメール送信者IPアドレスを与えることが可能です。普通、スパマーが挿入するReceived:行の方が古いですから。
通常、MTAOBのリストは、DNSのMXレコードを引けば知ることができそうですから、割と簡単にこの攻撃は成立します。
ところで、このコード、汚いです。せめてインデントだけでもマトモにした方が…役に立たないきれいなコードより役に立つ汚いコードを書く方が偉いとは思いますが。
俺様がリファクタリングしてやろうか、っつーか、Rubyで書き直したろか、っつーか、MILTERにできんか、っつーか。きれいに書き直したらまだバグが見つかりそうな気も…
作り直すのなら (スコア:2, 興味深い)
作り直しを考えるのなら、DNSBLとして振舞うように仕立てると、ヘッダ解析しなくてもメールサーバが接続元IPアドレスを拾ってくれるし、負荷や管理対象絞込みの観点でもメールサーバとうまく分離できて幸せかもしれませんよ。
Re:作り直すのなら (スコア:1)
インターネットから引けるMXレコードに載ってるようなMTA向けであれば、おっしゃる通りだと思います。
Re:作り直すのなら (スコア:1)
いや、組織内のローカルなDNSBLサーバって位置づけでいいじゃないですか。
メールサーバが参照するローカルなDBバックエンドサーバのひとつってことで、アカウントや設定情報を抱えたLDAPサーバと同じようなところに置けば。
Re:作り直すのなら (スコア:2, 参考になる)
読み返して勘違いに気づきました。
組織のボーダゲートウェイなメールサーバから中継されて受け取る自分のメールサーバにフィルタを仕掛けたいってことですか。 それならまあ確かにReceivedヘッダにしか情報がないかな。
確かに (スコア:1)
jcode.plではなくEncodeの方に書き直したりとか、フィルタの部分だけクラス化させたりとか、`hostname`をSys::Hostnameモジュールを使った方が良いと思う。
# あ・・・う・・・見てたらうずうずと・・・
Re:バグレポート (スコア:1)
この問題をよくよく考えると、「外部からMTAOBに接続した部分のReceived:行の抽出」って簡単にはできそうにないですね。
MXにサーバが複数あって、セカンダリMX以降のサーバが外から受信して、プライマリMXのホストに転送した場合、
Received: は新しい順に「プライマリMXホストが受け取ったときのもの」「セカンダリMXホストが受け取ったときのもの」と並びます。
スパム送信ホストががセカンダリMXを偽装したヘッダを付けてプライマリMXに接続した場合にも、やはり「プライマリMX」「セカンダリMX」と並びますから、この二つはホスト名ベースでは区別できません。
Received: には、新しい順には、内部ホスト群→MTAOBホスト群→外部ホスト群、と並ぶはずですから、
MTAOBはホスト名だけではなく、IPアドレスも把握した上で、
「最初のMTAOBホスト群の中で、MTAOB以外のIPアドレスから接続したもの」というReceived:行を検出すればいいのかな。
Re:バグレポート (スコア:1)
Re:バグレポート (スコア:1)
過去のReceived:列を正しく喰うオートマトンを作ったところで、それがすべてのケースを網羅しているとは限りませんよね。障害が起こった場合、別の経路でメールを受け取る仕組みになってるかも知れないわけだし。
「Macではウイルスを心配しなくてよい」程度の話ですね。あまりカッコのイイ主張ではない気がします。
Re:バグレポート (スコア:1)
Re:バグレポート (スコア:1)
Re:バグレポート (スコア:1)
皆さんコメントありがとうございます.
ちなみに,httpdのログを調べ,6000台ほどのアクセス元IPアドレスの弁別度を調べたところ,99%以上の弁別度をもつものが約4%くらい含まれていました.ある意味,感心しました.
学習効果 (スコア:3, 興味深い)
(実際の距離の計算のところはもう少し複雑なアルゴリズムでしたが)
この方法のミソはヘッダや本文やその他の情報は偽造したり頻繁に変更す
ることは簡単だが、IPアドレスを頻繁に(大きく)変更することは難しいと
いう点にあり、ダイナミックIPからのスパム等にかなり効果があることは
確かです。
ただ長期に試した結果としては「学習効果が強過ぎるかな」といった問題
がでています。
よく判定に失敗した例としては
- 最近のスパムbotは普通にISPのメールサーバを使用して送信してきたりする
⇒ 大手のISPのメールサーバがスパムサーバとして登録されたりする
- スパマーの中には複数のサーバホスティング業者を渡り歩いて送信サーバを
変更してくるものがいる
⇒ 同じ業者のサーバホスティングを使用している他の人たちからのメールも
全てスパム扱いしてしまう
- 通常のメールに比べてスパムの数が圧倒的に多いと、そのうち知らないとこ
ろから来たメールは全てスパム扱いしてくれる
⇒ それはそれで良しという気がしないでもないが、ただのホワイトリス
トと変らないんじゃないかと
結局単独利用では不十分なので他の方法と組み合わせて何とかできないかと試行錯誤中
Re:学習効果 (スコア:2, 興味深い)
こういった現象はほんの僅かではありますが,起きております.ただ,スパムだけでなく,普通のメイルもIPを登録しますので,これらのせめぎ合いでうまく動くようです.それと,うちの場合,大学の入り口でSMTPタービットやら強制切断でチェックしているので,botから直接流れてくるスパムが少ないこともあるかもしれません.そういう意味では組み合わせとしてはタービットやら強制切断と組み合わせるのがいいかもしれません.
>- 最近のスパムbotは普通にISPのメールサーバを使用して送信してきたりする
> ⇒ 大手のISPのメールサーバがスパムサーバとして登録されたりする
これはyahoo,gmail,hotmailなどで昔はあったのですが,最近はほとんどないようです.少なくとも私のところでは過去半年こういうのはないです.
> - スパマーの中には複数のサーバホスティング業者を渡り歩いて送信サーバを 変更してくるものがいる
> ⇒ 同じ業者のサーバホスティングを使用している他の人たちからのメールも 全てスパム扱いしてしまう
時々ありますね.こういうことは.でも先に述べたせめぎ合いで,全部スパム扱いにはなりません.日ごろのトレーニングのせいかもしれません.
> - 通常のメールに比べてスパムの数が圧倒的に多いと、そのうち知らないとこ ろから来たメールは全てスパム扱いしてくれる
これは先に述べたせめぎ合いで,うちでは殆ど起きておりません.
> ⇒ それはそれで良しという気がしないでもないが、ただのホワイトリス トと変らないんじゃないかと
ちょっとどう答えていいか分からないのですが,ホワイトリスト,ブラックリストとせずに距離の比較をしてるので,汎化性能はいいみたいです.
Re:学習効果 (スコア:1)
OP25Bの普及とともにそちらへ移っていきますよ、これから。
Re:学習効果 (スコア:1)
SPFなどとの併用も (スコア:2, 興味深い)
それはそうと最近ふと携帯電話(au)のメール設定をみてみたらSPFに対応 [kddi.com]しているんですね。設定したとたんに Yahoo ドメインを騙っている迷惑メールが携帯電話に来なくなって快適になりました。いつからこんな設定ができるようになってたんだろう。
Yahoo は DomainKeys 派かと思ってたんですが、そもそもこの手の技術/規格にはもう○○派とか○○陣営とかはないのかな。
屍体メモ [windy.cx]
Re:SPFなどとの併用も (スコア:2)
近傍の判断方法が良くわからないのですけれど、手元のspammer IPアドレス集を見る限り、同じ/24から送って来ない方が多いのでこの記事の方法の有効性は少し眉唾です。
Yahoo!JAPANはSPFも使っていますが、米国のYahoo!はDKIM (DomainKeys) だけだと思いますよ。
Re:SPFなどとの併用も (スコア:3, 参考になる)
次に、Livingdeadさんが示したリンク [mew.org]にもありますが、MLで書換が発生するSubject:やReceived:を署名に含めない、という設定が可能なので、DKIMが特別MLに弱いというわけではありません。
本業は画像 (スコア:2, おもしろおかしい)
Re:本業は画像 (スコア:1)
でも結局、マッチしているところでは上のオクテットのほうが強いので、特徴ベクトル云々ではなくて、辞書から近い数字を探しているってことのようです。
公表 (スコア:1)
すでに publish されているようでしたら、読んでみたいです。アルゴリズムそのものに加え、その効果をどう検証するかも興味があります。
Re:公表 (スコア:1)
この研究の前段階に当たると思われる研究は情報処理学会DSM研究会で発表されています。
IPSJ-DSM03032013
■文 献 名 : マスメイルデータベースとそれを用いたマスメイル検出システム
■著 者: 松浦広明 (和歌山大学システム工学部) 齋藤彰一 (和歌山大学システム工学部) 上原哲太郎 (京都大学大学院工学研究科) 泉裕 (和歌山大学システム情報学センター) 和田俊和 (和歌山大学システム工学部)
■発行年月: 2004年 3月 Vol.2004 No.37 2003-DSM-032
Re:公表 (スコア:1)
最近傍識別 (スコア:1, 興味深い)
2番目の「最近傍識別」(nearest neighbor method)がわかりません。パターン認識関連で使われているようですが。
識別結果として、同じネットワークは同一とみなす、みたいな感じになるのでしょうか?
Re:最近傍識別 (スコア:2, 参考になる)
「何に一番似ているか」を判断(定量化)する技術みたいですね。手書き文字認識とかで使ってるものなんじゃないでしょうか。
> メイル送信者のIPアドレスを4次元の特徴ベクトルとして用いています
これは、オクテットごとに区切ったものを行列(ベクトル)と見なしてるってことかな?127.0.0.1=>(127,0,0,1)みたいな感じで。
で、最近傍識別器というのを使って、受け取ったメールに対して「過去のspamの中で一番特徴が似ているもの」と「過去のhamの中で一番特徴が似ているもの」を探し出して、それぞれ「どのくらい違うのか(弁別度)」を判定すると。
最終的には「過去にspamを送ってきたアドレスと似たようなアドレスからのメールで、かつ似たようなアドレスからhamを受け取ったこともないから多分spam」もしくは「過去にhamを送ってきたアドレスと似たようなアドレスからのメールで、かつ似たようなアドレスからspamを受け取ったこともないから多分ham」という判断になるのかな?
IPアドレスが地理的/ネットワーク的に偏って存在していることと、同一のマシン(あるいはアドレスが非常に似通ったマシン)からspamとhamの両方が送られてくる機会が少ないことを前提にしてるんだと思う。半分以上推測なので、数学がわかる人のフォロー希望。
# しかしスラドにはこういう使い方もあったのか。
Re:最近傍識別 (スコア:1)
ソースを見る限り、Good辞書における距離とBad辞書における距離の線形結合のようです。
Re:最近傍識別 (スコア:2, 参考になる)
っと、ゴメン、定義を間違えてた。線形結合じゃないや。 ええと正しくは、、、ソースから引用したほうが早いか。
要するに、 Dbad/(Dgood+Dbad) のようです。
Re:最近傍識別 (スコア:1)
この式は,計算してみると分かるんですが,P(spam|Dbad)=1/Dbad, P(non-spam|Dgood)=1/Dgood と置くと(これは確率密度の意味でとらえて下さいね.∞に飛びますから.),Bayes則で事後確率を計算しているという解釈ができます.そういう意味では本質的にBayesian Filterと同じなわけです.弁別度は,[0,1]の値で,Dspam>Dgoodのとき,0.5より小さく,DspamDgoodとき0.5より大きくなります.Dspam=Dgoodのときが0.5です.ですから,弁別度を0.5で閾値処理すれば1-最近傍識別と同じになります.でも最近傍識別のように二者択一の判定ではなく,度合いを表す量が必要と考えて,こういうものを導入しております.この弁別度が例えば0.7以上をスパムと判定するとか,0.3以下はノーマルと見なそうとか,そういうことをやっているわけです.
メールだけじゃなくて (スコア:1, 興味深い)
BlogやWikiへのコメントspamにも応用できないかな。最終的にIPアドレスでフィルタリングするなら何とかなりそうな気がするんだけど。
mod_auth_externalなどへのラッパーを作ればいいのかな?
掘り出し物? (スコア:1)
副作用が大きく実用にはならない (スコア:1, 興味深い)
最近のspamはbotnetを利用して不特定多数のPCから送信する [cnet.com]のが流行だ。
またインターネットの世界的な普及に伴い、その分布はダイナミックに変動 [sophos.co.jp]し続けている。
このような状況において、単純なIPアドレスベースのspamフィルタがどれだけ使い物になるのか疑問だ。
例えば…
普段やりとりするメールが日本国内に限定されるユーザーの場合、海外からのメールは問答無用でspam扱いされてしまうだろう。
海外からのメールを切り捨てて構わないのなら、そもそも日本国内のIPアドレスに限定して受信すれば良いことになる。
こんな面倒な仕組みを導入する必要はない。
しかし、最近のフィルタはgreylistやtarpit [ya.maya.st]を併用してその副作用をなるべく少なくしようと努力するのが常識だと思ってたが…
Re:副作用が大きく実用にはならない (スコア:1)
>またインターネットの世界的な普及に伴い、その分布はダイナミックに変動し続けている。
>このような状況において、単純なIPアドレスベースのspamフィルタがどれだけ使い物になるのか疑問だ。
botに関しての上の情報は常識ですが、
SMTPに関しては、ISPがポートをふさぐなどして
直接、相手のSMTPサーバに接続されないようになってきている
現状もご存じかと思います。
つまり、通常のメールはISPのSMTPサーバを経由するのが普通なのです。
(家でSMTPサーバを立てている場合もISPのSMTPサーバを経由させることになります)
解説を読めば分かりますが、
スパムの多くが直接受信者のSMTPサーバに送られているという
状況を利用してのフィルタなのです。
つまり(受信者にとって)メジャーなSMTPサーバではない
雑多なbotはいくら分布が移り変わっても全てスパム発信源です。
十分、効果があると思いますが?
mailとwebが同一サーバ? (スコア:0)
「管理者が…」なんて書いてあるけど。
Re:mailとwebが同一サーバ? (スコア:2, 参考になる)
webサーバまで同居しなきゃいけないのは 学習というか教示機能をCGIで実装してるせいなので、 設定管理デーモンを一つ作ってやるなど適当な手を打てば メールサーバを単機能に保ったまま 管理インタフェースを手元へ持ってくることはできるでしょう。
Re:精度 (スコア:2, 興味深い)
>それとも、99.999%あたりを十分な精度としているのかな?
最近じゃ、メールの表現力を精一杯使ってくるので
内容を文章に落とし込んでからフィルタに流すベイジアンフィルタでは
形態素解析以前に文章化が難しいというのも理解できるかな、とは思う。
Re:精度 (スコア:2, 興味深い)
ああいうのにはベイジアンフィルタは効き難いんじゃないかな。
Re:精度 (スコア:1)
最近のspamはスコアの高い単語を並べまくったものばかりだよ。
自分がもし本気のspammerだったら、そのくらいするでしょ。
技術系MLのアーカイブからメールを引っこ抜いて、URL部分だけ変えるとかさ。
Re:精度 (スコア:1)
>これむしろSPAMの手掛りを与えてるだけじゃないの?同じMLに入ってる人でも「変えたURL部分」に敏感に反応するだろうし。
>だってそのMLに入ってない人のベイジアンフィルタでは以後そのMLのがみんなSPAM判定されるだけでしょ。
そのMLに入ってる人はどうすんの?きちんと判定されるようになるまで何回学習させればいい?
「変えたURL部分」は初めて見るものだとすると、それがspam判定されるまで何度学習させればいい?
実際に使っててこういう物言いするのって、ちょっと不思議。まー満足してるからなんだろうけどベイジアンだって万能って程じゃないよ。
# 最初の頃は本文コミでもきれいに分けてくれるんだ、ベイジアンフィルタって奴は。
Re:精度 (スコア:1)
両者で共通しない部分の情報を元に判定するだけでしょう。1回か2回学習すればできるでしょうよ。
Re:精度 (スコア:1)
Re:精度 (スコア:1)
ham判定したspamは、「hamデータベースから引く」「spamデータベースに足す」をやってます。
たいていは、これだけでspam判定に変わります。
ただ、最近はあの手この手と新たな文面の(=spamにもhamにもほとんどデータが載ってないからham判定になる)spamを送ってくることが多いですね。そうなるとベイズ推定は無力。
今は rbl.jp・check_uri.pl をbsfilterと併用してます。
どんな文面だろうと、誘導したいURLは同じとこだったりするわけで、
それを単語学習させて頻度計算するよりは、出現したら即spam行きにした方が確実。
bsfilter単体の時は、一日100通ぐらいのspamが届いていた(それでも、95%ぐらいのspam検出率はありました)のですが、
check_uri.pl を併用してからは、spamは一日5通ぐらいになりました。
Re:精度 (スコア:1)
# だけど新規のゾンビとかが相手だとあんまりうまく判定してくれない。学習させればいいんだけど。
Re:精度 (スコア:1)
ここでの話題はベイジアンフィルタだよ?
この5年でどれほどベイジアンフィルタが進化したのか知らないが、相対的に見てspamの進化の方がずっと速い。
ベイジアンで弾けないspamの割合は増える一方。spamassassinのBAYES_*もあまり効果は感じない。
日本語のspamにはそこそこ効くけどね。
16000通/週を受け取っているので、ほしい数字があったら時間ができたときに出しますよ。
spam率は22%。メールアドレスは基本的に晒していて、トラフィックは技術系ML中心です。
Re:精度 (スコア:1, 興味深い)
手元のDBにはボディブロウのように効いてきていると感じます。
bogofilterやbsfilterでのフィルタリングは通用しなくなり、とうに諦めました。
今もベイジアンフィルタでOKという人は、何を使っているんでしょうか。
また、どのくらいの量のspamを受け取っているんでしょうか。
Re:精度 (スコア:1)
途中で誤学習した可能性があるので、一度リセットしてみたらどうですか?
Re:精度 (スコア:1)
私個人のメールアドレスでのここ数日の状況は、一日あたりの
spamは130通程度、spamでないものが40通ぐらいとなっています。
POPFileのコントロールパネルに表示されている分類精度は99.84%
となっていますが、実際にはわずかにそれを下回るぐらいかと思い
ます。最近再学習させていないので、1日に1~2通判定を通り抜け
てくるspamがあるもので。
個人のメールアドレスだとか、ここ何年かはサイトやBBSではこ
のメールアドレスを出していない(ユーザー登録などには使用)とか、
メーリングリストはソフトメーカーのサポート系ぐらいしか入って
いないとか、最新の(?)spamを送るようなところから来ていないだ
けかもしれませんが、私の場合はこれでほとんど大丈夫です。
Re:精度 (スコア:1)
ました。期間が3年弱で、判定したメール総数が10万通ほどです。
年々spamが増えていて、今年は月に3000通を突破……。
Re:迷惑メールは...。 (スコア:1, 参考になる)