Postfix with clamav-milter clamav-milter の作るソケットが clamav ユーザからのみしかアクセスできないので、そこのところを postfix グループから利用出来るようにするためのスタートアップスクリプトになっている。 (quarantine-dir を使わないんだったら、TCP経由での接続にしてしまうという手もある。)
以下の設定内容は、daemontools によるデーモン管理環境で同様の機能を実現する方法。 clamav-milter だけでなく spamass-milter も同じ状況であるので、ほぼ同じ設定をしている。
設定項目シート
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スクリプトの改善版がある。
(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