FreeBSD 5.1 + Sendmail + Spamassisn + AVP

В данной статье описана процедура настройки вашего почтового сервера для фильтрации почтового мусора (спама) и проверки входящей и исходящей почты на вирусы. Предлагаемое автором решение базируется на FreeBSD и Sendmail.

[Дмитриев Геннадий Федорович (stranger03@mail.ru)]

FreeBSD 5.1 + Sendmail + Spamassisn + AVP

0. Введение

Ну вот, я почти доделал свою антиспам-систему. К сожалению, подробно описывать процедуру практически нет времени, да и лениво. Потому на все вопросы готов ответить по почте stranger03@mail.ru.

Но сначала небольшое отступление. В данной статье будет описана процедура надстройки для вашего почтового сервера для фильтрации почтового мусора (спама) и проверки входящей и исходящей почты на вирусы. Надеюсь для чего это надо, объяснять не надо. Так же полагаю, что вы хоть чуть-чуть знакомы с системой и вам не придеться объяснять, как поставить систему, как настоить сам почтовый сервер и что такое make и на кой она нужна.

Вся процедура состоит из нескольких частей:

  1. Обновление дерева портов
  2. Обновление почтового демона
  3. Установка и настройка демона spamd, который разбирает сообщение по кусочкам и ставит спам-балл Если балл превышает некую цифру, которую вы можете изменять, письмо преобразуется определенным образом.
  4. Установка и настройка milter-а (spamass-milter) для почтового демона. Он будет передавать сообщение демону spamd и принимать его обратно, пересылая дальше по цепочке
  5. Установка и настройка Касперского. В пояснении не нуждается.
  6. Установка и настройка milter-а (kavmilter) для почтового демона. Он будет передавать сообщение Касперскому.
  7. И последнее, настройка самого почтового демона. Вот собственно и все отступление, icon_smile.gif . Приступим.

1. Обновление дерева портов

Для начала обновим дерево портов:
      cd /usr/ports/net/cvsup-without-gui
      make
      make install
   
Далее в домашнем каталоге создаем для большего удобства два файлика. Один со списком обновляемых портов, другой со скриптом запуска.
      cd /home/user
      mkdir cvsup
      cd cvsup
      vi cvsup.ports

# =====начало файла cvsup.ports=========
*default  host=cvsup.FreeBSD.org
*default  base=/usr
*default  prefix=/usr
*default  release=cvs
*default  tag=.
*default  delete use-rel-suffix compress
ports-mail
ports-net
ports-security
ports-sysutils
ports-www
# =====конец файла cvsup.ports==========
   
В принципе вы можете здесь обновлять все порты, систему, если вам это необходимо. Для меня было достаточно этих портов. Про сам cvsup можете почитать здесь: http://www.freebsd.org.ru/how-to/cvsup/
       vi cvsup.sh

# =======начало файла cvsup.sh==========
#!/bin/sh
/usr/local/bin/cvsup -g -L 2 cvsup.ports
# =======конец файла cvsup.sh===========

       chmod +x cvsup.sh
       ./home/user/cvsup/cvsup.sh
После такой процедуры ваши волосы, тьфу, порты станут относительно новыми. Из них вам понадобится поставить следующие порты (технология стандартная, make & make install):
       /usr/ports/mail/sendmail
       /usr/ports/mail/p5-Mail-SpamAssassin
       /usr/ports/mail/spamass-milter

2. Обновление почтового демона

Поскольку изначально в FreeBSD 5.1 ставится Sendmail 8.12.9, обновим его до 8.12.10 из портов. После установки его будет удобно собирать отсюда:
       /usr/ports/mail/sendmail/work/sendmail-8.12.10/cf/cf
Как - поясню чуть позже. Дополнительно, в каталоге
       /usr/ports/mail/sendmail надо сделать make mailer.conf

3. Установка и настройка демона spamd

