モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

SpamAssassinのルールのポイント付けをベイジアンフィルタで自動学習するアイデア

早速まっちゃさんからフォローが。ありがたや…
そのまっちゃ139勉強会でもちょこっとだけ話してたことを思い出したので、エントリー上げときます。


SpamAssassinのルールのポイント付けを、今だと経験則とかカンで決めてるわけですが、これをもうちょっと精度良く、自動で出来ないかなあ、というのがあります。
ポイントを自動で決められるなら、こういうルールも有効じゃね?と思ったものを書いとけば、勝手に学習してくれて、それがどのくらい使える指標か、までわかるだろうと。


これってまさにベイジアンフィルタでやれば良いことだと思うのです。


以下に、SpamAssassin-jp-MLで書いた説明を転記します。


自分の考えてるイメージを具体例を書いて説明してみます。
今日来てたスパムを例にしてみます。

…略
From: suki_suki_daisuki_xxx@docomo.ne.jp
Message-ID: 20061031125156
X-Spam-Report: 
	* -0.1 CONTENT_TYPE_PRESENT exists:Content-Type
	*  0.0 NO_REAL_NAME From: does not include a real name
	*  1.5 SHIFT_JIS2 Content-Type: text/plain; charset="SHIFT_JIS"
	*  2.0 MATCH_S25R match S25R FQDN pattern
	*  2.0 SJIS_C BODY: SHIFT_JIS message body
	*  4.5 BAYES_99 BODY: Bayesian spam probability is 99 to 100%
	*      [score: 0.9998]
	*  1.0 SHIFT_JIS1 FULL: charset="shift_jis"
	*  0.5 RCVD_IN_CHINA RBL: Received via a China IP address in china.blackholes.us
	*      [220.194.46.187 listed in china.blackholes.us]
	*  2.0 RCVD_IN_SHORT_RBL_JP RBL: Received via a relay in 
…略

好きです。
大好きです。
私が誰か、分かりますか?分からなくても…ある程度限定されるよね?
あなたのアドレスを知ってるんだし。
…略

というように、SpamAssassinを通った後のメールにルールと点数が付けられますが、これをヘッダの内容込みで再度ベイジアンフィルタに通すと、他の「分かりますか」とか「限定」とかの単語の他に「BAYES_99」や「SJIS_C」といった単語も学習されるのではないかと思います。
そうするとルールセット自体を、普通の単語と同列に、ベイジアンフィルタの項目の一つとして学習されるのではないかと。


ルールセットだけを対象にして、たとえばこの例では

CONTENT_TYPE_PRESENT
NO_REAL_NAME
SHIFT_JIS2
MATCH_S25R
SJIS_C
BAYES_99
SHIFT_JIS1
RCVD_IN_CHINA
RCVD_IN_SHORT_RBL_JP

だけを、もう一つベイジアンフィルタ用DBを用意しておき、学習させるという方法でも良いと思います。


最終的に、そのルールセットで学習したベイジアンフィルタのポイントで、スパムを判定するシステムにするというイメージです。
なので、ルールセットはマッチングルールを書くだけで、ポイントは指定しない(指定してあっても、それは初期値となる)という感じです。


(追記)

学習方法について追記。
スパムに引っかかったものだけじゃなく、スパムとは判断されなかったものも、スパム・ハム(スパムではないメール)とフラグをつけて学習させます。
んで、スパムとハムとは、SpamAssassinが自己判断した結果から行います。SpamAssassinの判定結果は99%以上なので、たまに間違っても、だいたい学習されていくと思います。
また、スパムのハニーポットを作っておき、そこ宛は全てスパムとして学習させても良いでしょう。そうなるといかに優秀なハニーポットを作るかも重要になってきそう。


試験運用するには、実は結構簡単にこの構成を作れそうで、SAのreportを必ず出す、にしておいて、学習してないサーバ版POPFileを動かしてやります。SAのフラグを見て自動学習するようにパッチ書けばできあがり。
学習結果を解析すると、どのパラメータ(の組み合わせ)がどのくらいの信頼性かが判別できるはずです。
これを手でSAのルールへ反映させていくことも出来るでしょうし、このシステム自体で実運用させることも出来るかと思います。