画像やリンクが無効になっている可能性もあるのでご了承下さい。
先に Postfix + PostfixAdmin + MariaDB (MySQL) + Dovecot + Amavisd + Spamassassin で MTA を構築した記事を書くべきだったんだけど、先に運用上、勘違いして Spamassassin への学習が動作に反映されていなかったのでメモ代わりの記事を書いておくことにした。
動作概要としては Postfix が受けたメッセージをあれこれ宜しくやって貰って最終的にメッセージをストアするのは「virtual_uid_maps」で指定された UID を持つユーザーとなる。この UID に合わせた UNIX アカウントを例えば「useradd -u 10000 -s /sbin/nologin -d /var/vmailbox vm」などとして作成してあげる。
これで実際にメールが配送されると、作成した UID 10000 になっているユーザーのホームディレクトリ「virtual_mailbox_base = /var/vmailbox」で指定した階層には「.spamassassin」とディレクトリが作成され、以下に次の様なファイルが作成されていた。
ls -l /var/vmailbox/.spamassassin/
合計 3696
-rw------- 1 vm vm 585728 11月 20 21:35 bayes_seen
-rw------- 1 vm vm 4870144 11月 20 21:35 bayes_toks
-rw-r--r-- 1 vm vm 2940 11月 19 15:28 user_prefs
よって、自分はこの作成されていた所へ sa-learn –spam をしてスパムメールの学習を行えばだとか user_prefs に whitelist_from, blacklist_from を記述すれば良いと考えてしまっていた。
この大きな間違いに気づかず、ホワイトリストに追加したはずのメールすら Spam 判定喰らったりとかしていたのである。Spam 判定が正常に行われない原因を探していたら、そもそも参照される user_prefs や bayes_{seen,toks} は vm ユーザーではなくて amavis ユーザーにあるとの事だった。
結果として今まで勘違いで学習させていた vm ユーザーのデータを、amavis ユーザーの物へコピーしてあげた。
cp /var/vmailbox/.spamassassin/* /var/spool/amavisd/.spamassassin/
chown amavis:amavis /var/spool/amavisd/.spamassassin/*
学習データを反映させることに関してはこれで完了したが、今後の学習方法を考えると操作が若干面倒な事になった。
実際に配送された SPAM をスマホなりなんでもいいから、IMAP で接続した MUA から該当メールを迷惑メールとして処理させる。するとそのまま日本語で「迷惑メール」というディレクトリにメールが移動される。この移動された「迷惑メールディレクトリ以下」にあるメールを直接 sa-learn –spam するようにスクリプトを書くことにした。
バーチャルメールボックスの構造は Base 以下 /domain/username/ となっている事、「迷惑メール」という IMAP 上のディレクトリはメールボックスを直接覗くと「.&j,dg0TDhMPww6w-」となっている事に注意。
#!/bin/bash
virtual_mailbox_base=/var/vmailbox
# MAILADDRESS = <local_part@domain_part>
local_part=foo
domain_part=example.com
user=amavis
spam_dir=$virtual_mailbox_base/$domain_part/$local_part/Maildir/.\&j\,dg0TDhMPww6w-/cur
work_dir=/var/tmp/spam.`date +%s`
# Check if file exists.
ls $spam_dir/* > /dev/null 2>&1
if [ $? -eq 0 ]; then
# Make working directory.
mkdir $work_dir
mv $spam_dir/* $work_dir/
# To read from amavis user.
chmod 644 $work_dir/*
# Learning!
sudo -u $user /bin/sa-learn --spam $work_dir/*
# Delete working directory.
rm -fr $work_dir
fi
このスクリプトの動作の流れとしては……
1. 「迷惑メール」ディレクトリのパス取得を行い、作業ディレクトリをユニークに作成する為のパスを作成。
2. 「迷惑メール」ディレクトリ以下にファイルが存在するかチェックを行う。存在しなければここで終了。
3. チェックの結果、ファイルが存在すれば作業ディレクトリを作成し、迷惑メールディレクトリ以下のファイルを作業ディレクトリに移動させる。
4. amavis ユーザー権限で読み込ませるので 644 にしておく。
5. amavis ユーザー権限で sa-learn –spam を実行する。
6. 完了後に作業ディレクトリを削除することで、迷惑メールも共に削除。
これで IMAP で迷惑メールとしてマークしたメールを直接 SPAM として学習を行った後、削除するという事が一発で出来るようになった。root で動かしているスクリプトなので怖い物があるが。
実際の学習データを用いた判定結果はこれ。
X-Spam-Flag: YES
X-Spam-Score: 44.55
X-Spam-Level: ********************************************
X-Spam-Status: Yes, score=44.55 tagged_above=-999 required=6.2
tests=[ARIN=0.1, ARIN_RAZOR=3.5, BAYES_99=1.5, BAYES_999=2,
BLACK_DCN=3.5, CONTENT_TYPE_PRESENT=-0.1, DIRECTUNKNOWN=0.3,
HTML_FONT_FACE_BAD=0.981, HTML_MESSAGE=1, MIME_HTML_ONLY=0.4,
ONLY1DCN=3, ONLY1HOPDIRECT=1, ONLY1HOPDIRECTARIN=1,
RAZOR2_CF_RANGE_51_100=2.5, RAZOR2_CF_RANGE_E8_51_100=1.886,
RAZOR2_CHECK=1, RAZOR99=1.5, RCVD_IN_SBL_CSS=3.335, RDNS_NONE=0.793,
SPF_PASS=-0.001, SUBJ_ALL_CAPS=1.506, SURBL99=3.5, SURBL_DCN=5.5,
URIBL_BLACK=1, URIBL_DBL_SPAM=2.5, URIBL_JP_SURBL=1.25,
URIBL_SBL_A=0.1] autolearn=spam autolearn_force=no
X-Spam-Flag: NO
X-Spam-Score: -4.101
X-Spam-Level:
X-Spam-Status: No, score=-4.101 tagged_above=-999 required=6.2
tests=[ANATA=0.5, BAYES_00=-6, CONTENT_TYPE_PRESENT=-0.1,
DKIM_SIGNED=0.1, ISO2022JP_BODY=-0.1, ISO2022JP_CHARSET=-0.1,
JOUHOU=0.1, MISSING_MID=1, MURYOU=0.2, ONEGAI=0.2, SPF_PASS=-0.001,
SUPPORT=0.1] autolearn=no autolearn_force=no
と、このように SPAM であればスコアはかなり高くなるようになり「迷惑ではない」いわゆる HAM メールではスコアは下がりマイナスへ行くこともあるようになった。
コメント