Apr 02, 2003

最近、仕事柄海外の方とのメールの遣り取りが増えてから、以前は気にならなかったスパムが気になるようになってきました。以前は英語のメールをバッサリとスパムと一緒に捨てていたのですが、そうもいかなくなりまして...。そうこうしているうちに、日本語のスパム、スパムもどき(メールマガジンの宣伝っぽいのとか)も増えてきました。いまは一日80通から100通くらい来ています。ウェブページでアドレスを載せていたり、まあいろいろしていますので...。

A Plan for Spam を読んでから、スパムと闘うことに楽しさを見出してしまいそうで、そんなわけで、スパムとの闘いを続けて、いろいろ試した bogofilter におちついています。これを使って、いまのところ満足しています。

最初は procmail でレシピを作っていたんですが、すぐに面倒になりました。spamassassin も試しましたが、誤認識が恐くてやめました。tdma も試したのですが、確認メールを送りつけると理解できなかったり怒っちゃったりしそうな人とのやりとりもあるだろうし、また手動でホワイトリストを維持する気力も体力もないことから、思い止まりました。次に MacOSX の Mail.app のスパムフィルタで学習させていたのですが、大切なメールを度々スパムにされてしまいました。Mozilla 1.3 のは結構よかったのですが、メーラ自体が安定していないのか、度々動かなくなりました。imap だと、スパムかどうかの判断のためにいちいち全てのメールをサーバからもってこないといけないので、動作もちょっと遅いですし、そもそもメーラを限定する使い方は、imap と馴染まないように思えてきました。

いろいろ試してきて、わたしが求めているスパムフィルタは、他の人とちょっと違っているような気もしてきました。自宅でいくつかのドメインとそのメールサーバを運用しているのでアドレスを詐称して送られたスパムの戻りなどもあり、それはスパムフィルタされないように、とかいろいろ注文が多くなってしまいます。

スパムとスパム以外の区別の方法はいろいろありますが、わたしが注目したのはベイズ理論に基づいたスパムフィルタです。「ベイジリアンフィルタ」ていうといいのかな。ベイズ理論については、以前 Hotwired で見て、ちょこちょこ調べていたのですが「A Plan of Spam」(日本語訳) を読んでから、自分で試したくなってしまいました。この文章にあるように、過去のメールから類推してスパムかどうかを判断します。結局、スパムかどうかは本人の主観に基づいた判断になっているような気がするので、スパムフィルタにはちょうどいいのではないかと思い、このベイズ理論を採用したフィルタをいろいろ見ていました。当初はスパムかどうかの判断はメールを見た時点で行うのがよいだろうと思い、メーラに組み込まれた Mozilla にはかなり期待したのですが、普段使い慣れた環境、Emacs + wanderlust があることと、特定のメーラだけがスパムフィルタ機能を持っているとクライアント依存性が高くなってしまい、折角の imap の利点が活かせないと思えてきて、結局あきらめました。

サーバベースのベイズフィルターを探したところ、いくつか見つかったのですが、一番簡単そうに思えた bogofilter をとりあえず使ってみることにしました。bogofilter は mbox 形式のファイルを使って簡単に spam / non-spam の登録ができ、procmail とも簡単に使えそうだったからです。本当は ruby で作っている Bsproc とか、A Plan for Spam の訳者の「自分でやってみた」みたいに自分でごりごり調整したりとかやってみたいのですが、余裕も腕もありません。

ちなみに日本語への対応ですが、手抜きですが次のようにやっています。

bogofilter では単語の切りわけを英語と同様にスペースで行っているようです。そこで、kakasi のわかち書き機能を使って日本語も単語ごとにスペースで区切ってからフィルタに送るようにしました。具体的には


% nkf -m -e spam | kakasi -w | bogofilter -s
% nkf -m -e good | kakasi -w | bogofilter -n

といった感じです。この数ヶ月間のスパムメール 5000通と、スパムでないメール 5000通ほどを登録して、procmail へも組み込みました。レシピには次のように書いています。


:0 HB
* ? nkf -m -e | kakasi -w | bogofilter -l
| dmail +bogofilter

dmail を使っているのは、uw-imapd を利用しているからです。本当はヘッダにスパム情報を入れてニンマリ眺めたいのですが、わかち書きしたあとに bogofilter に流しているので、それはできません。bogofilter の精度が上ってきたら、「-u」をつけて、自動的に学習させてもいいです。だれか bogofilter に kakasi を組み込んでくれないかな。

わたしのいい加減な日本語対応による認識の弱さは母数の大きさで確保します。こんなときに、数年前からコツコツ貯めたメールのアーカイブが役に立ちます。メーリングリストからメールマガジン、エラーメールや cron からの手紙まで、どんどんいれて学習させてしまっています。

かれこれ 2週間ほど bogofilter を運用していますが、だいたい一日1通か2通ほど、スパムを通常のメールとして通してしまいます。逆に必要なメールをスパムとしてしまうことは、この2週間で 8通。微妙なのは、メーリングリストで配信されたスパムです。個人的には欠番があるといやなので、スパムでない、と思っています。残りはだいたい英語のメールマガジンですが、一通、引用だけのメールもひっかかってしまいました。多くのメールを登録して、もうすこし使っていると良くなるかと期待しています。

スパムを大体除去できてよかったのは、PDA などでメールを読んだり、転送するときに不要なメールが来ないことです。また、スパムがない状態だと、メールの振り分けも簡単になりますし。

スパムメール、必要なメールを過去、大量に貯め込んでいる人にしか使えないかもしれませんが、そういう奇特なタイプの人にはおすすめできそうな気がしています。

posted by hirata Apr 02, 2003, 6:44PM | Permalink | Comment | Trackbacks
Comments

