SpamassassinのバーチャルSMTPサーバ対応(CentOS4.x編)
Postfix+MySQLでバーチャルドメイン対応のSMTPサーバを構築しましたが、バーチャルで動作せるとprocmailが使えずSpamassassinが従来の方式では使用できません。いろいろ調べて、Postfixの
フィルタのReadmeを参考にフィルタリングすることにしました。
■事前準備
事前準備として、Spamassassinのインストールとフィルタ専用のユーザおよび作業ディレクトリを作成しておきます。
- まずは、フィルタ専用のユーザおよび作業ディレクトリを作成する。
# groupadd -g 10001 filter
# useradd -g filter -u 10001 -d /home/filter -s /bin/false filter
# mkdir /var/spool/filter
# chown filter:filter /var/spool/filter
# chmod 700 /var/spool/filter
|
- Spamassassin関連のパッケージのインストール状況を確認する。
# yum list | grep spamassassin
spamassassin.i386 3.0.4-1.el4 installed |
- インストールされていなければ、下記でインストールする。
# yum install spamassassin |
- システム起動時にspamassassinが自動起動できるようにし、起動する。
# chkconfig spamassassin on # chkconfig --list spamassassin
spamassassin 0:off 1:off 2:on
3:on 4:on 5:on 6:off
# /etc/init.d/spamassassin start |
■フィルタスクリプトの作成
フィルタのReadmeを参考に、以下のようなフィルタスクリプトを /usr/local/bin/spam-filter として作成しました。処理としては、メールをSpamassassinに渡し、Spam-StatusがYesになっている場合はspam専用ユーザ(ex. 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/main.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.4 (2005-06-05) on server.aconus.com
X-Spam-Level:
X-Spam-Status: No, score=-2.8 required=5.0 tests=ALL_TRUSTED autolearn=ham
version=3.0.4 |
- 上記で動作確認できたら、Spamassassinの設定ファイルは、例によって日本語も含めかなりチューニングされたTLECさんのファイルを使わせてもらいました。
# cd /home/filter/.spamassassin
# wget -O user_prefs http://tlec.linux.or.jp/docs/user_prefs
|
Topページへ