FreeBSD - статьи

         

Настройка фильтров (антивирус, антиспам и форвардер)


я сразу хотел бы заметить, что все фильтры в данном how-to представляют собой perl скрипты со всеми вытекающими последствиями. отсюда следует, что вам стоит сопоставить конфигурацию своего почтового сервера с нагрузкой на него, что бы не получилось так, что в результате работы фильтров пропускная способность сервера оказалась меньше средней почтовой нагрузки. например, spamassasin даже на очень хорошей машине (в моём случае это p3-866/256ram) обычное письмо обрабатывает более 10 секунд. а если письмо большое, то и того больше.

но в принципе ничего страшного в том, что вы сейчас настроите фильтры нет, ибо, как можно было убедиться при создании таблиц в mysql, всем пользователям фильтры можно отключить и письмо будет летать мимо них, пусть загружая сервер собой чуть больше, но нагрузка эта незначительная. если вы все ещё со мной, тогда вперёд!

kaspersky antivirus

поставим его, родного. живёт package для BSD систем где-то в районе ftp://ftp.avp.ru/patches/. качнём и поставим его:

cd /var/tmp wget -c ftp://ftp.avp.ru/patches/KAVUnix4.0.3.0_UrgentUpdate1/FreeBSD /4.x/kav-WorkStationSuit-4.0.3.1-FreeBSD-4.x.tgz pkg_add kav-WorkStationSuit-4.0.3.1-FreeBSD-4.x.tgz

нефиг ему запускаться под рутом:

rm -f /usr/local/etc/rc.d/kavd.sh

теперь, если вы хотите использовать kavscanner совершенно законно и нахаляву, то вам необходимо скачать . внутри архива находится старая версия kavscanner, которая глючит при работе со своими же ключами и при комбинации двух определённых ключей всегда считает себя зарегистрированной. как вы правильно догадались, эти два ключа лежат в том же архиве ;-) вам нужно заменить kavscanner из дистрибутива бинарником из архива и положить два ключа в /etc/AVP.

теперь нам надо подкорректировать конфиги Касперского. идём в /etc/AVP и правим. описание конфигов есть на том же ftp://ftp.avp.ru где-то в районе документации. там такой здоровый pdf метров на 10, в котором подробное описание всего пакета. среди него есть и описания конфигов. я просто привожу здесь свои варианты конфигов. они у меня работают на нескольких серверах.


/etc/AVP/AvpUnix.ini:

[AVP32] DefaultProfile=/etc/AVP/defUnix.prf

[Configuration] KeysPath=/etc/AVP SetFile=avp.set BasePath=/var/AVP/Bases SearchInSubDir=No UpdatePath=ftp://ftp.kasperskylab.ru/updates



/etc/AVP/defUnix.prf

[Object] Names=*/var/tmp;*/tmp Memory=No Sectors=No ScanAllSectors=No Files=Yes FileMask=2 UserMask=*.tar.gz ExcludeFiles=0 ExcludeMask=*.txt *.cmd ExcludeDir= Packed=Yes Archives=Yes SelfExtArchives=Yes MailBases=Yes MailPlain=Yes Embedded=Yes InfectedAction=0 BackupInfected=No IfDisinfImpossible=0 DeleteInfectedArch=No Warnings=Yes CodeAnalyser=Yes RedundantScan=No SubDirectories=Yes CrossFs=Yes

[Options] ScanRemovable=No ScanSubDirAtEnd=No ParallelScan=No LimitForProcess=16 EndlesslyScan=No ScanDelay=-1 Symlinks=0

[Report] Report=Yes UseSysLog=No ReportFileName=/var/log/kavscan.log Append=Yes ReportFileLimit=Yes ReportFileSize=1024 RepCreateFlag=644 ExtReport=Yes WriteTime=Yes WriteExtInfo=No UseCR=No RepForEachDisk=Yes LongStrings=Yes UserReport=No UserReportName=~/.AVP/userreport.log ShowOK=No ShowPack=Yes ShowPassworded=Yes ShowSuspision=Yes ShowWarning=Yes ShowCorrupted=Yes ShowUnknown=Yes

[ActionWithInfected] InfectedCopy=No InfectedFolder=~/.AVP/infected CopyWithPath=Yes ChangeExt=None NewExtension=Virs ChownTo=None ChModTo=No

[ActionWithSuspicion] SuspiciousCopy=No SuspiciousFolder=~/.AVP/suspicious CopyWithPath=Yes ChangeExt=None NewExtension=Susp ChownTo=None ChModTo=No

[ActionWithCorrupted] CorruptedCopy=No CorruptedFolder=~/.AVP/corrupted CopyWithPath=Yes ChangeExt=None NewExtension=Corr ChownTo=None ChModTo=No

