モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

Postfixの設定でClamSMTPとSpamAssassinを利用する

Postfix-MLで質問した件のまとめ。


自分とこのサーバは、ClamSMTPを利用してClamAVでMTAでのウイルスメールフィルタをしていますが、この場合だとSpamAssassinを利用するとき、.forwardとかでユーザ毎にSpamAssassinを利用してもらう場合は良いのだけども、全アカウントにSpamAssassinを一度通したい場合、簡単な設定方法が見あたらず、どうしたもんかなあと思っていました。


同じ構成、目的で
Postfix+ClamSMTP の配送中に SpamAssasin をかける - Mimori's Algorithms tDiary(2005-02-09)
で実現されているものの、Rubyでフィルタを書いて実現されていて、もっと設定だけで簡単にできそうなのになんとかならんかな〜、と思いMLで質問してみました。

Postfixの設定だけで可能な方法と、SpamPDというSpamAssassinをメールProxyとして利用できるツールと、紹介していただきました。

Postfixの設定だけで可能な方法

pickupのところから、content_filterでClamSMTPを利用しているのがミソですね。
DebianのClamSMTPの設定は、標準だとInが10026でOutが10025と、ClamSMTPの標準とはポートがIn/Out逆になっているので注意。
以下の設定は、自分のDebian(sarge)の標準設定で動いたものです。

/etc/postfix/master.cf

#
# SpamAssassin用設定 (下記設定を追加)
# spamcコマンドのパラメータ等は適宜修正する
# 
spamd     unix  -   n   n   -   -   pipe
    user=spamd argv=/usr/bin/spamc
        -e /usr/sbin/sendmail -oi -f ${sender} -- ${recipient}
#
# ClamSMTP用設定 (下記設定を追加)
#
scan     unix  -        -       n       -       16      smtp
localhost:10025 inet n  -       n       -       16      smtpd
        -o content_filter=
        -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
        -o smtpd_helo_restrictions=
        -o smtpd_client_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks_style=host
#
# sendmailコマンドからのメールをClamSMTPに渡す
#  (既存のpickupサービスの設定を修正)
#
pickup    fifo  n       -       n       60      1       pickup
        -o content_filter=scan:[127.0.0.1]:10026

/etc/postfix/main.cf

#
# 外部等からのメールをSpamAssassinに渡す
#
content_filter = spamd
receive_override_options = no_address_mappings

SpamPDを利用するもの。

(追記)

この方法の一部改善したものを
モーグルとカバとパウダーの日記 - Postfixの設定でClamSMTPと、受信時だけSpamAssassinを利用する
にて公開していますので、こちらも参照下さい。


spampd - Spam Proxy DaemonSpamAssassinをメールProxyとして使うためのツールです。
Debianなら普通にaptでインストールできます。

これを使うとさらにわかりやすい設定に出来ます。
受け取るポート:受け取るデーモンという表記とすると、こんな感じの構成です。
25:smtpd(Postfix)->10026:clamsmtpd(ClamAV)->10025:spampd(SpamAssassin)->10027:smtpd(Postfix)

/etc/postfix/master.cf

# AV scan filter (used by content_filter)
scan      unix  -       -       n       -       16      smtp
        -o smtp_send_xforward_command=yes
# For injecting mail back into postfix from the filter
127.0.0.1:10027 inet  n -       n       -       16      smtpd
        -o content_filter=
        -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
        -o smtpd_helo_restrictions=
        -o smtpd_client_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o mynetworks_style=host
        -o smtpd_authorized_xforward_hosts=127.0.0.0/8

/etc/postfix/main.cf

content_filter = scan:127.0.0.1:10026

/etc/clamsmtpd.conf の該当行は以下のようになっているのを確認

OutAddress: 10025
Listen: 127.0.0.1:10026

/etc/default/spampd の該当行を以下に修正

STARTSPAMPD=1
LISTENPORT=10025
DESTPORT=10027

Postfix キューに入った後のコンテンツフィルタ
を読むと、コンテンツフィルタはProxyにしてたほうが、性能もでて安全というようなことが書いてあるので、うちのサーバではこちらのSpamPDを利用した構成で運用することにしました。


(関連)

ClamSMTPを利用しない場合、SpamdをPostfixから直接利用する設定
http://wiki.apache.org/spamassassin/IntegratedSpamdInPostfix

Postfix-jp Maling List