Установка бесплатного антивируса ClamAV + Spam assissian + Postfix под Linux
Идея и скрипт взяты из Скрипт для объединения 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."