SpamassassinのバーチャルSMTPサーバ対応(SuSE9.2/9.3編)
Postfix+MySQLでバーチャルドメイン対応のSMTPサーバを構築しましたが、バーチャルで動作せるとprocmailが使えずSpamassassinが従来の方式では使用できません。いろいろ調べて、Postfixの
フィルタのReadmeを参考にフィルタリングすることにしました。
■事前準備
事前準備として、Spamassassinのインストールとフィルタ専用のユーザおよび作業ディレクトリを作成しておきます。
- まずは、フィルタ専用のユーザおよび作業ディレクトリを作成する。
# mkdir /home/filter
# groupadd -g 10001 filter
# useradd -g filter -u 10001 -d /home/filter -s /bin/false filter
# chown filter:filter /home/filter
# mkdir /var/spool/filter
# chown filter:filter /var/spool/filter
# chmod 700 /var/spool/filter
|
- YaSTで perl-spamassassin とspamassassin をインストールします。
・YaST コントロールセンタを起動し、「ソフトウェア」の「ソフトウェアのインストール/削除」を起動する。
・「フィルタ」 を 「検索」 とし検索欄に 「spamassassin」 と入力し 「検索」 ボタンを押す。
・右側に該当するパッケージが出てくるので、perl-spamassassin とspamassassinにチェックマークを入れて 「了解」 を押しておしまい。
- SuSEのデフォルトのRPMから、即ち2.6系からアップデートした場合、3.0系では -a
オプションがなくなった関係で設定変更しないと起動エラーになります。本設定変更はYaSTで行います。(新規の場合は本作業は不要)
・YaST
コントロールセンタを起動し、「システム」の「/etc/sysconfig エディター」を起動する。
・「設定のオプション」 で 「Network」
-> 「Mail」 -> 「Spamassassin」 -> 「SPAMD_ARGS」と開き、「設定」欄でパラメータから「-a」を削除(「-d
-c -L」を残す)し、 「完了」 ボタンを押す。
- ここでspamdを起動しておきます。
# chkconfig spamd on
# /etc/init.d/spamd start
|
■フィルタスクリプトの作成
フィルタのReadmeを参考に、以下のようなフィルタスクリプトを /usr/local/bin/spam-filter として作成しました。処理としては、メールをSpamassassinに渡し、Spam-StatusがYesになっている場合はspam専用ユーザ(spam@example.com)に配送するようにしました。誤配送があるので、いきなり捨てることはしていません。
# vi
/usr/local/bin/spam-filter [i]で以下を挿入。
#!/bin/sh
# Simple
shell-based filter. It is meant to be invoked as follows: # /path/to/script
-f sender recipients...
# Localize
these. INSPECT_DIR=/var/spool/filter SENDMAIL="/usr/sbin/sendmail
-i" SPAMASSASSIN=/usr/bin/spamc
# Exit codes from
<sysexits.h> EX_TEMPFAIL=75 EX_UNAVAILABLE=69
# Clean up when
done or when aborting. trap "rm -f in.$$" 0 1 2 3 15
# Start
processing. cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit
$EX_TEMPFAIL; }
cat | $SPAMASSASSIN -x > in.$$ grep -e
"^X-Spam-Status:.Yes" in.$$ \ && $SENDMAIL "spam@example.com"
< in.$$ \ || $SENDMAIL "$@" <
in.$$
exit $?
[Esc]、[:]、[w]、[q]で保存。
# chmod 700
/usr/local/bin/spam-filter # chown filter:filter
/usr/local/bin/spam-filter
|
■Postfixの設定
Postfixにフィルタ処理をさせるため、/etc/postfix/master.cf に設定を行います。
-
Postfix が コンテンツフィルタにメールを配送するように設定する。
# ==========================================================================
# service type private unpriv chroot wakeup maxproc
command + args
# (yes) (yes)
(yes) (never) (100)
# ==========================================================================
filter unix - n
n - 10
pipe
flags=Rq user=filter argv=/usr/local/bin/spam-filter -f ${sender}
-- ${recipient}
|
-
SMTP で到達したメールのみにコンテンツフィルタを使うためsmtp / smtps エントリに "-o content_filter=filter:dummy"
を追加する。
# ==========================================================================
# service type private unpriv chroot wakeup maxproc
command + args
# (yes) (yes)
(yes) (never) (100)
# ==========================================================================
smtp inet n -
n - -
smtpd
-o content_filter=filter:dummy
smtps inet n -
n - -
smtpd
-o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
-o content_filter=filter:dummy
|
- ここでpostfixを再起動し、メール送信テストをしてみる。
# /etc/init.d/postfix restart
|
このとき、初めてSpamassassinが機能し、filterユーザのhomeディレクトリ配下に、.spamassassinフォルダが作成され、更にその配下にuser_prefsという制御ファイルと
auto-whitelist*
が作成されます。同時に、そのメールのヘッダに、下記のような行が追加されているはずです。SPAMメールと判定されると、「X-Spam-Status:
No」がYesとなり、「X-Spam-Level: *****」とSPAM度に応じて*が付加されます。
X-Spam-Checker-Version: SpamAssassin 3.0.0 (2004-09-13) on
server.aconus.com
X-Spam-Level:
X-Spam-Status: No, score=-0.1
required=8.0 tests=CONTENT_TYPE_PRESENT,
ISO2022JP_CHARSET,X_MAILER_PRESENT
autolearn=ham version=3.0.0 |
- 上記で動作確認できたら、Spamassassinの設定ファイルは、例によって日本語も含めかなりチューニングされたTLECさんのファイルを使わせてもらいました。
# cd /home/filter/.spamassassin
# wget -O user_prefs http://tlec.linux.or.jp/docs/user_prefs
|
Topページへ