Spamassassin+ProcmailによるSPAM対策(SuSE編)


SuSEにもSpamassassinが用意されていますが、再学習させてもなんとなくSPAMがどんどん増加してきているような気がしたので、3.0系がでていることから検出率向上に期待を込めてこちらに乗り換えることにしました。SuSEは起動スクリプトが特殊なので、一般的にRPMの作成は結構面倒です。そこで、少しググったところ、SuSE用のRPMが見つかったのでそれを使用することにしました。

■Procmailのインストール

Spamassassinを使うにはメール振り分け機能が必要になり、これにはProcmailを使用します。SuSE 9.0/9.1では、procmailはプレインストールされているので、設定のみで使用できます。一応、whichコマンドでインストールされているか確認します。

$ which procmail
/usr/bin/procmail
上記のように、procmailのパスが表示されればインストールされています。

Procmailを使用するには、下記の2つのファイルが必要です。この2つのファイルは、各ユーザのhomeディレクトリに置きます。ここが少し不便で、ユーザごとに設定しなければなりません。共通管理にしたかったのですが、Postfix連携でmbox形式ならできそうですが、Maildir形式ではうまく配送できませんでした。

  ・.forward  : 受信したメールをprocmailに処理させるためのファイル
  ・.procmailrc: レシピとも言われるもので、どのようにメールを配送するかを記述したファイル

■Spamassassinのインストール

SuSEにも先行的なソフトを扱っているプロジェクトがあるのでしょうか? SuSEのミラーサイトから、最新版のRPMをダウンロードできます。おやじはRikenさんのサイトからダウンロードしてきてインストールしました。

  1. 作業ディレクトリに、perl-spamassassin-3.0.2-1.i586.rpmとspamassassin-3.0.2-1.i586.rpm をダウンロードしてきて、インストールします。

    # wget http://ftp.riken.jp/Linux/suse/people/choeger/spamassassin/RPM/9.0-i386/perl-spamassassin-3.0.2-1.i586.rpm
    # wget http://ftp.riken.jp/Linux/suse/people/choeger/spamassassin/RPM/9.0-i386/spamassassin-3.0.2-1.i586.rpm
    # rpm -Uvh perl-spamassassin-3.0.2-1.i586.rpm spamassassin-3.0.2-1.i586.rpm


  2. SuSEのデフォルトのRPMから、即ち2.6系からアップデートした場合、3.0系では -a オプションがなくなった関係で設定変更しないと起動エラーになります。本設定変更はYaSTで行います。(新規の場合は本作業は不要)

    ・YaST コントロールセンタを起動し、「システム」の「/etc/sysconfig エディター」を起動する。
    ・「設定のオプション」 で 「Network」 -> 「Mail」 -> 「Spamassassin」 -> 「SPAMD_ARGS」と開き、「設定」欄でパラメータから「-a」を削除(「-d -c -L」を残す)し、 「完了」 ボタンを押す。

■.forwardファイルの設定

各ユーザのhomeディレクトリに下記要領で、Procmailを起動させるための.forwardファイルを作成します。

$ cd ~
$ vi .forward

"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #oyaji"


■.procmailrcファイルの設定

各ユーザのhomeディレクトリに下記要領で、メール配送ルールを記述した .procmailrc ファイルを作成し、受信メールをSpamassasinに配送しチェックさせるようにします。

$ cd ~
$ vi .procmailrc
PATH=/bin:/usr/bin:/usr/local/bin     <--環境変数の設定
MAILDIR=$HOME/Maildir                 <--メールディレクトリへのパス
DEFAULT=$MAILDIR/                <--下記配送条件にマッチしなかった時の配送先
LOGFILE=$MAILDIR/procmaillog        <--ログの保存先を指定
LOCKFILE=$HOME/.lockmail             <--ロックファイルのパスを指定

:0fw
*!^X-Spam.*
|/usr/bin/spamc


■Spamassassinの動作確認

ここまでで一通りの設定が終了したので、Spamassassinの動作確認をしますが、まずはspamdを起動しておきます。

# chkconfig spamd on
#
/etc/init.d/spamd start


