/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

SpamAssassinとQmail

(2009年3月28日に、以前のブログで書いた記事です。)

お久しぶりです、クズローです。卒論も終わり、無事大学院に進学できることになりました。最近はアルバイトのサーバ管理に精を出しています。卒論でだいぶ勤務していなかったので、新しいことがかなり多いのですが...思い立ったらすぐ動ける環境なので、とても魅力的です。

僕はそのアルバイトでは比較的メール関係の作業をすることが多いので、今回はSpamAssassinについて触れてみたいと思います。

SpamAssassin とは、サーバでよく使用されているスパムフィルタです。スパムフィルタは最近ではメーラ(MUA)に組み込まれていることも多く、サーバ側でスパム処理をしてしまうと重要なメールが誤判定されて消失してしまう可能性があるので、サーバで処理するのに反対な方もいます。しかしクライアントに大量にスパムメールが届いてしまう場合はやはりサーバ側で負担するのが理想だと思いますし、そのサーバに届くメールをすべて扱える点でも優れています。

SpamAssassin の基本動作はとてもシンプルです:

  • 「この値を超えたらスパムと判定する」という閾値(required_hit)を設定する
  • 届いたメールを解析し、そのメールの「スパムらしさ」としてスコアを算出する※1
  • スコアが閾値を超えた場合はスパムと判定する

ポイントは、スパムと判定してもヘッダやSubjectを弄るだけで、SpamAssassin は決してメールを捨てたりはしないということです。メールを捨てる処理を担うのは ProcmailQmail-Scanner です。例えば、閾値の2倍程度であればメールはサーバ側で破棄し、他のスパム判定されたメールの判断はクライアントに委ねる、という感じです。Assassin(暗殺者)という名前が付いてしまっているので、とても誤解しやすい気がします。。

この「メールの破棄」に関して、Qmail-Scanner をもう少し見てみましょう。Qmail-Scanner の設定(実行)ファイルは qmail-scanner-queue.pl という Perlスクリプトです。このスクリプトを受信したメールに対して Qmail が実行するのですが、SpamAssassin閾値の他にいくつかの閾値が用意されています:

  • sa-quarantine : SpamAssassin の required_hit + sa-quarantine の値を超えたメールはユーザに送信せず、特殊な処理をする(例えば特別なディレクトリへ保存したり、特定ユーザへ送信したりする)
  • sa-delete : required_hit + sa-delete の値を超えたメールはサーバから削除される

SpamAssassin の挙動しか知らないと、クライアントから「届くはずのメールがない。どうなっているんだ」とクレームが来る可能性があります。クライアントにメールサービスを提供していると、クライアントのメールを見るのも難しかったりするので、メールサーバの管理は一癖も二癖もあるようです。

※この算出法には非常に種類があります。静的にヘッダの解析を行ったり、送信元がRDBに登録されているかチェックしたり、今までサーバに届いたメールからベイズ判定したりもします。