ボゴフィルター便利そうですね。
余力があれば、いつかSPAM対策は取り組みたいと思っているのですが、なかなか・・・です。
それにしても、学習機能があるのは興味深いですね。
SPAMばかりのメールアーカイブとクリーンなものも偶然溜め込んでいたので、時間があれば試してみたいですね。

そんなのが、役立つとは・・(笑)

posted by: hirosh on Apr 02, 2003, 10:21PM | link to this commmet

こんにちは。

そうなんです。スパムとは戦いです。

自分はSpamassassinをいれて使っています。

これは一度メーラーで受信をして振り分けで
ゴミ箱行きとするのでゴミ箱を眺めてから本当に
消去する感じですね。

なんか最近docomo.ne.jpからのアダルト系のスパムが多くないですか?
@の前だけ毎回変えてきます。

Spamassassinできちんと印が付くから振り分けはできますが、
タイトルがタイトルなだけにあまり目にしたくないですよね。

一度受信する前にMailblockなどでBlockできるといのですが、
共通の特徴がなかなか見つけられません。

posted by: kengo on Apr 03, 2003, 1:10AM | link to this commmet

今日は、1通のスパムを正常メールと認識されてしまいました。html メールだったのですが、宛先メールアドレスに 「slashmaster@...」「mozilla@...」 とか、エンジニア講読率の高いメールアドレスを入れて、誤認識を誘う企てです。「@docomo.ne.jp」も入っていました。@の前はなにもいれずに。spamicity=0.938864 でした。敵ながら小癪な真似を...。

逆に、会社の広報のアドレスに来たスパムは、フィルタせずに、ちゃんと届きました。えらい。

hirosh さん

ほんと、なにが役にたつのやら。実生活でも、なかなか物が捨てられず、結構溜めこんでしまうのですが、デジタルだと所有コストが低いので、捨てるという発想自体が無駄なのかもしれません。といいつつ、役に立つとは思っていませんでしたが... ;-)

kengo さん

A Plan for Spam と一連の文章を見ていただくとわかるのですが、人間が共通の特徴を抽出する努力をしないで、ベイズ理論で確率をはじいて決めましょう、というのがベイジリアン・フィルタです。逆にいうと、学習、というかフィルタへの登録は個人単位になるので、手間はかかりますし、個人でスパムのアーカイブもっているのは、ちょっと奇特な人かと... ;-)

ベイジアン・フィルタは、いま注目されているようなので、いろいろでてきています。bogofilter 以外にもあるので、いろいろ試して自分にあったものを見つけるといいと思います。

posted by: hirata on Apr 03, 2003, 4:45AM | link to this commmet

なるほど。僕も大学でClementine(SPSS)を使ってメールを解析し、スパムをフィルターするという課題を出されて、四苦八苦した思い出が…(9000メールの統計データとスパムである/なしのデータを解析し、残りの1000メールのスパムである/なしを当てる課題。正答率がそのままランクされた)

僕はメールをTo Do的に使うことにしているので、スパムも必ず読んでいます。とにかくメールが届くと、死ぬほど忙しくない限り、必ずその場で開くので、今のところスパムフィルターは怖くて使えないですね。

まぁ、実際にはスパムのほとんどがhotmailやgeocitiesに仮に作ったアドレスに飛んでいくので、2日にいっぺん、まとめてデリートってやれているのですが…。

posted by: nob seki on Apr 03, 2003, 9:44AM | link to this commmet

spam filter がテストってのは実践的でいいですね。

スパムの時間コストもさることながら、通信コストがかかるのが今の問題です。メールの 50% がスパムなので大したことがないといえば大したことがないのですが、無駄なコストはかけたくないものです。

A Plan of Spam で提案されているフィルタでは、内容の分析の際に、ヘッダも計算に含めているところが面白いです。蓄積したデータから、単語ごとのスパム率を見てニンマリできるのも面白いところです。例えば "nob seki" だけだと スパム率 0.000001% 未満です。完璧ではないのでしょうけど、可能性を感じます。

posted by: hirata on Apr 03, 2003, 12:33PM | link to this commmet

↑は偶然、赤坂の天ぷら屋でhirataさんと遭遇した後に書いていただいたもののようですね。

今も世の中の動きを追うために、スパムもなるべく内容を見るようにしていますが(何が売れている/何を売りたい、など)、インフラが払っているコストを考えると、水際でフィルタリングするのではなく、トラフィックそのものを減らすような方法を考えたくなりますね。

posted by: nob seki on Apr 03, 2003, 2:08PM | link to this commmet

最近はいい感じにフィルタが効いていたのですが、SPAM のフィルタ漏れがありました。ベイジアンフィルタ破りのためか、すべての単語のスペースを「_」(アンダースコア)にしておくってきました。むむー。まだまだ戦いは続くのでしょうか...。

posted by: hirata on Apr 15, 2003, 3:35PM | link to this commmet

こんにちは。
spamassassin も bayesian filter を装備しています。
従来のパターンマッチングによるルールと同様のスコアリング
ができますので、ハイブリッド型フィルタと呼んで良いと思い
ます。
bogofilter と比較した場合、明確な欠点は「遅い」ことです。
マシンパワーが潤沢であるならば、spamassassin を再度ご検
討されるのは如何でしょう。

posted by: 松田陽一 on Jan 18, 2004, 7:37PM | link to this commmet
TrackBacks
Trackback URL: http://daijihirata.com/mt/mt-tb.cgi/285
love & money の題名はスパム
Weblog: Ideal Break
Excerpt: 会社のアドレスにスパムが多い。 スパム対策は Spam Mail Killer というフィルタリングソフトを使っているが、ブラックリストやら条件やらで規則が100以上もあるので、大変なことになって...
Trackbacked on: Jan 16, 2004, 12:07AM