Далее, с sendmail все понятно. Для двух других портов небольшие пояснения. Основной демон, фильтрующий вашу почту - spamd. Его конфигурационный файл находится здесь: /usr/local/etc/mail/spamassassin/local.cf
# ==========начало файла local.cf========
# don't use agent
use_razor2      0
use_dcc         0
use_pyzor       0
# check rdl
skip_rbl_checks 0
# autowhitelist
use_auto_whitelist      1
auto_whitelist_path     /var/spool/filter/.spamassassin/auto_whitelist
# bayes
use_bayes               1
bayes_path              /var/spool/filter/.spamassassin/bayes
auto_learn              1
ok_languages            en ru de
ok_locales              en ru de
# rewrite subject
rewrite_subject         1
subject_tag             *SPAM*_HITS_ points* :
required_hits           3.5
report_charset          koi8-r
allow_user_rules        0
clear_report_template
report This message has identified this incoming email as possible spam.
report
report Content preview: _PREVIEW_
report
report Content analysis details: (_HITS_ points, _REQD_ required,_BAYES_ bayes score)
report
report pts  rule name              description
report ---- ---------------------- --------------------------------------------------
report _SUMMARY_
clear_unsafe_report_template
# network whitelist
whitelist_from  localhost
whitelist_to    spam@mycompany.ru (mailto:spam@mycompany.ru)
# ==========конец файла local.cf=========
По пунктам объяснять не буду. Многое разжевано в статье Сергея Тараненко http://www.3nity.ru/viewtopic.htm?t=1459 Файл /usr/local/etc/rc.d/spammerdaemon.sh. Собственно скрипт, запускающий сам демон. Обратите внимание на два параметра. Первый -u filter означает, что демон запускается от некоего виртуального пользователя, имеющего ограниченные права. Про самого пользователя чуть ниже. Второй параметр -s local5. Это вывод сообщений в другой файл-лог. Изначальньно демон spamd все пишет в maillog. Мне это не понравилось, я вывел сообщения от него в другой файл. Так удобнее анализировать. В принципе, я бы вообще его отключил, да вот в документации не нашел, как.
# =========начало файла spammerdaemon.sh==
#!/bin/sh
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 /usr/local/bin/spamd ] && /usr/local/bin/spamd -d -a -u filter -x \
       -s local5 && 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
# =========конец файла spammerdaemon.sh===
Стоит добавить пользователя filter, группу filter, создать каталог /var/spool/filter и назначить пользователя filter его владельцем.
     vipw
        filter:*:1025:1025::0:0:Mail Filter:/var/spool/filter:/sbin/nologin

     vi /etc/group

        filter:*:1025:filter

     mkdir /var/spool/filter
     chown filter:filter /var/spool/filter
Как я уже говорил, мне удобнее, когда сообщения от разных демонов пишутся в разные лог-файлы. Потому, чтобы перенаправить сообщения от spamd в другой файл, создадим пустой файл spamd.log:
   
     cd /var/log
     cat >./spamd.log
     chown filter:filter spamd.log
И скорректируем содержимое двух файлов syslog.conf и newsyslog.conf:
# ========добавка в файл syslog.conf======
local5.*    /var/log/spamd.log
# =========конец файла syslog.conf========
# ======добавка в файл newsyslog.conf=====
/var/log/spamd.log   filter:filter  640  3  2000 * Z
# =======конец файла newsyslog.conf=======

4. Установка и настройка milter-а (spamass-milter) для почтового демона.

Собственно, сам демон, разбирающий почту по косточкам готов. Перейдем к настройкам milter-а, который будет передавать письмо от sendmail к spamd. При установке spamass-milter файлик, объясняющий процедуру активизации фильтра, лежит здесь: /usr/local/share/doc/spamass-milter/activation.txt. Из всего этого я вынес для себя только одну полезную строчку:
      INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')
Ну и собственно скрипт для запуска milter-фильтра. Там ничего сложного нет. Единственное изменение, которое я сделал - это добавил в скрипт адрес, на который будет пересылаться почта, идентифицированная как "СПАМ".
   /usr/local/etc/rc.d/spamass-milter.sh
# =======начало файла spamass-milter.sh===
#!/bin/sh


DAEMON=/usr/local/sbin/spamass-milter
SOCKET=/var/run/spamass-milter.sock
PIDFILE=/var/run/spamass-milter.pid
SPAMADRESS=spam@mycompany.ru

case "$1" in
start)
        if [ -f "${DAEMON}" -a -x "${DAEMON}" ]
        then
                "${DAEMON}" -b "${SPAMADRESS}" -p "${SOCKET}" -f &
                echo $! > "${PIDFILE}"
                sleep 1
                kill -HUP `head -1 /var/run/sendmail.pid`
                echo -n ' spamass-milter running'
        fi
;;
stop)
        if [ -f "${PIDFILE}" ]
        then
                read -r pid junk < "${PIDFILE}"
                kill ${pid}
                rm -f "${SOCKET}" "${PIDFILE}"
                sleep 1
                kill -HUP `head -1 /var/run/sendmail.pid`
                echo -n ' spamass-milter stopped'
        fi
