spamassassinでヘッダ情報に「X-Spam」を追加する

■spamassassinでヘッダ情報に「X-Spam」を追加する
 ※clamavとamavisd-newを導入済みの環境であることが前提
  「clamassassin」もあるのだが、定番の「spamassassin」にした。
  また、postfix連携とprocmail連携があるが、今回は後者とした。

 Squeezeにclamavを導入。EICARチェック
 http://d.hatena.ne.jp/labunix/20120423

 squeezeのclamavとpostfix連携(amavis) 
 http://d.hatena.ne.jp/labunix/20120430

 参考:Clamavとの連携
 http://www.server-world.info/query?os=Debian_6.0&p=mail&f=6

■「spamassassin」の導入
 ※spamcはspamassassinと一緒にインストールされます。
  インストール直後は無効になっています。

$ sudo apt-cache show spamassassin | grep -A 10 ^Description
Description-ja: テキスト分析を使った Perl ベースの spam フィルタ
 SpamAssassin は非常にパワフルで機能豊富な spam フィルタであり、ホワイトリスト
 の自動作成、RBL テスト、ベイジアン分析、header および body のテキスト分析を
 含む数多くの機能を持ちます。
 ユーザの .procmail 又は .forward ファイルから呼び出されるように設計されて
 いますが、メール配送エージェント (MTA) への統合も可能です。
 .
 本パッケージに含まれるプログラムは、デーモン化された形式の spamassassin
 (spamd) であり、TCP 経由でクライアント (spamc) と通信することにより、
 各メッセージに対してそれぞれ perl を呼び出すオーバーヘッドを削減しています。
 この利点を活用するには、spamc パッケージをインストールすべきです。

$ sudo apt-get install -y spamassassin
$ grep -B 1 ENABLED /etc/default/spamassassin
# Change to one to enable spamd
ENABLED=0

■「/etc/procmailrc」で全ユーザに適用
 ※一度「~/spam」ディレクトリの設定が正常に動作するか確認する為に「No」にしてある点に注意。

$ sudo cat /etc/procmailrc
LOGFILE=$HOME/procmail.log
LOCKFILE=$HOME/.lockfile
MAILDIR=$HOME/

#:0
#* ^Subject:.*iso-2022-jp
#* ^Subject:.*\/.*
#* ? echo "$MATCH" | nkf -me | egrep '未承諾広告'
#spam/.

# X-Spam ヘッダが無ければspamassassinに渡す
:0fw
*!^X-Spam.*
|spamassassin

# X-Spam-StatusがYesなら~/spam/ に移動
:0
* ^X-Spam-Status: No
$MAILDIR/spam/

■サンプルファイルでテスト

$ uuencode /usr/share/doc/spamassassin/examples/sample-spam.txt "spam.txt" | \
  mail -s "spam" `whoami`@nextsqueeze.localdomain

$ grep ^X spam.txt
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on
X-Spam-Level:
X-Spam-Status: No, score=0.6 required=5.0 tests=ALL_TRUSTED,DKIM_ADSP_NXDOMAIN,
X-Original-To: labunix@nextsqueeze.localdomain
X-Virus-Scanned: Debian amavisd-new at nextsqueeze.localdomain

■「spam」ディレクトリに保存された
 ※合わせてディレクトリも自動的に作成される

$ sudo find spam -type f -exec ls -l {} \;
-rw------- 1 root mail 2409 2012-05-01 03:16 spam/new/1335809793.10270_1.nextsqueeze

