SpamassassinのバーチャルSMTPサーバ対応(CentOS4.x編)


Postfix+MySQLでバーチャルドメイン対応のSMTPサーバを構築しましたが、バーチャルで動作せるとprocmailが使えずSpamassassinが従来の方式では使用できません。いろいろ調べて、PostfixのフィルタのReadmeを参考にフィルタリングすることにしました。

■事前準備

事前準備として、Spamassassinのインストールとフィルタ専用のユーザおよび作業ディレクトリを作成しておきます。

  1. まずは、フィルタ専用のユーザおよび作業ディレクトリを作成する。

    # 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


  2. Spamassassin関連のパッケージのインストール状況を確認する。

    # yum list | grep spamassassin
    spamassassin.i386       3.0.4-1.el4    installed

  3. インストールされていなければ、下記でインストールする。

    # yum install spamassassin

  4. システム起動時に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 に設定を行います。

  1. 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}


  2. 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


  3. ここで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

  4. 上記で動作確認できたら、Spamassassinの設定ファイルは、例によって日本語も含めかなりチューニングされたTLECさんのファイルを使わせてもらいました。

    # cd /home/filter/.spamassassin
    # wget -O user_prefs  http://tlec.linux.or.jp/docs/user_prefs



Topページへ