;;
esac 
# ========конец файла spamass-milter.sh===

5. Установка и настройка Касперского.

С настройками фильтров, определяющих наличие спама в сообщениях покончено. Перейдем к установке господина Касперского и мильтера для почтовика. Соответсвенно, качаем откуда-нибудь kav-MailServer-4.0.4.0-FreeBSD-4.x.tgz
      tar xzvf kav-MailServer-4.0.4.0-FreeBSD-4.x.tgz
      pkg_add kav-WorkStationSuite-4.0.4.0-FreeBSD-4.x.tgz
Из всего, что поставится в каталог /usr/local/share/AVP - интересны только эти файлы:
      kavdaemon
      kavscanner
      defUnix.prf
      AvpUnix.ini
Содержание конфигурационных файлов:
# =======начало файла AvpUnix.ini=========
[AVP32]
DefaultProfile=/usr/local/share/AVP/defUnix.prf
[Configuration]
KeysPath=/usr/local/share/AVP
SetFile=avp.set
BasePath=/usr/local/share/AVP/Bases
SearchInSubDir=No
UpdatePath=http://downloads2.kaspersky-labs.com/updates/
# ========конец файла AvpUnix.ini=========

# =======начало файла defUnix.ini=========
# same section with parameters for objects
[Object]
Names=*/home;*/tmp;*/var/tmp;/usr/src;/mnt/cdrom;/usr/tmp;/tmp/kav
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=3
BackupInfected=No
IfDisinfImpossible=1
Warnings=Yes
CodeAnalyser=Yes
RedundantScan=No
SubDirectories=Yes
CrossFs=Yes

# global(common) options sections
[Options]
ScanRemovable=Yes
ScanSubDirAtEnd=No
ParallelScan=No
LimitForProcess=16
EndlesslyScan=No
ScanDelay=-1
Symlinks=1

[Report]
Report=Yes
UseSysLog=No
ReportFileName=/var/log/kav/kavscan.rpt
Append=Yes
ReportFileLimit=Yes
ReportFileSize=500
RepCreateFlag=600
ExtReport=No
WriteTime=Yes
WriteExtInfo=No
UseCR=No
RepForEachDisk=No
LongStrings=Yes
UserReport=No
UserReportName=/var/log/kav/userreport.log
# Showing objects
ShowOK=No
ShowPack=No
ShowPassworded=No
ShowSuspision=No
ShowWarning=No
ShowCorrupted=No
ShowUnknown=No

# Action with infected files
[ActionWithInfected]
InfectedCopy=No
InfectedFolder=/usr/local/share/AVP/infected
CopyWithPath=Yes
# Action with same infection file
ChangeExt=None
NewExtension=Virs
ChownTo=None
ChModTo=No

# Action with suspicion files
[ActionWithSuspicion]
SuspiciousCopy=No
SuspiciousFolder=/usr/local/share/AVP/suspicious
CopyWithPath=No
# Action with same suspicious file
ChangeExt=None
NewExtension=Susp
ChownTo=None
ChModTo=No

# Action with corrupted files
[ActionWithCorrupted]
CorruptedCopy=No
CorruptedFolder=/usr/local/share/AVP/corrupted
CopyWithPath=No
# Action with same corrupted file
ChangeExt=None
NewExtension=Corr
ChownTo=None
ChModTo=No

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

[Priority]
Father=0
Child=0

[Customize]
Sound=No
UpdateCheck=No
UpdateInterval=90
OtherMessages=No
RedundantMessage=No
DeleteAllMessage=No
ExitOnBadBases=Yes
UseExtendedExitCode=Yes 
# ========конец файла defUnix.ini=========
В стандартных конфигах я кое-что переделал. Во-первых, при установке Касперского, он норовит свои конфигурационные файлы поместить в /etc/Avp. Мне это не понравилось, я выкинул оттуда все и поместил в домашний каталог Касперского /usr/local/share/AVP. Отсюда несколько изменений в перечисленных конфигах. Далее, создал два каталога, куда будут валиться логи и временные файлы для проверки на вирусы.
       mkdir /var/log/kav
       mkdir /tmp/kav

6. Установка и настройка milter-а (kavmilter) для почтового демона.

Осталось поставить milter для Касперского. Сам порт находится здесь: /usr/ports/mail/kavmilter.

Процедура все таже, make & make install

При установке kavmilter создается три файлика, один файл запуска самого kavmilter, второй файл запуска демона kavdaemon, третий конфигурационный. Там опять же, я многое поменял, потому просто содержимое файликов:

/usr/local/etc/kavmilter.conf

# =======начало файла kavmilter.conf========
SendmailPipe = /var/run/kavmilter
KAVPipe = /var/run/AvpCtl
PIDFile = /var/run/kavmilter.pid
TempDirectory = /tmp/kav
KAVTimeout = 60
SendmailTimeout = 300
DebugLevel = 0
DaemonMode = yes
InfectedAction = discard
# ========конец файла kavmilter.conf========

    /usr/locat/etc/rc.d/kavmilter.sh

# =======начало файла kavmilter.sh==========
!/bin/sh
PREFIX=/usr/local/libexec

PIPE=/var/run/kavmilter
KAVPIPE=/var/run/AvpCtl
PIDFILE=/var/run/kavmilter.pid
TEMPDIR=/tmp/kav

DPARMS="-D 0"

case "$1" in
start)
         rm -f ${PIPE} > /dev/null && \
         ${PREFIX}/kavmilter ${DPARMS} > /dev/null && echo -n ' kavmilter'
         ;;

stop)
         killall -TERM kavmilter > /dev/null && rm -f ${PIPE} && \
         rm -f ${PIDFILE} && \
         echo "kavmilter stopped"
         ;;

restart)
         killall -TERM kavmilter > /dev/null && rm -f ${PIPE} && \
         rm -f ${PIDFILE} && sleep 5 && \
         ${PREFIX}/kavmilter ${DPARMS} > /dev/null && \
         echo "kavmilter restarted"
         ;;
*)
         echo "Usage: `basename $0` {start|stop|restart}" >&2
         ;;
esac

exit 0
# ========конец файла kavmilter.sh==========
При установке Касперского в /usr/local/etc/rc.d/ создается файл kavd.sh. Я его удалил, вместо него следует использовать другой, что ставится вместе с kavmilter. Некоторые строки мною изменены, потому просто содежимое файла /usr/local/etc/rc.d/kavdaemon.sh:
# =======начало файла kavdaemon.sh==========
#!/bin/sh
PREFIX="/usr/local/share/AVP"
BINDIR="/usr/local/share/AVP"
AVPDIR="/tmp/kav"
AVPPIPE="/var/run"
DPARMS="-Y -f=$AVPPIPE -MP -dl -MD -I0 -o{$AVPDIR} $AVPDIR"

case "$1" in
start)
         $BINDIR/kavdaemon $DPARMS  && echo -n ' kavdaemon'
         ;;
stop)
         [ -f $AVPDIR/AvpPid ] && $BINDIR/kavdaemon -ka > /dev/null \
         && echo "kavdaemon terminated"
         ;;

restart) [ -f $AVPDIR/AvpPid ] && $BINDIR/kavdaemon -ka > /dev/null \
         && $BINDIR/kavdaemon $DPARMS > /dev/null && echo 'kavdaemon restarted'
         ;;
*)
         echo "Usage: `basename $0` {start|stop|restart}" >&2
         ;;
esac

exit 0
# ========конец файла kavdaemon.sh==========

7. Настройка самого почтового демона.

Ну и последнее. Настройка sendmail для фильтрации почты от спама, вирусов и проч. Переходим в каталог с конфигурационными файлами sendmail
    cd /usr/ports/mail/sendmail/work/sendmail-8.12.10/cf/cf