[TempFiles] UseMemoryFiles=Yes LimitForMemFiles=6000 MemFilesMaxSize=20000 TempPath=/var/tmp

[Priority] Father=0 Child=0

[Customize] Sound=No UpdateCheck=No UpdateInterval=90 OtherMessages=Yes RedundantMessage=No DeleteAllMessage=Yes ExitOnBadBases=Yes UseExtendedExitCode=Yes

так же в пакете kav-scanner идёт утилита и скрипт для обновления антивирусных баз. утилита вроде бы нормальная, хоть и требует wget :) а вот вот скрипт дико кривой. я не помню, что я там уже правил, а правил, видимо всё таки много, так как отличий от стандартного нашлось целая куча. в общем вот он этот скрипт /etc/periodic/daily/900.kavupdater:



#!/bin/sh

KAV_PATH=/usr/local/share/AVP PATH=$PATH:/usr/local/bin

if [ ! -x /usr/local/bin/wget ]; then echo "$0: wget must be installed for the updater to run" >&2 exit 1 fi

DESC="kaspersky anti-virus updater"

if [ -r ~.AVP/AvpUnix.ini ]; then INIFILE=~.AVP/AvpUnix.ini else if [ -r /etc/AVP/AvpUnix.ini ]; then INIFILE=/etc/AVP/AvpUnix.ini fi fi

if [ -r $INIFILE ]; then eval `egrep '^[A-Za-z]*=' $INIFILE | perl -pe 's/\r//g'` fi

if [ -n "$UpdatePath" ]; then DPARMS="$UpdatePath" else if [ -n $1 ]; then echo "warning! add updatepath in your config file AvpUnix.ini" exit 1 fi DPARMS=$1 fi

echo echo echo run kaspersky antivirus updating: echo checking parameters "$DPARMS"

if [ $? -eq 0 ]; then $KAV_PATH/kavupdater -uik="$DPARMS" -o -y -kb exitCode=$? case $exitCode in 8) echo 8 - new antiviral bases not found. ;; 6) echo 6 - found corrupted file and process stoped on it. ;; 4) echo 4 - found corrupted file. ;; 2) echo 2 - process stoped on corrupted file. ;; 0) echo 0 - antiviral bases correctly loaded. ;; *) echo $exitCode - i dont know this exit code! esac else echo "$0: network connection error." >&2 exit 1 fi

exit 0

запустите обновлялку /etc/periodic/daily/900.kavupdater. оно должно скачать и установить все базы для kav. после этого запуск kavscanner должен запустится проверить /tmp и ни на что не ругаться.

spamassassin

как обычно:

cd /usr/ports/lang/perl5 make install clean use.perl port cd /usr/ports/mail/p5-Mail-SpamAssassin make install clean

потянет за собой кучу байды, но она, видимо, нужна, так что потерпите уж. perl 5.6.1 тоже нужен для фильтровых скриптов. отредактируем конфиг spamassassin. /usr/local/etc/mail/spamassassin/local.cf:

# подробный отчёт clear_report_template report тут, похоже, привалило спама, но я его узнал и отловил. письмо, которое пришло report находится в приложении и его можно поглядеть, вдруг я облажался и на самом деле report это не спам. report report вот что там внутри: _PREVIEW_ report report детали анализа текста письма: (набрано _HITS_ очков, _REQD_ необходимо) report _SUMMARY_



# краткий отчёт clear_terse_report_template terse_report --- результаты борьбы со спамом terse_report набрано _HITS_ очков, _REQD_ требуется; terse_report _SUMMARY_ terse_report --- конец результатов борьбы со спамом

# если нет текста clear_unsafe_report_template unsafe_report а вообще это письмо не содержит текста, так что лучше его не открывать, так как unsafe_report там может быть вирус или подтверждение, что Ваш адрес может получать спам ;) unsafe_report если Вы всё таки хотите поглядеть что там такое, то лучше сохранить это письмо unsafe_report как файл и поглядеть его какой-нибудь внешней безопасной программой.

# переписывать поле subject rewrite_subject 1 subject_tag new spam received:

# эти рассылки я читаю и они умудряются определяться спамом ;) # поэтому эти адреса добавим в whitelist whitelist_from subscribe@74.ru whitelist_from info@suct.uu.ru whitelist_from suct@suct.uu.ru whitelist_from subscribe@udaff.com whitelist_from genocide@raven.elk.ru

кроме этого нужно добавить пользователя в системе, с правами которого будут происходить все проверки на спам и на вирусы. пользователь должен быть вот такой, добавите сами ;-)

filter:*:1025:1025::0:0:mail filter:/var/spool/filter:/sbin/nologin

напишем и запустим скрипт для запуска и останова spamd - демона, который значительно ускоряет работу spamassassin, правда отжирает много памяти, но он того стоит. /usr/local/etc/rc.d/spammerdaemon.sh:

