Установка бесплатного антивируса ClamAV + Spam assissian + Postfix под Linux

Материал из Wiki МИАЦ ВО
Перейти к навигации Перейти к поиску

Идея и скрипт взяты из Скрипт для объединения Postfix c ClamAV и SpamAssassin Для работы этой системы оба сервиса должны работать под одним пользователем. Пускай это будет clamav

Установка пакетов

Итак устанавливаем пакет spammassissian*.rpm со всеми зависимостями, а также clamav*.rpm, clamav-db-*.rpm, clamd*.rpm и все остальные, которые предложит инсталятор.

Настройка ClamAV

После установки пакетов, в директории /etc появится файл конфигурации clamav.conf.
В принципе, ничего менять там не надо, за исключением того, что нужно закомментировать (если они раскомментированы, конечно)опции TCPAddr и TCPSocket, и раскомментировать строку LocalSocket /var/run/clamav/clamd.sock
Таким образом укажем антивирусу, что работать он будет только на локальной машине.
Затем запустить сервис clamd:

# service clamd start.

И также поместить его в автозагрузку (в консоли запустить drakxconf, зайти в раздел "службы" и отметить звёздочкой сервис clamd).

Для обновления антивирусных баз используется утилита freshclam, которая входит в состав пакета clamav. Для того, чтобы базы обновлялись два раза в день и при этом в логи записывались результаты обновления, freshclam нужно запускать следующим образом:

# freshclam -d -c 2 -l /var/log/clamav/clam-update.log

Рекомендую разместить строку с этой командой в файл /etc/rc.d/rc.local.

С установкой и настройкой clamav все.

Настройка спамфильтра

1. Редактируем файл /etc/sysconfig/spamd

# Customized settings for spamassassin (spamd)

# Cmdline options
SPAMDOPTIONS="-d -c -m5 -H  --socketpath=/var/lib/spamd/spamd.socket 
--socketowner=clamav --socketgroup=clamav --socketmode=660"

2. Создать директорию для socket файла

# mkdir /var/lib/spamd
# chown clamav /var/lib/spamd

3. Затем запустить сервис spamd:

# service spamd start.

И также поместить его в автозагрузку (в консоли запустить drakxconf, зайти в раздел "службы" и отметить звёздочкой сервис spamd).

Настройка Postfix

Редактируем /etc/postfix/master.cf Вконец добавляем строки

pparanoid unix  -       n       n       -       -       pipe
  flags=Rq user=clamav argv=/usr/local/etc/postfix/post-paranoid.sh -f ${sender}  --  ${recipient}

Редактируем строку с smtp

smtp    inet    n       -       y       -       -       smtpd
          -o content_filter=pparanoid:dummy

Создание скрипта обработки почты

Создаем файл /usr/local/etc/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}
#
#set -x
REP_TO="misha@proba.ru"
INSPECT_DIR="/var/spool/postfix/filters"
TMPMSG=in.$$
TMPDATA=data.$$
SENDMAIL="/usr/sbin/sendmail -i "
POSTLOG="/usr/sbin/postlog -t "
AVCMD="/usr/bin/clamdscan --no-summary --stdout"
SPAMC="/usr/bin/spamc -u clamav -U /var/lib/spamd/spamd.socket"

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

Меняем владельца и тип

# chown clamav /usr/libexec/postfix/post-paranoid.sh
# chmod 755 /usr/libexec/postfix/post-paranoid.sh

Создаем директорию для временных файлов

# mkdir /var/spool/postfix/filters
# chown  clamav /var/spool/postfix/filters

И перезапускаем Postfix

# postfix restart

Приэтом директория /.spamssassin с файлами auto-whitelist, bayes_seen, bayes_toks, user_prefs будет находится в /var/lib/clamav.

Замечания

При использовании clamd была замечена одна неприятная вещь.

Появилось сообщение от nagios о сильной загрузке cpu на почтовом сервере. Как потом выяснилось, грузил его как раз clamd. Почта естественно перестала ходить и в INSPECT_DIR скопилось около сотни писем.

После перезапуска clamd все встало на свои места, но письма которые находились в INSPECT_DIR естественно не отправились.

Для отправки этих писем был написан второй скрипт. Его нужно положить в файл /usr/local/etc/postfix/post-after-crash.sh

#!/bin/sh

INSPECT_DIR="/var/spool/postfix/filters"
SENDMAIL="/usr/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."