$ ls -ld spam/*
drwx------ 2 root mail 4096 2012-05-01 03:16 spam/cur
drwx------ 2 root mail 4096 2012-05-01 03:16 spam/new
drwx------ 2 root mail 4096 2012-05-01 03:16 spam/tmp

■「^X-Spam-Status: Yes」にレシピを変更
 ※「procmailrc」の設定変更後にpostfixから呼ばれた際に有効になる為、再起動は無い。

$ sudo cat /etc/procmailrc
LOGFILE=$HOME/procmail.log
LOCKFILE=$HOME/.lockfile
MAILDIR=$HOME/

#:0
#* ^Subject:.*iso-2022-jp
#* ^Subject:.*\/.*
#* ? echo "$MATCH" | nkf -me | egrep '未承諾広告'
#spam/.

# X-Spam ヘッダが無ければspamassassinに渡す
:0fw
*!^X-Spam.*
|spamassassin

# X-Spam-StatusがYesなら~/spam/ に移動
:0
* ^X-Spam-Status: Yes
$MAILDIR/spam/

■閾値のチェック

$ sudo find /etc/spamassassin/ -type f -exec grep -i score {} \;
# required_score 5.0
score    D_SENT_BY_DEBCONF      -5.0
score    D_SENT_BY_AFBACKUP     -5.0
score    D_SENT_BY_APTLC        -5.0
score    D_SENT_BY_ANACRON      -5.0
score    D_SENT_BY_CRON         -5.0

■spamassassinの設定チェック
 ※一度目は権限が不足しているので、「sudo」で実行しなおしている。
  設定変更は行っていない。

$ test "`spamassassin --lint 2>&1 | wc -l`" -eq "0" && echo "ok"
$ test "`sudo spamassassin --lint 2>&1 | wc -l`" -eq "0" && echo "ok"
ok

■設定変更については以下を参照

 参考:SpamAssassinの基本設定
 http://emaillab.jp/spamassassin/basic_configuration/

■既存のルールの確認
 ※treeコマンドである必要は全く無いのだがw。。。
  「-P」オプションでパターン検索できる等、ちょっと面白いので入れてみた。

$ sudo apt-get install -y tree
$ tree -P local.cf /var/lib/spamassassin/
/var/lib/spamassassin/
└── 3.003001
    └── updates_spamassassin_org
        └── local.cf

2 directories, 1 file

■アップデートチェック
 ※以下ではまずディレクトリ名が異なることだけを報告している。

$ sudo sa-update -D --updatedir /tmp/update && echo "ok"
$ tree /var/lib/spamassassin/3.003001/updates_spamassassin_org > old.txt
$ tree /tmp/update/updates_spamassassin_org > new.txt
$ diff new.txt old.txt                                1c1
< /tmp/update/updates_spamassassin_org
---
> /var/lib/spamassassin/3.003001/updates_spamassassin_org

■md5sumで出力してjoinした後に、md5sum値と旧ファイル名を取り出し、スペースを無視してdiffチェック。

$ find /tmp/update/updates_spamassassin_org -type f -exec md5sum {} \; > new_md5sum.txt
$ find /var/lib/spamassassin/3.003001/updates_spamassassin_org -type f -exec md5sum {} \; > old_md5sum.txt
$ join new_md5sum.txt old_md5sum.txt | awk '{print $1" "$3}' > check_md5sum.txt
$ diff -b old_md5sum.txt check_md5sum.txt

■デバッグモードで確認
 現状とアップデートが同じバージョンの為、スキップ、エラーコード1で終了している。

$ sudo sa-update -D 2>&1 | tail -3
 501 03:53:43.733 [10868] dbg: dns: 1.3.3.updates.spamassassin.org => 1293136, parsed as 1293136
 501 03:53:43.733 [10868] dbg: channel: current version is 1293136, new version is 1293136, skipping channel
 501 03:53:43.733 [10868] dbg: diag: updates complete, exiting with code 1

$ sudo sa-update -D > /dev/null 2>&1 ;echo $?
1

■毎日自動的にチェックするようになっているので、放っておいて良い。

$ grep sa-update /etc/cron*/*
/etc/cron.daily/spamassassin:test -x /usr/bin/sa-update || exit 0
/etc/cron.daily/spamassassin:    if [ -d /etc/spamassassin/sa-update-hooks.d ]; then
/etc/cron.daily/spamassassin:        run-parts --lsbsysinit /etc/spamassassin/sa-update-hooks.d
/etc/cron.daily/spamassassin:sa-update
/etc/cron.daily/spamassassin:        echo "sa-update failed for unknown reasons" 1>&2

■デフォルトの設定で課題があるようなら設定変更する方針とする。
 しばらく様子見。
 例えば、私個人しか使わない環境で、わざわざ大きな添付ファイルを送るなど考えられないし、
 大量のメールを送るときは、そのようなテストを想定しているときしかありえない。
 ここは内部メールサーバであるw。