#!/bin/sh if ! PREFIX=$(expr $0 : "\(/.*\)/etc/rc\.d/$(basename $0)\$"); then echo "$0: Cannot determine the PREFIX" >&2 exit 1 fi case "$1" in start) kill `ps ax | grep spamd | grep -v grep | awk '{print $1}' | head -1` >/dev/null 2>/dev/null && echo -n ' spamd' [ -x ${PREFIX}/bin/spamd ] && ${PREFIX}/bin/spamd -d -a -c -u filter && echo -n ' spamd' ;; stop) kill `ps ax | grep spamd | grep -v grep | awk '{print $1}' | head -1` >/dev/null 2>/dev/null && echo -n ' spamd' ;; *) echo "Usage: `basename $0` {start|stop}" >&2 ;; esac exit 0



запустим его и проверим, запущен ли он. результат должен быть примерно такой:

/usr/local/etc/rc.d/spammerdaemon.sh start ps ax | grep spam 338 ?? Is 0:07,50 /usr/local/bin/spamd -d -a -c -u filter (perl)

опять postfix

теперь вернёмся к postfix добавлять фильтры. открываем /usr/local/etc/postfix/master.cf и дописываем туда следующие строчки. обратите внимание, что для каждого фильтра (он же транспорт) указано количество максимальных процессов - 10. вам стоит поменять это на своё значение в зависимости от количества свободной памяти на вашем сервере. в принципе если её много, то можно оставить и 10. если мало, то лучше поставить значения поменьше вплоть до 1.

# ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== # forwarder forwarder unix - n n - 10 pipe flags=RD user=filter argv=/usr/local/raven/mail/forwarder.pl "localhost:10025" "${sender}" "${recipient}"

# from forwarder localhost:10025 inet n - n - - smtpd -o content_filter=genocide -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_helo_restrictions= -o smtpd_client_restrictions= -o smtpd_sender_restrictions= -o mynetworks=127.0.0.0/8 -o smtpd_recipient_restrictions=permit_mynetworks,reject -o myhostname=localhost

# antivirus genocide unix - n n - 10 pipe flags=R user=filter argv=/usr/local/raven/mail/antikav.pl "localhost:10026" "${sender}" "${recipient}"

# from antivirus localhost:10026 inet n - n - - smtpd -o content_filter=spamfilter -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_helo_restrictions= -o smtpd_client_restrictions= -o smtpd_sender_restrictions= -o mynetworks=127.0.0.0/8 -o smtpd_recipient_restrictions=permit_mynetworks,reject -o myhostname=localhost

# spamfilter spamfilter unix - n n - 10 pipe flags=R user=filter argv=/usr/local/raven/mail/std2lmtp.pl "localhost:10027" "antispam" " ${sender}" "${recipient}" "/usr/local/bin/spamc"



# from spamfilter to smtpd:10026 localhost:10027 inet n - n - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_helo_restrictions= -o smtpd_client_restrictions= -o smtpd_sender_restrictions= -o mynetworks=127.0.0.0/8 -o smtpd_recipient_restrictions=permit_mynetworks,reject -o myhostname=localhost

а к /usr/local/etc/postfix/main.cf добавляем вот это:

# первый из цепочки фильтров: content_filter = forwarder

# необходимо для корректной работы скриптов! forwarder_destination_recipient_limit = 1 genocide_destination_recipient_limit = 1 spamfilter_destination_recipient_limit = 1

forwarder.pl, antikav.pl и std2lmtp.pl можно найти вот в . в каждом скрипте вначале есть мини конфигурация, в которой необходимо как минимум прописать логин и пароль для mysql.

forwarder.pl - помощник 'старшего брата'. копирует письмо на нужный адрес в случае необходимости. если нужного адреса нет, то просто прокидывает письмо к следующему элементу в цепочке.

antikav.pl - антивирусный фильтр. с помощью модуля MIME::Tools разбирает письмо на файлы, которые кладёт в /tmp, напускает на эти файлы kavscanner и, парся его вывод, определяет что из этих файлов заражено. заражённые файлы вычленяет из письма, собирает письмо обратно с помощью всё того же MIME::Tools и отправляет следующему фильтру в цепочке.

std2lmtp.pl - вообще это мелкий скрипт, который переправляет содержимое stdin в на указанный адрес по smtp протоколу. в нашем случае этот скрипт кроме простого перенаправления, на письмо ещё и напускает указанную программу (spamc), которая в свою очередь соединяется со spamd, который является самом spamassassin, проверяет письмо на спамность и в случае необходимости помечает его. ну а наш скрипт потом результат отправляет в smtpd, который последний в цепочке фильтров и дальше уже идёт раскладка по почтовым ящикам.




  • Содержание раздела