Скрипт для объединения Postfix c ClamAV и SpamAssassin (clamav virus postfix filter spam spamassassin script)
Ключевые слова: clamav, virus, postfix, filter, spam, spamassassin, script, (найти похожие документы)
From: Роман К.
Newsgroups: email
Date: Mon, 23 May 2006 14:31:37 +0000 (UTC)
Subject: Скрипт для объединения Postfix c ClamAV и SpamAssassin
-------------------
Написан по мотивам статьи Дмитрия Козлова.
Скрипт для объединения ClamAV + Postfix + SpamAssassin
http://www.opennet.dev/base/net/clamav_postfix_spamassassin.txt.html
Отличия:
- проверка почты через clamd
- запись в maillog сообщений о проверке на вирусы
- другие незначительные изменения :)
Необходимо создать пользователя filter и дать право этому пользователю
писать в директорию INSPECT_DIR
скрипт: /usr/libexec/postfix/post-paranoid.sh
#!/bin/sh
#Add lines to master.cf:
# smtp inet n - n - - smtpd
# -o content_filter=pparanoid:dummy
#pparanoid unix - n n - - pipe
# flags=Rq user=filter argv=/usr/libexec/postfix/post-paranoid.sh -f ${sender} -- ${recipient}
#
REP_TO="admin@somedomain.tld"
INSPECT_DIR="/var/spool/postfix/filters"
TMPMSG=in.$$
TMPDATA=data.$$
SENDMAIL="/usr/local/sbin/sendmail -i "
POSTLOG="/usr/local/sbin/postlog -t "
AVCMD="/usr/local/bin/clamdscan --no-summary --stdout"
SPAMC="/usr/local/bin/spamc -u spamd -U /var/run/spamd.sock"
EX_TEMPFAIL=75
trap "cd $INSPECT_DIR && rm -f $TMPMSG $TMPDATA" 0 1 2 3 15
cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }
umask 006
cat | $SPAMC > $TMPMSG || { echo Cannot save message to file; exit $EX_TEMPFAIL; }
AV_OUTPUT=`$AVCMD $TMPMSG`
AV_RESULT=$?
from=$2
to=$4
msgid=`head -n 200 $TMPMSG | grep -i "^message-id" | cut -d: -f 2- | sed 's/^ *//' | head -n 1`
case "$AV_RESULT" in
0)
$SENDMAIL "$@" <$TMPMSG
$POSTLOG postfix/virus-filter message-id=$msgid status: CLEAN from=\<$from\> to=\<$to\> 2>/dev/null
exit 0
;;
1)
AV_OUTPUT=`echo $AV_OUTPUT | awk -F ":" '{print $2}'`
cat /dev/null > $TMPDATA || { echo "Cannot write to $INSPECT_DIR/$TMPDATA"; exit $EX_TEMPFAIL; }
head -n 200 $TMPMSG | grep -i -m 1 "^Message-ID:" >> $TMPDATA
head -n 200 $TMPMSG | grep -i -m 1 "^Date:" >> $TMPDATA
echo "From: $from" >> $TMPDATA
echo "To: $to" >> $TMPDATA
head -n 200 $TMPMSG | grep -i "^X-Original-To:" >> $TMPDATA
head -n 200 $TMPMSG | grep -i "^Delivered-To:" >> $TMPDATA
head -n 200 $TMPMSG | grep -i -m 1 "^Subject:" >> $TMPDATA
head -n 200 $TMPMSG | grep -i "^Received:" >> $TMPDATA
head -n 200 $TMPMSG | grep -i "^User-Agent:" >> $TMPDATA
head -n 200 $TMPMSG | grep -i "^X-Mailer:" >> $TMPDATA
echo -n "Message-Size: " >> $TMPDATA
ls -l $TMPMSG | awk '{print $5}' >> $TMPDATA
echo Virus-Status: $AV_OUTPUT >> $TMPDATA
cat $TMPDATA | mail -s "ClamAV: VIRUS FOUND " $REP_TO
$POSTLOG postfix/virus-filter message-id=$msgid reject: INFECTED from=\<$from\> to=\<$to\> 2>/dev/null
exit 0
;;
*)
AV_ERR="ERROR CODE: $AV_RESULT. $AV_OUTPUT"
echo $AV_ERR | mail -s "ClamAV: ERROR!" $REP_TO
exit $EX_TEMPFAIL
;;
esac
При использовании clamd была замечена одна неприятная вещь.
Появилось сообщение от nagios о сильной загрузке cpu на почтовом
сервере. Как потом выяснилось, грузил его как раз clamd. Почта
естественно перестала ходить и в INSPECT_DIR скопилось около сотни
писем.
После перезапуска clamd все встало на свои места, но письма которые
находились в INSPECT_DIR естественно не отправились.
Для отправки этих писем был написан второй скрипт
post-after-crash.sh
#!/bin/sh
INSPECT_DIR="/var/spool/postfix/filters"
SENDMAIL="/usr/local/sbin/sendmail -t "
CNT=0
cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit 1; }
ls | (
while read TMPMSG
do
CNT=`expr $CNT + 1`
echo "Processing message #$CNT: $TMPMSG"
cat $TMPMSG | $SENDMAIL
rm -f $TMPMSG
done)
echo "Done."