Spamassassin+ProcmailによるSPAM対策

Mail System Postfix SMTP-Auth SMTP-Auth+TLS SMTP+Virtual Qpopper Qpopper/SSL Courier-IMAP FetchMail Procmail WebMail AntiVirus Relay Mail

今まで、ProcmailでSPAM対策をしてきましたが、新しいSPAMがくるたびにパターンのフィルタを書くのが面倒くさくなってきてました。そこで少し調べたところ灯台下暗しで、RedHatのCDにも入っているSpamassassinというお利口なツールがあることがわかり導入しました。単にヘッダのパターン認識だけでなく、メール全体の特徴からSPAMか否か判断すると共に、学習してして精度が上がってくるとのこと。今のところ、海外からのSPAMはきれいにはじかれており、当然「未承諾広告※」もはじかれており、誤認識もないようです。誤認識したら修正も簡単です。検出の閾値は今後の様子をみて調整することになると思います。

その後の調査で、Spamassassinはバージョン2.50以降でかなり機能が変更されており、フィルタのほか再学習機能も2.50からのサポートであることが判明し、最新版の2.60に乗り換えました。RedHat9標準のものは、2.44なので本家から持ってくることになります。

■Procmailのインストール

Spamassassinを使うにはメール振り分け機能が必要になり、これにはProcmailを使用します。おやじは既に使用していたので、チョコット設定を変更しただけです。RedHatでは、procmailはプレインストールされているので、設定のみで使用できます。一応、whichコマンドでインストールされているか確認します。
$ which procmail
/usr/bin/procmail
上記のように、procmailのパスが表示されればインストールされています。

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

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

■Spamassassinのインストール

RedHatには、SpamassassinのRPMが用意されていますが古いので、本家あるRPMを持ってこようとしたのですがRedHat7.3+perl5.6.1用なので、SRPMを落としてきて、これからRPMを作成してインストールしました。作業は、一般ユーザのhomeディレクトリで行います。ただ、rpm-4.1以降では問題が出てRPMを作成できないので、少し細工して作成しました。作成したRPMはダウンロードに置いておきます。
  1. 作業ユーザのhomeディレクトリにrpmの作成環境(各種ディレクトリ作成とrpm-4.1以降への対策)を作成する。

    $ cd ~
    $ mkdir -p $HOME/rpm/{SOURCES,SPECS,BUILD,SRPMS,RPMS/i386}
    $ echo "%_topdir $HOME/rpm" >> $HOME/.rpmmacros
    $ echo "%_unpackage_files_terminate_build 0" >> $HOME/.rpmmacros


  2. SOURCESディレクトリにSRPMファイルをダウンロードし、パッケージを展開する。このとき、userとgroupが違うと警告が出るが無視してよい。

    $ cd ./rpm/SOURCES
    $ wget http://www.spamassassin.org/released/RPMs/spamassassin-2.60-1.src.rpm
    $ rpm -Uvh spamassassin-2.60-1.src.rpm


  3. SPECSディレクトリに移動し、バイナリRPMを作成する。下記操作で、/RPMS/i386配下に3つのRPMが作成される。

    $ cd ../SPECS
    $ rpmbuild -ba spamassassin.spec


  4. rootになり、作成されたrpmファイルを確認しインストールする。

    $ su
    password:xxxxx
    # cd ../RPMS/i386
    # ls
    spamassassin-2.60-1.i386.rpm
    spamassassin-tools-2.60-1.i386.rpm
    perl-Mail-SpamAssassin-2.60-1.i386.rpm
    # rpm -Uvh *.rpm

■.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を起動しておきます。

# /etc/rc.d/init.d/spamassassin start


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

X-Spam-Status: No, hits=0.8 required=5.0
tests=SPAM_PHRASE_00_01
version=2.44
X-Spam-Level:
*: auto-whitelistとは、過去にSPAM認定されないメールを受信していれば、偶然、誤認定されそうなメールでもボーナスがついて誤認定されない、という大変便利な機能だそうです。

■Spamassassinの設定

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

◆local.cfの日本語対応

Spamassassinの設定ファイルは、上記のユーザのhomeディレクトリに作成される .spamassassin/user_prefsと/etc/mail/spamassassin/local.cfに記述され、前者はユーザ毎に適用され、後者は全てのユーザに適用されます。ここでは、local.cfで設定していくことにし、個別に対処する必要がでてきたら、user_prefsで対応することにしました。試験でわかったのですが、デフォルトのままでは、「未承諾広告※」のような日本語のSPAMは全く引っ掛かりません。そこで、いろいろ調べていたら日本語も含めかなりチューニングされたファイルがありました。多くの方が利用されているようなので、まずはこれを使わせてもらうことにし、運用していく中で自分なりにカストマイズすることにしました。TLECさんのところからファイルをダウンロードして、/etc/mail/spamassassin/local.cfと置き換えて使用します。

# cd /etc/mail/spamassassin
# wget http://tlec.linux.or.jp/docs/user_prefs
# mv local.cf local.cf.bak
# mv user_prefs local.cf


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

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

: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 フォルダに展開する。
    元メールは添付ファイル化されており、そのままでは sa-learn が使用できないので元メールを展開する必要があるが、メーラによってかなり操作が違う。 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

Mail System Postfix SMTP-Auth SMTP-Auth+TLS SMTP+Virtual Qpopper Qpopper/SSL Courier-IMAP FetchMail Procmail WebMail AntiVirus Relay Mail