Создаем файл main.mc следующего содержания:
# =======начало файла main.mc===============
divert(-1)
divert(0)
include(`../m4/cf.m4')
VERSIONID(`$FreeBSD: src/etc/sendmail/freebsd.mc,v 1.10.2.11 2001/07/14 18:07:27 gshapiro Exp $')
OSTYPE(freebsd5)
DOMAIN(generic)

FEATURE(`no_default_msa')
DAEMON_OPTIONS(`Port=smtp, Name=MTA')

FEATURE(access_db, `hash -o -T<TMPF> /etc/mail/access')
FEATURE(blacklist_recipients)
FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
FEATURE(relay_based_on_MX)
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')

dnl Realtime Blocking List - AntiSpam Control
dnl FEATURE(dnsbl)
dnl FEATURE(dnsbl, `relays.osirusoft.com', `Mail rejected - see http://relays.osirusoft.com/')
FEATURE(dnsbl,`relays.ordb.org',`Mail rejected - see http://ordb.org/')
FEATURE(dnsbl,`blackholes.easynet.nl',`Mail rejected - see http://blackholes.easynet.nl/')
dnl FEATURE(dnsbl,`inputs.orbz.org', `Mail rejected - see http://orbz.org/')
dnl FEATURE(dnsbl,`relays.visi.com', `Mail rejected - see http://relays.visi.com/')
dnl FEATURE(dnsbl, `ex.dnsbl.org', `Mail rejected - see http://www.dnsbl.org/')
dnl FEATURE(dnsbl,`blackholes.mail-abuse.org',`Mail rejected - see http://mail-abuse.org/')
dnl FEATURE(dnsbl,`relays.mail-abuse.org',`Mail rejected - see http://work-rss.mail-abuse.org/')
dnl FEATURE(dnsbl,`dialups.mail-abuse.org',`Mail rejected; see http://mail-abuse.org/dul/enduser.htm')
dnl Russian DialUp Blocking List
FEATURE(`dnsbl',`dul.ru',`Mail rejected - your are spammer')

dnl Uncomment the first line to change the location of the default
dnl /etc/mail/local-host-names and comment out the second line.
dnl define(`confCW_FILE', `-o /etc/mail/sendmail.cw')
define(`confCW_FILE', `-o /etc/mail/local-host-names')

define(`confMAX_MIME_HEADER_LENGTH', `256/128')
define(`confMAX_MESSAGE_SIZE', 5000000)
define(`confNO_RCPT_ACTION', `add-to-undisclosed')
define(`confPRIVACY_FLAGS', 
`authwarnings,noexpn,novrfy,noetrn,nobodyreturn,goaway,restrictmailq,restrictqrun')
define(`confSMTP_LOGIN_MSG',`Antispam-MTA; "Non-authorized relaying DENIED." $b')
define(`confMAX_RCPTS_PER_MESSAGE', `5')

INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')
INPUT_MAIL_FILTER(`kavmilter',`S=unix:/var/run/kavmilter,F=T')
define(`confMILTER_LOG_LEVEL',`6')

MAILER(local)
MAILER(smtp)
# ========конец файла main.mc===============
Полагаю, что вы немного знакомы с настройкой sendmail, потому не буду объяснять все позиции. Поясню лишь три:
    INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')
Эта строчка говорит, что при получении письма почтовиком, письмо передается фильтру spamassassin для проверки на спам. В результате обработки письму присваивается некий рейтинг.
    INPUT_MAIL_FILTER(`kavmilter',`S=unix:/var/run/kavmilter,F=T')
Эта строчка говорит о том, что после обработки письма на потенциальный спам, письмо попадает к Касперскому, а тот уже делает вывод, содержит ли письмо вирус или нет.
    define(`confMILTER_LOG_LEVEL',`6')
Ну и эта строка лишь уменьшает количество выводимой информации в логи. Что удобно после отладки. Мне ведь нужны в принципе только строки о поступлении и пересылке письма. Для разбора полета письма их вполне достаточно, icon_smile.gif.

Собираем конфигурационный файл sendmail:

    m4 main.mc>sendmail.cf
Его надо перезаписать поверх старого файла /etc/mail/sendmail.cf.

Ну и несколько последних штрихов. На самом деле вы можете этот шаг пропустить или сделать так, как вам удобнее. Я для собственного успокоения создал каталог /usr/local/etc/script. Переместил туда все необходимые мне стартовые скрипты kavdaemon.sh, spammerdaemon.sh, kavmilter.sh, spamass-milter.sh. В каталоге /usr/local/etc/rc.d создал исполняемый скрипт следующего содержания:

# =======начало файла start.sh===============
#!/bin/sh
# my start script

# kavdaemon - antiviral tolkien pro
/usr/local/etc/script/kavdaemon.sh start

# starting mail filter daemon
/usr/local/etc/script/spammerdaemon.sh start
/usr/local/etc/script/kavmilter.sh start
/usr/local/etc/script/spamass-milter.sh start
# ========конец файла start.sh===============
Просто мне так удобнее.

Вот вроде бы и все. Буду благодарен за любые замечания на адрес stranger03@mail.ru

Все права на этот документ принадлежат мне.

Огромное спасибо: Андрееву Павлу, системному администратору Novavox и Тараненко Сергею, системному администратору Trinity за неоценимую помощь в создании данной системы.

С уважением, Дмитриев Геннадий Федорович. Системный администратор ООО "Компьютеры Линтек"

Статья взята с сайта OpenNET.

[ опубликовано 11/02/2004 ]

Дмитриев Геннадий Федорович (stranger03@mail.ru) - FreeBSD 5.1 + Sendmail + Spamassisn + AVP   Версия для печати