Скрипт для объединения Postfix c ClamAV и SpamAssassin


Написан по мотивам статьи Дмитрия Козлова.
Скрипт для объединения ClamAV + Postfix + SpamAssassin
http://www.opennet.ru/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."

Обновлено: 13.03.2015