2007-03-17 OSC2007 Tokyo/Spring

日本 SpamAssassin ユーザ会 配布資料

SpamAssassin の紹介
日本 SpamAssassin ユーザ会 滝澤 隆史

はじめに前回のオープンソースカンファレンス(OSC2006 Tokyo/Fall)に日本 SpamAssassin ユーザー会として初めて出展しました。そこでは、「SpamAssassin って何ですか？」「スパムメールを削除してくるのですか？」「Windows で使えますか？」などの質問を頂きました。
そこで、SpamAssassin とは何かを紹介する資料が必要だと考え、この資料を作りました。

SpamAssassin の紹介
SpamAssassin とは

SpamAssassin に対する評価

SpamAssassin は様々なテストを行ってスパムらしさを判定するメー

Linux New Media Awards 2006

ルフィルタです。

Linux Magazine を発行している LINUX NEW MEDIA が主催した

スパムらしさを判定するテストにはテキスト分析、ベイズフィルタ、Linux New Media Awards 2006 の Best Linux-based Anti-spam Solution 部

DNS ブラックリスト、協調型データベースなどを使います。

門で SpamAssassin は２位以下を大きく引き離して１位を獲得しました。

様々なテストの結果をスパムらしさのスコアとして加算していくため、正常なメールをスパムと誤判定することがが少なくなります。

Datamation Product of the Year 2006 Awards

さらに、プラグインで様々なテストを追加することができます。例

米国 IT 誌 Datamation が主催する Product of the Year 2006 Awards のア

えば、画像スパムに対しては OCR 技術を使ったテストを行うものがンチスパムカテゴリにおいて、受賞候補として商用製品があがってい外部のプラグインとして開発されています。

る中でオープンソースソフトウェアの SpamAssassin が受賞しました。

なお、SpamAssassin は Apache Software Foundation の基に開発が行われています。

日本語対応
SpamAssassin は残念ながら日本語には対応していません。しかし、出来ることと出来ないこと

日本 SpamAssassin ユーザ会の有志により開発された日本語対応パッチよく勘違いされますが、SpamAssassin 単体ではスパムを除去したり、をあてると日本語対応になります。

振り分けした、バウンスメールを送ったりはできません。

この文書の執筆時点では日本語対応パッチは筆者のサイトで配布しSpamAssassin が行うのはスパムらしさのスコアを付け、判定して、ヘッています。

ダに情報を追加したり、書き換えたりすることくらいです。

http://www.emaillab.org/spamassassin/

スパムの除去や振り分けなどを行いたい場合は、サーバとしてはこのパッチを当てると、日本語のルールを書くことができ、また、amavisd-new など、クライアントとしては procmail や maildrop などのベイズフィルタの学習精度も非常に良くなります。そのため、日本語他のソフトウェアと組み合わせて使います。のスパムの検出精度が非常に上がります。
将来は日本語対応パッチを本家の SpamAssassin にマージしてもらう動作環境ように活動する予定です。
Perl 5.6.1 以降が動く環境では SpamAssassin も動くはずです。そのため、最近のほとんどの Linux ディストリビューションや*BSD を含め

日本 SpamAssassin ユーザ会て UNIX 互換 OS では動くはずです。

日本における SpamAssassin に関する情報交換や日本語対応のルール

Windows 環境での動作については別の配布資料のの作成や日本語対応パッチの開発等を目的として 2006 年 3 月に発足し「ウィンドウズ環境における SpamAssassin」をご覧ください。て活動をしています。

なお、後述する日本語対応パッチは Perl 5.8 以降が必要です。

日本 SpamAssassin ユーザ会のサイトは次の通りです。
http://spamassassin.jp/1

2007-03-17 OSC2007 Tokyo/Spring

日本 SpamAssassin ユーザ会 配布資料

SpamAssassin の概要
標準のルールファイル

SpamAssassin が提供するもの

標準で様々なルールが記述されたファイルがインストールされます。

SpamAssassin は次のものを提供しています。

●

スパムらしさを判定する Perl のライブラリ

●

ツール

●

標準のプラグイン●

標準のルールファイル

