あまり望ましくないことですが、運営していると外部にメールアドレスが漏れたりしてスパムメールが頻発してくるようになることがあります。そういうときの強い見方がSpamAssassinです。これをMTAに組み合わせて使うことにより、強力なスパムフィルタにより自動的にスパムメールと思われるメールを廃棄してくれます。今回はデーモン(spamd)を起動しておいて、一回ずつ呼び出して処理するという手法を紹介します。
次に、デーモンとして動かすための準備をします。以下のスクリプトを用意します。(すでに/etc/init.d/spamdとして入っていると思いますが、念のため紹介します。)
#!/bin/sh
#
# spamassassin This script starts and stops the spamd daemon
#
# chkconfig: 2345 80 30
#
# description: spamd is a daemon process which uses SpamAssassin to check
# email messages for SPAM. It is normally called by spamc
# from a MDA.
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
# Source spamd configuration.
if [ -f /etc/sysconfig/spamassassin ] ; then
. /etc/sysconfig/spamassassin
else
SPAMDOPTIONS="-d -c -a -m5 -H"
fi
[ -f /usr/bin/spamd -o -f /usr/local/bin/spamd ] || exit 0
PATH=$PATH:/usr/bin:/usr/local/bin
# See how we were called.
case "$1" in
start)
# Start daemon.
echo -n "Starting spamd: "
daemon spamd $SPAMDOPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/spamassassin
;;
stop)
# Stop daemons.
echo -n "Shutting down spamd: "
killproc spamd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/spamassassin
;;
restart)
$0 stop
$0 start
;;
condrestart)
[ -e /var/lock/subsys/spamassassin ] && $0 restart
;;
status)
status spamd
;;
*)
echo "Usage: $0 {start|stop|restart|status|condrestart}"
exit 1
esac
exit 0
(このスクリプトをspamdとして保存し実行権限を与え、)デーモンとして起動するようにします。
# chmod +x spamd
# rc-update add spamd default
TLECより、設定ファイルをダウンロードし利用します。これを/etc/mail/spamassassin/local.cfとして保存します。
次に、Postfixのフィルタとしてのスクリプトを用意します。要するに、メールを受け取ったり発信したりする都度にこのスクリプトを実行するようにさせるわけです。様々なHPを参考に、私は以下のようなスクリプトを作成しました。
#!/bin/bash
#SpamAssasin filter with Postfix
#FILE PATH
RM=/bin/rm
INSPECT_DIR=/var/spool/filter
OUTPUTFILE=out.$$
SENDMAIL=/usr/sbin/sendmail
KILLFILE=/var/log/spammail
SPAMASSASSIN=/usr/bin/spamc
#Exit codes from <sysexits.>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69
#Move to Work Dir
cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist : exit $EX_TEMPFAIL; }
#Clean up when done or when aborting
trap "$RM -f $OUTPUTFILE" 0 1 2 3 15
cat | $SPAMASSASSIN -x > $OUTPUTFILE
#メールのヘッダにspamdによってつけられる"X-Spam-Status: Yes"
#があるなら、KILLFILEに捨てる。
spamflag=`less $OUTPUTFILE | grep -c 'X-Spam-Status: Yes'`
if [ $spamflag = 1 ]; then
cat $OUTPUTFILE >> $KILLFILE
#それ以外なら処理。
else
$SENDMAIL "$@" < $OUTPUTFILE
fi
exit $?
さらに、Postfixのmain.cfに、フィルタの定義を追加します。改行がありますが、実際は一行です。
filter unix - n n - - pipe user=filter argv=/usr/local/bin/sa_filter.sh -f \
${sender} -- ${recipient}
次にmain.cfのsmtpの部分を書き換えます。改行がありますが、実際は一行です。
smtp inet n - n - - smtpd \
-o content_filter=filter:
Postfixを再起動し、きちんと動作するか確認します。
なお、、spamassassinの学習にも書いたように、最初はspam、ham両方のメールを学習させてください。させないと、うまくベイジアンフィルタが働かないようです。
参考:http://www.sonorilo.net/spamassassin。ありがとうございました。