2007-02-28

λ [FreeBSD] Postfix + ClamAV(clamav-milter) + SpamAssassin(spamass-milter)

Postfix with clamav-milter clamav-milter の作るソケットが clamav ユーザからのみしかアクセスできないので、そこのところを postfix グループから利用出来るようにするためのスタートアップスクリプトになっている。 (quarantine-dir を使わないんだったら、TCP経由での接続にしてしまうという手もある。)

以下の設定内容は、daemontools によるデーモン管理環境で同様の機能を実現する方法。 clamav-milter だけでなく spamass-milter も同じ状況であるので、ほぼ同じ設定をしている。

設定項目シート

  • clamd と clamav-milter での通信をするソケット: UNIXドメインソケット /var/run/clamav/clamd
  • postfix と clamav-milter での通信をするソケット: UNIXドメインソケット /var/run/clamav/clmilter.sock
  • clamav-milter による検出したウィルスを保存するフォルダ /home/clamsmtp
  • spamd と spamass-milter での通信をするソケット: UNIXドメインソケット /var/run/spamd/spamd
  • postfix と spamass-milter での通信をするソケット: UNIXドメインソケット /var/run/spamd/spamass-milter.sock

pkgtools.conf に以下の記述をしてから、portinstall security/clamav または portupgrade -f security/clamav で clamav-milter 付きの ClamAV を作成する。

MAKE_ARGS = {
      ...
      'security/clamav'       => '-DBATCH WITH_MILTER=yes' ,
      ...
}

/usr/local/etc/clamd.conf で最低限必要な設定

LocalSocket /var/run/clamav/clamd
Foreground yes

clamd (ClamAV デーモン) の run スクリプト

#!/bin/sh

user=clamav
socketdir=/var/run/clamav

if [ \! -d $socketdir ]; then
        mkdir $socketdir >/dev/null 2>&1
        chown $user $socketdir
        chgrp $user $socketdir
        chmod 755 $socketdir
fi

exec 2>&1
# exec softlimit -c 0 -a 274877906944

exec softlimit -c 0 \
        envdir ./env \
        /usr/local/sbin/clamd

clam-milter の run スクリプト

#!/bin/sh
PATH=/usr/local/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin
export PATH

user=clamav
socketdir=/var/run/clamav
sockfile=$socketdir/clmilter.sock
quarantinedir=/home/clamsmtp

if [ \! -d $socketdir ]; then
        mkdir $socketdir >/dev/null 2>&1
fi
chown -R $user $socketdir
chgrp -R $user $socketdir
chmod 755 $socketdir

if [ ! -d $quarantinedir ]; then
        mkdir $quarantinedir
        chown $user $quarantinedir
        chgrp $user $quarantinedir
        chmod 700 $quarantinedir
fi

chownpipe () {
  while [ \! -S $sockfile ];
  do
    sleep 1
  done
  chgrp postfix $sockfile
  chmod g+rw $sockfile
}
case $1 in
  --chownpipe) chownpipe; exit 0;;
esac

rm -f $sockfile
daemon $0 --chownpipe

exec 2>&1
exec softlimit -c 0 \
        envdir ./env \
        setuidgid $user \
        clamav-milter -D --sendmail-cf= --external --quarantine-dir=$quarantinedir local:$sockfile

spamd (SpamAssassin デーモン) の run スクリプト

#!/bin/sh

user=spamd
socketdir=/var/run/spamd

if [ \! -d $socketdir ]; then
        mkdir $socketdir >/dev/null 2>&1
        chown $user $socketdir
        chgrp $user $socketdir
        chmod 755 $socketdir
fi

exec 2>&1
exec softlimit -c 0 \
        envdir ./env \
        setuidgid $user \
        spamd \
        --socketpath=$socketdir/spamd \
        --socketmode=600 \
        --syslog=stderr \

spamass-milter の run スクリプト

#!/bin/sh
PATH=/usr/local/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin
export PATH

user=spamd
socketdir=/var/run/spamd
sockfile=$socketdir/spamass-milter.sock
if [ \! -d $socketdir ]; then
  mkdir $socketdir >/dev/null 2>&1
  chown -R $user $socketdir
  chgrp -R $user $socketdir
  chmod 755 $socketdir
fi

chownpipe () {
  while [ \! -S $sockfile ];
  do
    sleep 1
  done
  chgrp postfix $sockfile
  chmod g+rw $sockfile
}
case $1 in
  --chownpipe) chownpipe; exit 0;;
esac

rm -f $sockfile
daemon $0 --chownpipe

# kill older process
pkill -KILL -x -f "spamass-milter -m -p $sockfile -- -U $socketdir/spamd"

exec 2>&1
exec softlimit -c 0 \
        envdir ./env \
        setuidgid spamd \
        spamass-milter -m -p $sockfile -- -U $socketdir/spamd

/usr/local/etc/postfix/main.cf に以下の記述を追加する。content_filter および receive_override_options の指定は消しておくこと。

milter_connect_macros = b j _ {daemon_name} {if_name} {if_addr}
smtpd_milters =
      unix:/var/run/clamav/clmilter.sock
      unix:/var/run/spamd/spamass-milter.sock
milter_default_action = accept

milter_default_action = accept の設定により、ClamAVまたはSpamAssassin が不調な場合でもエラーとはならず、普通に配送されるようになるはず(未確認) 今までの content_filter 方式ではエラーがメール発信者に返ってしまったり、最悪の場合転送をかけているメールサーバ間でメールがループする事態を招いていた。

spamass-milter の設定にあたっては、 <URL:http://archives.neohapsis.com/archives/postfix/2006-09/1474.html> も参考にした。

(追記) http://mimori.org/~h/tdiary/20070304.html#p02 にrunスクリプトの改善版がある。

λ [FreeBSD] sendmail.cf のダミー作成

(clamav-milter に --sendmail-cf= オプションを指定することにより不要になったけど、最初に作業したのでメモしとく)

clamav-milter を起動しようとしたら、sendmail.cf の設定を参照してチェックしているらしく、起動させてくれないという現象発生。 しょうがないので、sendmail.cf を作成する。参考: <URL:http://www.hart.co.jp/spam/sa-clamav.html>

以下の3行を /etc/mail/milter.mc として保存する。1行目は m4 のコマンドで、freebsd.mc をインクルードして使えという指示。

include(freebsd.mc)
# use milter
INPUT_MAIL_FILTER(`spamassassin',`S=local:/var/run/spamd/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')
INPUT_MAIL_FILTER(`clmilter', `S=local:/var/run/clamav/clmilter.sock, F=, T=S:4m;R:4m')dnl
define(`confINPUT_MAIL_FILTERS', `clmilter,spamassassin')dnl

次に以下のコマンドにより、/etc/mail/sendmail.cf を作成する。

% cd /etc/mail; sudo make SENDMAIL_MC=milter SENDMAIL_SUBMIT_MC=milter cf install
[]