Почтовый сервер на базе Postfix. Защита от вирусов и нежелательной почты минимальными средствами.
1. Отступление.
Некоторое время назад в январском номере за 2004 год вышла моя статья, посвященная секретам настройки почтовых фильтров на базе MTA Sendmail. Тогда я не предполагал, что она может вызвать такой широкий интерес и привести к целому ряду публикаций на совершенно разные темы. Очень большое количество откликов со стороны читателей натолкнуло меня на мысль поделиться своими новыми изысканиями в области системного администрирования.
2. Немного теории.
Среди многочисленных систем передачи информации в глобальной сети Internet немаловажную роль играет система передачи электронных сообщений от одного респондента к другому. Она включает в себя клиентов доставки, протоколы передачи данных и процедуры согласования между агентами. Один из основных агентов, отвечающий за доставку сообщения от одного клиента к другому, получил название MTA (Mail Transfer Agent). На сегодняшний день этих агентов насчитывается уже более десяти. В данной статье речь пойдет об MTA Postfix.
Почему именно он? Некоторое время назад я сменил работу, перейдя в одну из лучших фирм Петербурга на должность ведущего инженера. Системный администратор, занимавшийся управлением сетевой инфраструктурой фирмы, был безумно занят каким-то серьезным проектом и меня попросили помочь в решении небольшой проблемы, связанной с постоянным падением почтового сервера. Таким образом я получил в свои руки связку из Red Hat Enterprise Linux (RHEL) 3.0 и как-то настроенного Postfix. При всем моем скептическом отношении к Linux меня в данной ситуации подогревал жуткий интерес, какими минимальными средствами можно заставить корректно работать данную систему. При этом требовалось, чтобы она выполняла функции фильтрации почты как на вирусы, так и на нежелательную корреспонденцию. В этой статье я не буду подробно описывать всю систему цеиком, материалов на похожие темы предостаточно. Я лишь укажу на некоторые интересные моменты в данной связке и покажу, какими минимальными средствами можно получить вполне рабочую систему. Итак, начнем.
3. Kaspersky.
Со времен выхода первой статьи, где я рассказывал о связке Sendmail и Kaspersky Antivirus for FreeBSD, ничего не изменилось. Однако, для привязки Kaspersky Antivirus в RHEL 3.0 нужно будет использовать отдельную утилиту, обеспечивающую шлюз для обмена данными между Postfix-ом и антивирусной программой. Но все по порядку.
Первое, с чего мы начнем - это создадим отдельную группу и пользователей, от имени которых будут работать наши демоны. Они пригодятся нам в дальнейшем, когда мы будем устанавливать и настраивать спам-фильтры.
Код: Выделить всё
# groupadd filter ?g 551
# mkdir /var/spool/filter /var/spool/filter/spamd /var/spool/filter/avp
# useradd -u 542 -g 551 -d /var/spool/filter/spamd -s /sbin/nologin avpclient
# useradd -u 543 -g 551 -d /nonexistent -s /nonexistent avpdaemon
# chown avpclient:filter /var/spool/filter/spamd
# cd /var/spool/filter/avp
# mkdir Bases ctl dev etc proc tmp tst usr var var/log
# chown ?R avpdaemon:filter Bases ctl tmp tst var
# cd dev
# mknod console c 0 0
# mknod null c 2 2
Покончив с деревом каталогов, берем дистрибутив Kaspersky Antivirus for Linux Server (kavwslinux-4.0.3.1.tgz), распаковываем:
Код: Выделить всё
#tar xzvf kavwslinux-4.0.3.1.tgz
#cd kavwslinux
Код: Выделить всё
AvpUnix.ini
kavdaemon
kavscanner
kavupdater
а также файл /etc/defUnix.prf
Код: Выделить всё
# ls ?all
drwxr-xr-x 17 root wheel 4096 Фев 14 19:36 .
drwxr-xr-x 4 root wheel 4096 Янв 15 15:17 ..
-rwxr-xr-x 1 root wheel 21713 Янв 14 19:44 avcheck
-rw-r--r-- 1 root wheel 170 Янв 17 11:54 AvpUnix.ini
drwxr-xr-x 2 avpdaemon filter 4096 Янв 27 13:31 Bases
drwxr-xr-x 2 avpdaemon filter 4096 Фев 14 18:15 ctl
-rw-r--r-- 1 root wheel 1865 Янв 15 14:44 defUnix.prf
drwxr-xr-x 2 root wheel 4096 Янв 15 14:31 dev
drwxr-xr-x 2 root wheel 4096 Янв 15 14:44 etc
-rwxr-xr-x 1 avpdaemon filter 830742 Янв 24 2003 kavdaemon
-rwxr-xr-x 1 root wheel 803771 Янв 24 2003 kavscanner
-rwxr-xr-x 1 root wheel 647648 Янв 24 2003 kavupdater
drwxr-xr-x 2 root wheel 4096 Янв 15 14:30 proc
drwxr-xr-x 2 avpdaemon filter 4096 Фев 10 14:49 tmp
drwxr-xr-x 2 avpclient filter 4096 Фев 15 10:57 tst
drwxr-xr-x 2 root wheel 4096 Янв 15 14:30 usr
drwxr--r-- 3 avpdaemon filter 4096 Янв 15 14:55 var
Код: Выделить всё
[AVP32]
# Меняем путь к основному конфигурационному файлу
DefaultProfile=defUnix.prf
[Configuration]
KeysPath=.
# Прописываем путь к вирусным базам от корневого каталога
BasePath=/Bases
Код: Выделить всё
# defUnix.prf
# same section with parameters for objects
[Object]
# Указываем каталог, в котором будем проводить сканирование файла на вирусы.
Names=*/tst
# Отключаем сканирование памяти и секторов логических томов
Memory=No
Sectors=No
# Указываем параметры сканирования упакованных файлов, архивов,
# саморазворачивающихся архивов и так далее.
Packed=Yes
Archives=Yes
SelfExtArchives=Yes
MailBases=Yes
MailPlain=Yes
Embedded=Yes
# Устанавливаем реакцию на обнаружение вируса в теле письма
# «3» означает удаление тела вируса без попыток его лечения.
InfectedAction=3
# Требуем не архивировать письмо в случае обнаружения вируса
BackupInfected=No
IfDisinfImpossible=1
[Report]
# Требуем вести файл журнала
Report=Yes
UseSysLog=No
# Прописываем путь к файлу журнала
ReportFileName=/var/log/kavscan.log
# Отключаем расширенные формы записи в журнале
ExtReport=No
RepForEachDisk=No
LongStrings=Yes
# Отключаем пользовательский файл журнала
UserReport=No
# Устанавливаем реакцию на обнаружение вируса: не делать копии писем
[ActionWithInfected]
InfectedCopy=No
# Устанавливаем порядок действий при подозрении на вирус: не делать копии писем
[ActionWithSuspicion]
SuspiciousCopy=No
# Устанавливаем порядок действий в случае, если не удалось распаковать файл (считаем
# его поврежденным): не делать копии писем
[ActionWithCorrupted]
CorruptedCopy=No
[TempFiles]
# Устанавливаем предельный размер сканируемых файлов и определяем
# каталог для временных файлов
UseMemoryFiles=Yes
LimitForMemFiles=6000
MemFilesMaxSize=20000
TempPath=/tmp
[Customize]
# Отключаем проверку необходимости обновления вирусных баз
# Данная опция необходима работы антивирусной программы без вмешательства
# администратора. В противном случае она будет просить обновить базы каждый
# раз при загрузке
UpdateCheck=No
# Отключаем все лишние предупреждения на консоли сервера
OtherMessages=No
RedundantMessage=No
DeleteAllMessage=No
Приведу сценарий для запуска процедуры обновления вирусных баз. Он достаточно маленький и состоит из двух строчек. Этот скрипт следует прописать в crontab для ежедневного выполнения, скажем, в час ночи.
Код: Выделить всё
# updater.sh
#!/bin/sh
/var/spool/filter/avp/kavupdater -y -kb -ui=http://downloads2.kaspersky-labs.com/updates/ -b=/var/spool/filter/avp/Bases
/etc/init.d/kavd restart
Код: Выделить всё
# /etc/init.d/kavd
# Указываем каталог, в который установлен антивирусный фильтр
INSTPATH=/var/spool/filter/avp
# Указываем каталог, в котором будем тестировать файлы
AVPDIR="/tst"
# Указываем каталог для хранения сокета
AVPPIPE="/ctl"
# Указываем параметры запуска демона
DPARMS="-Y -MP -f=$AVPPIPE -dl -MD -I0 -o{$AVPDIR} $AVPDIR"
# Строки, проверяющие наличие конфигурационных и ключевых файлов
# можно исключить. В случае корректной настройки системы они не нужны
# Далее в секции запуска демона убираем проверку демонстрационной версии,
# наличия вирусных баз и корректируем строку запуска самого демона
# Почему она выглядит именно так, будет объяснено чуть позже
start ()
{
if [ -r "$PIDFILE" ]; then
echo "$NAME is running"
exit 1
fi
cd $INSTPATH
echo -n "Starting $DESC: "
daemon "/bin/env - HOME=/ /bin/nice /var/spool/filter/avp/uchroot -u avpdaemon $INSTPATH /kavdaemon $DPARMS"
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$NAME
cd $WD
}
Код: Выделить всё
daemon "/bin/env - HOME=/ /bin/nice /var/spool/filter/avp/uchroot -u avpdaemon $INSTPATH /kavdaemon $DPARMS"
Код: Выделить всё
# cd /home/gennadiy
# tar xzvf avcheck-0.8.tar.gz
# cd avcheck-0.8
# make
# cp avcheck /var/spool/filter/avp/
# cp uchroot /var/spool/filter/avp/
# mkdir /var/spool/filter/avp/infected
# cp infected.ex2.ru /var/spool/filter/avp/infected
Код: Выделить всё
# infected.ex2.ru
# Оставляем данную строчку пустой, чтобы не посылать лишних сообщений отправителю
# и получателю вирусного сообщения
VIRUS_ALERT=
# Отключаем информативные сообщения отправителю и получателю
INFORM_SENDER=n # no send alert
INFORM_RCPT=n # send alert to recipients
# Удаляем функции attach_message() и attach_message_headers()
# В секции генерации предупреждения администратору убираем вызов функции
# attach_message()
# Также в случае, если мы не используем информативные сообщения отправителю
# и получателю вирусного письма, можно удалить секции
# «send alert to sender»
# «alert to recipients»
4. Spamassassin.
С фильтром на нежелательную почту все немного проще. Находим дистрибутив, скачиваем, распаковываем, устанавливаем:
Код: Выделить всё
# tar xzvf Mail-SpamAssassin-3.0.2.tar.gz
# cd Mail-SpamAssassin-3.0.2
# make
# make install
Все необходимые каталоги были созданы нами ранее.
Конфигурационный файл Spamassassin:
Код: Выделить всё
# 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/spamd/auto_whitelist
# bayes
use_bayes 1
bayes_auto_learn 0
bayes_path /var/spool/filter/spamd/bayes
bayes_expiry_max_db_size 1500000
bayes_auto_learn_threshold_nonspam 0.1
bayes_auto_learn_threshold_spam 10.0
bayes_min_ham_num 100
bayes_min_spam_num 200
auto_learn 0
ok_languages en ru
ok_locales en ru
# Spam header rewriting - clear_headers
rewrite_header subject ****SPAM (_SCORE_)****
required_hits 3.5
# user rules
allow_user_rules 0
# report options
always_add_report 1
report_safe 0
report_charset koi8-r
# dns testing
dns_available no
# score options
score FROM_ILLEGAL_CHARS 1.5
score HEAD_ILLEGAL_CHARS 1.5
score SUBJ_ILLEGAL_CHARS 1.5
score SUBJ_HAS_SPACES 2.5
score NO_REAL_NAME 1.0
score PENIS_ENLARGE 3.5
score PENIS_ENLARGE2 3.5
score FROM_HAS_MIXED_NUMS 1.0
score FORGED_IMS_TAGS 0.5
score FORGED_MUA_OUTLOOK 0.5
score FORGED_OUTLOOK_TAGS 0.5
score BAYES_80 3.5
score BAYES_90 4.0
score BAYES_99 10.0
# network whitelist
whitelist_from localhost
Код: Выделить всё
# /etc/init.d/spamd
# Set default spamd configuration.
SPAMDOPTIONS="-d -m 5 -u avpclient -x -r /var/run/spamd/spamd.pid"
5. Postfix.
Каких-то особых хитростей в конфигурации данного почтового сервера я описывать не буду. Статей на эти темы предостаточно и в «Системном администраторе», и в глобальной сети. Нам интересны лишь моменты, связанные с использованием настроенных нами почтовых фильтров. Для этого в файле main.cf необходимо включить фильтр avcheck:
Код: Выделить всё
# main.cf
content_filter=avcheck
Код: Выделить всё
# master.cf
# check mail with spamd and kaspersky
avcheck unix - n n - 5 pipe
flags=q user=avpclient argv=/usr/bin/spamc -u avpclient -e /var/spool/filter/avp/avcheck
-i /var/spool/filter/avp/infected/infected.ex2.ru -h Ok
-d /var/spool/filter/avp/./tst -s AVP:/var/spool/filter/avp/ctl/AvpCtl -f ${sender}
-S :1025 -- ${recipient}
localhost:1025 inet n - n - - smtpd -o content_filter=
6. Последние штрихи.
Кажется, все хорошо. Почта работает, вирусы отлавливает, спам идентифицирует. Но как всегда хочется большего. В связке Sendmail + Spamassassin в milter-е (это маленькая программа, осуществляющая транспорт между MTA и почтовым фильтром) можно было указать, на какой адрес пересылать всю нежелательную корреспонденцию. В Postfix мы воспользуемся стандартными средствами фильтрации по заголовкам письма. Однако прежде чем это делать, нам необходимо проверить, чтобы наш MTA был не ниже версии 2.1. Ранние версии не поддерживают инструкцию REDIRECT. Находим дистрибутив для RHEL 3.0, устанавливаем.
Код: Выделить всё
# rpm ?Uvh postfix-2.1.5-4.rhel3.i386.rpm
Код: Выделить всё
# main.cf
header_checks=regexp:/etc/postfix/header.regexp
Код: Выделить всё
# header.regexp ====
/^X-Spam-Flag: YES/ REDIRECT spam@company.ru
Соответственно, стоит позаботится, чтобы у нас в системе присутствовал пользователь с именем «spam» или на существующего пользователя была сделана ссылка (alias). Таким образом весь почтовый трафик, идентифицированный как потенциальный спам, будет перенаправлен на определенный адрес. Вот, вроде бы, и все.
7. Ссылки, итоги и благодарности.
В этой статье я попытался поделиться секретами настройки почтовых фильтров на базе MTA Postfix. Статей на подобные темы достаточно, однако, некоторые из них слишком громоздки и используют очень большое количество связок. Другие же слишком неполны. Я попытался обойтись минимальными средствами, чтобы получить максимальный уровень защиты. Ведь чем проще система, тем легче за ней следить.
Хочется выразить огромную благодарность Сергею Тараненко, системному администратору фирмы Тринити, за интеллектуальную поддержку.
Большое количество полезной информации вы найдете на форуме http://www.3nity.ru. Для тех, кому лень разбираться в тонкостях настройки системы, тексты конфигурационных файлов будут опубликованы на сайте журнала или на техническом форуме Тринити.
С уважением, Дмитриев Геннадий.
Stranger03@mail.ru