この標準のルールファイルを使うだけでもある程度のスパムの検出が出来ます。

テストの種類
スパムらしさを判定するためにプラグインで行うことも含めて次のような様々な種類のテストを行っています。

スパムらしさを判定する Perl のライブラリ●

SpamAssassin をインストールすると Mail::SpamAssassin モジュールが Perl のライブラリとしてインストールされます。Perl のスクリプトからこのモジュールを呼び出して使うことによりスパム判定などを行うことが出来ます。
使い方は簡単です。Perl のスクリプトを書ける方であれば簡単に使えるでしょう。

●

use Mail::SpamAssassin;
my $sa = Mail::SpamAssassin->new();
my $mail = $sa->parse($message);
my $status = $sa->check($mail);if ($status->is_spam()) {$message = $status->rewrite_mail();....
}$status->finish();$mail->finish();●SpamAssassin のツール
次のツールが提供されます。
spamassassin

メールがスパムであるかどうかを判定するツール。

spamc

メールがスパムであるかどうかを判定するツール。
spamd のクライアントとして動く。

spamd

メールがスパムであるかどうかを判定するデーモン。
spamc をクライアントとして接続を受け付ける。

sa-learn

ベイズの学習を行わせるツール。

sa-update

最新のルールファイルをダウンロードしてきて更新するツール。

パターンテスト○

ヘッダ○

ボディのテキストパート

○

URI

○

メッセージ全体○

ホワイトリスト・ブラックリスト

国、言語のテスト○

メールが中継された国の一覧○

テキストから言語の判断

ネットワークテスト○

IP アドレスやホスト名○

DNS ブラックリスト○

URIDNS ブラックリスト○

協調型データベース○

送信者認証（SPF, DomainKeys, DKIM）●

ベイズフィルタのテスト●

META テスト

判定後の処理メールがスパムであるかどうかを判定した結果として次の処理を行います。

●

標準のプラグイン
標準のプラグインには次のものがあります。

メールの書き換え○ヘッダの書き換え○

スコアや判定結果のヘッダの追加○

スパムペールのカプセル化（message/rfc822 形式）●

自動学習関連（AutoLearnThreshold、AWL）●

協調型データベース等への報告●

パターンテスト関連●

ベイズフィルタの学習（WhitelistSubject、MIMEHeader、ReplaceTags）●

国、言語関連（RelayCountry、TextCat）●

ネットワークテスト関連（DCC、Pyzor、Razor2、SpamCop、URIDNSBL）●

送信者認証関連（SPF、DomainKeys、DKIM、HashCash）●

その他（AccessDB、AntiVirus）

2

2007-03-17 OSC2007 Tokyo/Spring

日本 SpamAssassin ユーザ会 配布資料