ここで、設定したユーザに何でもいいのでテストメールを送ります。このとき、そのユーザで初めてSpamassassinが機能し、ユーザのhomeディレクトリ配下に、.spamassassinフォルダが作成され、更にその配下にuser_prefsという制御ファイルと auto-whitelist* が作成されます。同時に、そのメールのヘッダに、下記のような行が追加されているはずです。SPAMメールと判定されると、「X-Spam-Status: No」がYesとなり、「X-Spam-Level: *****」とSPAM度に応じて*が付加されます。

X-Spam-Status: No, score=-2.4 required=7.0 tests=ALL_TRUSTED autolearn=ham
version=3.0.2
X-Spam-Level:
X-Spam-Checker-Version: SpamAssassin 3.0.2 (2004-11-16) on
mail.aconus.com
*: auto-whitelistとは、過去にSPAM認定されないメールを受信していれば、偶然、誤認定されそうなメールでもボーナスがついて誤認定されない、という大変便利な機能だそうです。

■Spamassassinの設定

Spamassassinの動作確認ができたので、最終的な設定をします。

◆user_prefsの日本語対応

Spamassassinの設定ファイルは、上記のユーザのhomeディレクトリに作成される .spamassassin/user_prefsと/etc/mail/spamassassin/local.cfに記述され、前者はユーザ毎に適用され、後者は全てのユーザに適用されます。ここでは、個別に対処するため user_prefsで対応することにしました。このファイルは例によって日本語も含めかなりチューニングされたTLECさんのファイルを使わせてもらいました。(2005.01.11現在、3.0系対応になっているようです) まずは、各ユーザ毎にTLECさんのところからファイルをダウンロードして、~/.spamassassin/user_prefsとして置き換えて使用します。

$ cd ~/.spamassassin
$ wget -O user_prefs http://tlec.linux.or.jp/docs/user_prefs

◆.procmailrcファイルの追加設定

Spamassassinは、ルールに従ってSPAM判定してマーキングするだけなので最終的な処理をProcmailで行います。誤判定によるメールの喪失も考えられるので、おやじはSPAM専用の/dev/nullユーザ(例えば、spamというユーザを作成)を作成し、そこに配送することにしました。このユーザをimapで監視し、明らかなSPAMは廃棄し、誤判定したものは再学習させた後、最終ユーザに転送することにしました。最終的な.procmailrcは以下のとおりです。最後の設定で、spam というユーザに SPAM 判定したメールが配送されます。

PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
LOGFILE=$MAILDIR/procmaillog
LOCKFILE=$HOME/.lockmail

:0fw
*!^X-Spam.*
|/usr/bin/spamc

:0:
*^X-Spam-Status: Yes
! spam@mail.aconus.com

■誤認識メールの対処

Spamassassinには、誤認識(SPAM<->HAM両方向)したメール使って認識精度を向上させるためのsa-learnというツールがあるので、これを使えば良いようです。具体的な方法はいろいろあろうかと思いますが、メーラとしてOutlookExpressを使用した場合の運用例をあげておきます。

前提としては、前項のような設定により、SPAM 判定したメールが spam というユーザに配送されるものとします。

  1. このspamユーザは使用者全員がアクセスする。誰のメールが誤配送されるかわからないので、imapならいいがpop3なら受信しても消さないように設定
  2. このspamユーザに、spamとhamというディレクトリを作成する。
  3. 誤認識して各ユーザに配送されてしまったspamメールは、各人がspam ユーザのspamフォルダに移動する。
  4. 誤認識してspamユーザに配送されてしまったhamメールは、おやじもしくは各ユーザがspamユーザの内容を確認する。
  5. 以降、4項のメールがspamにならないよう、添付ファイル化された元のメールをspamユーザのhamフォルダに展開する。
    添付ファイル化されているのでメーラによってかなり操作が違う。OutlookExpressの場合は、自分のパソコンのどこかに一回添付ファイルを展開し、そのファイルを右クリックでOutlookExpressで開いて、「ファイル」の「フォルダにコピー(移動)」でspamユーザのham フォルダに入れる。
  6. 後は、下記コマンドでそれぞれ学習させる。形式は下記。

     sa-learn --認識させたいモード(spam/ham)  認識させたいメールがあるフォルダ(ファイル)

    [HAMと誤認識した場合]

     sa-learn --spam /home/spam/Maildir/.spam/cur

    [SPAMと誤認識した場合]

     sa-learn --ham /home/spam/Maildir/.ham/cur