SpamAssassin の使い方
X-Spam-Report:* -0.0 NO_RELAYS Informational: message was not relayed via SMTP
* 1000 GTUBE BODY: Generic Test for Unsolicited Bulk Email* 1.5 RAZOR2_CF_RANGE_E4_51_100 Razor2 gives engine 4 level*confidence above 50%*[cf: 100]* 0.5 RAZOR2_CHECK Listed in Razor2 (http://razor.sf.net/)* 0.5 RAZOR2_CF_RANGE_51_100 Razor2 gives confidence level*above 50%*[cf: 100]* -0.0 NO_RECEIVED Informational: message has no Received headers

インストールSpamAssassin はパッケージシステム等でインストールすることもできますが、日本語対応パッチをあてる必要があるので、手動でインストールを行います。
次のサイトから SpamAssassin の tar ball をダウンロードします。
http://spamassassin.apache.org/

メールのスパムらしさの判定が行われ、X-Spam-で始まるヘッダが次のサイトから日本語対応パッチと説明文書をダウンロードします。

挿入され、判定結果が表示されます。それぞれのヘッダの意味は次のhttp://www.emaillab.org/spamassassin/

通りです。

まず、必要な SpamAssassin の tar ball を展開してできるファイル

X-Spam-Flag

INSTALL の"Required Perl Modules"と"Optional Modules"に記述されている Perl モジュールを必要に応じて予めインストールしてください。

スパムとして判定されたらこのヘッダが挿入されます。

Perl モジュールが入っていないと利用できない機能やプラグインがあX-Spam-Checker-Version SpamAssassin のバージョン表示が記述されます。

ります。

X-Spam-Level

スコアの分だけが*が追加されます。

X-Spam-Status

判定結果の要約が記述されます。てください。

X-Spam-Report

スパムとして判定されたら、このヘッダが挿入され、判定理由の詳細が記述されます。

設定ファイル・ルールファイルの記述方法とプラグインの利用方法spamd と spamc

次に日本語対応パッチの説明文書を読んでインストール作業を行っメールを１通ごとに spamassassin コマンドでチェックしていたら毎OSC2006 Tokyo/Fall で配布した「SpamAssassin のプラグイン紹介」

回初期化のオーバーヘッドがかかります。そのため、たくさんのメーを読んでください。以下のサイトから PDF ファイルがダウンロードでルを効率よくチェックするためにデーモンとして動く spamd と C で書きます。

かれた軽量なクライアントの spamc というものが用意されています。

http://www.emaillab.org/spamassassin/

使い方としては、spamd をデーモンとして常駐させておき、spamc設定ファイル等を変更した場合は、必ず次のコマンドを実行してくコマンドに標準入力からメールを与えます。spamc は UNIX ドメイン

ださい。

ソケットあるいは TCP/IP ネットワーク経由で spamd に接続して、メー$ spamassassin --lint

ルのチェックを行わせます。

何も出力がなければ問題はないです。設定ファイルの記述に間違い

なお、spamd の rc スクリプトはソースコードの tar ball を展開したディがある場合はエラーが出ます。

レクトリの spamd ディレクトリにあるので、プラットフォームに応じて利用してください。

ツールの紹介SpamAssassin が標準で提供しているツールの紹介を行います。

ベイズフィルタの学習 sa-learn
ベイズフィルタは spam（スパムメール）と ham（スパムではないメー

spamassassinル）を標準ではそれぞれ 200 通以上学習しないとベイズフィルタのテ

spamassassin コマンドは Mail::SpamAssassin モジュールのフロントエストを行いません。ベイズフィルタの自動学習機能があるので、それンドとなる Perl のスクリプトです。このコマンドにメールを渡してスぞれ学習するのを待つということも出来ますが、すでにスパムメールパムらしさの判断を行わせることができます。

をたくさん持っているのであれば、sa-learn コマンドで強制的に学習

SpamAssassin の tar ball にはスパムではないメールのサンプルさせることができます。

sample-nonspam.txt とスパムメールのサンプル sample-spam.txt が含まれ次の例では Maildir 形式で溜め込んだスパムメールを学習させていていますので、これを利用して試してみましょう。

ます。メールがたくさんある場合は--progress オプションを付けた方がspamassassin コマンドを使って次のように実行してください。

進捗が見ることが出来て良いでしょう。

$ spamassassin < sample-spam.txt | less
X-Spam-Flag: YES
X-Spam-Checker-Version: SpamAssassin 3.1.8 (2007-02-13) on a.example.org
X-Spam-Level: **************************************************
X-Spam-Status: Yes, score=1002.5 required=5.0 tests=GTUBE,NO_RECEIVED,
NO_RELAYS,RAZOR2_CF_RANGE_51_100,RAZOR2_CF_RANGE_E4_51_100,
RAZOR2_CHECK autolearn=no version=3.1.8$ sa-learn --spam --progress ./1% [=]

3.23 msgs/sec 09m34s LEFT

これと同じようなことをスパムではないメールについても--ham オプ
ションを付けて学習させてください。
32007-03-17 OSC2007 Tokyo/Spring

日本 SpamAssassin ユーザ会 配布資料思われるスコアを 15 として、スコアが 15 以上のメールを spam フォル

なお、ベイズのデータベースはユーザー毎に作成されることに注意してください。特にメールサーバで一括して学習させている場合はダに格納します。スパムではないメールも時々入ってしまい、確実にSpamAssassin を呼び出しているプログラムを実行しているユーザのデー

スパムとは言えないスコアを 5〜15 としてそのスコアのメールをタベースに対して学習を行わせる必要があることに注意してください。

spammy フォルダに格納します。こうすると、サルベージ作業はspammy フォルダだけを見ればよく作業が楽になります。この例で示

ルールファイルのアップデイト sa-update

したスコアの設定値は、運用当初はルールファイルのチューニングや私たちがスパム対策を行うと、スパムを送る側もその対策をすり抜ベイズの学習状況により調整が必要です。筆者のお薦めとしてはそれけるようにスパムメールに工夫を行います。そのため、ルールファイぞれの値を最初は 20 と 10 に設定して、様子を見ながら徐々に下げてルのメンテナンスを行わないと最新のスパムメールに対応できなくないくことです。

ります。

筆者の経験上では 15 以上のスコアはほぼ確実にスパムで、そのため、SpamAssassin はルールファイルを更新する sa-update コマ

SpamAssassin の設定パラメータの required_score のデフォルト値であるンドを用意しています。ウィルスやワームのように時間単位で新しい5 以上になるとほとんどスパムですがときどきスパムでないメールがものが出てくるのとは違うので、１週間に１回程度、短くても１日に混じる状態になります。

１回、実行すればよいと思います。

なお、振り分けするフォルダは予め maildirmake コマンドで作成する必要があります。

使い方（クライアント編）
UNIX 系 OS のクライアント側で SpamAssassin の利用方法として一

fetchmail の準備

番やりやすいのは、fetchmail と procmail や maildrop との組み合わせでfetchmail については説明不要だと思いますが、POP サーバや IMAP用いる方法でしょう。

サーバからメールを取ってきて、他のサーバに転送したり、ローカル

ここでは fetchmail と maildrop を SpamAssassin と組み合わせて使用に配送したりするソフトウェアです。

した例を紹介します。

fetchmail の設定ファイルにおいて、次の例のように mda として"spamc | maildrop"を指定するようにしてください。そうすると、

SpamAssassin の準備

POP サーバ等から取得したメールは spamc に渡され、スパムの判断結

まず、先に紹介した資料を基にして SpamAssassin の設定を行ってく果のヘッダが追加されます。さらに、そのメールは maildrop に渡され、ださい。設定が終わったら spamd をデーモンとして起動してください。
次に、サンプルのメールを spamc に与えて正常に機能しているか確振り分けが行われます。
poll pop.example.org proto pop3
port 995
user foopass secretssl
mda "spamc | maildrop"
fetchallfetchsizelimit 0

認してください。
$ spamc < sample-spam.txt |lessmaildrop の準備
maildrop は procmail ほどは知られていませんが、Maildir 形式のメールボックスをサポートしたメールの振り分けができるメール配送エー実行

ジェント（MDA）です。procmail とは異なり、AWK や Perl の文法に似ているフィルタリング言語を使うため、スクリプトやプログラムを以上の準備が終わったら、fetchmail コマンドを実行してください。

普段書いている人にとっては直感的にフィルタを書くことができます。

エラーがでなければ、それぞれのフォルダに振り分けが行われているはずです。

フィルタは.mailfilter というファイルに記述します。慣れないうちは万が一のメールの消失を防ぐために、次の記述例のように cc コマンド

使い方（サーバ編）で全てのメールのバックアップを取るようにしたらよいでしょう。運amavisd-new と連携ができます、とだけ書いておきます。構築は用が安定したら cc 行を削除したらよいでしょう。

ちょっと大変ですが、興味のある方はがんばってください。

DEFAULT=$HOME/Maildir/

詳細な説明をしたいところですが、時間の関係上できませんでした。

cc $HOME/Mail/backup/
if (/^X-Spam-Level: \*{15,}/)
to $HOME/Mail/spam/if (/^X-Spam-Level: \*{5,}/)
to $HOME/Mail/spammy/
to $HOME/Maildir/

次回にでも機会があれば資料を作るかもしれません。

SpamAssassin の紹介発行日2007 年 3 月 17 日著

滝澤 隆史

なお、この例では SpamAssassin により追加された X-Spam-Level ヘッ
ダの*マークの数により、振り分けを行っています。確実にスパムと4者