Денис Колисниченко
В этой статье мы рассмотрим два метода установки AVP, точнее KAV (Kaspersky AntiVirus), на вашем
почтовом сервере.
Первый - это классический метод установки, который, скорее всего, описан в вашем руководстве
по антивирусу. Второй - это новый метод интеграции, о его особенностях мы поговорим немного позже.
Я не буду рассматривать установку, полагая, что AVP вместе с программой AVPKeeper уже установлены
на вашем компьютере. Тем более что обычно при установке KAV проблем не возникает. Самое главное - правильно
настроить антивирус, иначе "программа будет делать то, что вы ей сказали, но не то, что вы хотите". Напомню, что
настройки программы KAV находятся в файле /opt/AVP/AvpUnix.ini, а настройки программы AVPKeeper -
в файле /opt/AVP/kavkeeper/kavkeeper.ini.
Интеграция Антивируса Касперского с почтовой системой
Классический метод
Программа AVPKeeper (kavkeeper) предназначена для обнаружения и удаления вирусов в почтовых сообщениях. Существуют версии данной программы для почтовых систем sendmail, qmail, postfix. Программа sendmail является классическим агентом доставки почты (MTA - Mail Transfer Agent), поэтому в статье будет рассмотрена именно эта программа. Немаловажным фактором для рассмотрения sendmail является фактор предпочтения - я почему-то предпочитаю использовать sendmail.
Программа AVPKeeper может работать в двух режимах: локальном и глобальном. В локальном режиме проверяются только входящие сообщения, которые должны получить пользователи нашего почтового сервера. В глобальном режиме проверяются также и исходящие сообщения, которые наши пользователи отправляют в Internet или другим пользователям. Для небольших сетей рекомендуется использовать локальный режим - он работает быстрее и стабильнее.
Итак, перейдем к настройке. Скопируйте каталог /opt/AVP/kavkeeper/sendmail-cf каталог /usr/share. Теперь выполните следующую команду:
m4 kav_loc.mc > /etc/sendmail.cf
Данная команда настраивает программу AVPKeeper для работы в локальном режиме. Если вам нужен глобальный режим, введите команду:
m4 kav_glb.mc > /etc/sendmail.cf
Обе эти команды нужно вводить, находясь в каталоге /usr/share/sendmail-cf/cf. Перед выполнением данных команд скопируйте куда-нибудь старый файл /etc/sendmail.cf, чтобы можно было его восстановить в случае некорректной интеграции.
Листинги файлов kav_loc.mc и kav_glb.mc приводить не буду - вы можете просмотреть их в любой момент на своей машине. Если вас по каким-либо причинам не устраивают стандартные файлы kav_loc.mc и kav_glb.mc, а интегрировать KAV с sendmail все-таки нужно, укажу, какие строки нужны для совместной работы KAV и sendmail (локальный режим):
dnl define(`KAVKEEPER_MAILER',`/usr/local/bin/kavkeeper') dnl define(`KAVKEEPER_CONFIG',`/etc/kavkeeper.ini') dnl define(`KAVKEEPER_LOCAL_MAILER',`mail.local') ... FEATURE(local_kav)
Естественно, что для нормальной работы нужно правильно указать путь к программе kavkeeper. Скорее всего, у вас программа kavkeeper будет установлена в каталог /opt/AVP/kavkeeper/. Для работы глобального режима используются строки:
dnl define(`KAVKEEPER_CONFIG',`/etc/kavkeeper.ini') define(`KAV_LOCAL_HACK') dnl define(`confDEF_USER_ID',`kavuser:kavuser') dnl define(`confRUN_AS_USER',`kavuser') dnl define(`KAVKEEPER_MAILER_FLAGS', `APhnu9') ... MAILER(kavkeeper)
Функция KAV_LOCAL_HACK необходима для проверки локальной почты. После этого нужно перезагрузить sendmail командой:
/etc/init.d/sendmail restart
Теперь осталось проверить корректность выполненных вами действий. Данную проверку нужно производить только в случае, если вы выбрали глобальный режим работы программы AVPKeeper! В противном случае при проверке вы получите совсем не то, что ожидали. Введите команду:
sendmail -bt
Вы должны увидеть примерно следующее сообщение:
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> >
В ответ на приглашение (>) введите набор правил (3,0) и какой-нибудь адрес. Желательно, чтобы адрес действительно существовал. Я использовал адрес evg@localhost.localdomain.
3,0 evg@localhost.localdomain
В результате на экране вы должны увидеть примно это:
> canonify input: evg @ localhost . localdomain Canonify2 input: evg < @ localhost . localdomain > Canonify2 returns: evg < @ localhost . localdomain . > canonify returns: evg < @ localhost . localdomain . > parse input: evg < @ localhost . localdomain . > Parse0 input: evg < @ localhost . localdomain . > Parse0 returns: evg < @ localhost . localdomain . > ParseLocal input: evg < @ localhost . localdomain . > ParseLocal returns: $# kavkeeper $@ localhost . localdomain . KAV $: evg @ localhost . localdomain . KAV parse returns: $# kavkeeper $@ localhost . localdomain . KAV $: evg @ localhost . localdomain . KAV
Разберемся, что же здесь происходит. Программа sendmail преобразует имя evg@localhost.localdomain в имя evg@localhost.localdomain.KAV и использует для доставки сообщения локальный почтовый агент kavkeeper. Теперь посмотрим, что же сделает sendmail с адресом evg@localhost.localdomain.KAV. Не нужно быть гением, чтобы догадаться, что сейчас произойдет обратное преобразование, то есть адрес evg@localhost.localdomain.KAV будет преобразован в адрес evg@localhost.localdomain (или просто egv), что наглядно отображено в листинге:
> canonify input: evg @ localhost . localdomain . KAV Canonify2 input: evg < @ localhost . localdomain . KAV > localhost.localdomain.KAV: Name server timeout Canonify2 returns: evg < @ localhost . localdomain . KAV > canonify returns: evg < @ localhost . localdomain . KAV > == Ruleset 3,0 (3) status 75 parse input: evg < @ localhost . localdomain . KAV > Parse0 input: evg < @ localhost . localdomain . KAV > Parse0 returns: evg < @ localhost . localdomain . KAV > ParseLocal input: evg < @ localhost . localdomain . KAV > ParseLocal returns: evg < @ localhost . localdomain . > Parse1 input: evg < @ localhost . localdomain . > Parse1 returns: $# local $: evg parse returns: $# local $: evg >
Как видите страшное имя evg@localhost.localdomain.KAV благополучно преобразовалось в имя локального пользователя. Если бы мы отправляли почту не локальному пользователю, а пользователю другой системы (например, пользователю user@avp.ru), наше сообщение было бы передано агенту доставки. Обычно это esmtp.
Я думаю, что теории вполне достаточно, посмотрим, как KAV справляется с возложенной на него задачей. Для этого проведем небольшой эксперимент. В качестве "подопытного кролика" нам будет нужен какой-нибудь вирус, с этим проблем, надеюсь, не будет. Введите команду:
uuencode /root/virus.exe virus.exe | mail -s Virus user@localhost
С помощью данной команды мы отправим письмо нашему локальному пользователю, содержащее вирус. После отправления письма программа AVPKeeper проверит (точнее передаст письмо для проверки программе kavdaemon, которая должна загружаться автоматически при запуске системы) его и, обнаружив вирус, сообщит об этом. Прежде всего, будет отправлено сообщение отправителю (пользователь root), что в его сообщении обнаружен вирус, затем об этом будет уведомлен администратор системы (root), после этого будет отправлено третье сообщение - адресату (пользователь evg), о том, что отправитель пытался отправить сообщение с вирусом. Последовательность отправления сообщений и их содержание зависит от настроек программы AVPKeeper. Настройки программы можно изменить, отредактировав файл kavkeeper.ini.
На этом описание классического метода "сопряжения" антивируса KAV (AVP) с почтовой системой можно считать завершенным. Самое время перейти к описанию совершенно нового метода интеграции.
Новый метод интеграции заключается в настройке двух очередей для почтовых сообщений. Одна очередь будет в /var/spool/mqueue, а вторая /var/spool/mqueue1. Напомню, что обычно используется одна почтовая очередь.
Приступим к настройке. Остановите sendmail и создайте новый подкаталог для почты в каталоге /var/spool:
mkdir mqueue1 chown root.mail mqueue1
В уже существующий файл sendmail.mc добавляем строки:
define(`QUEUE_DIR',`/var/spool/mqueue1') MAILER(kavkeeper2)
После чего нужно создать файл sendmail.cf:
m4 sendmail.mc > /etc/sendmail.lis.cf
В файле конфигурации kavkeeper добавьте строку:
sendmail=/usr/sbin/sendmail -oi -C/etc/sendmail.cf -i -f$f -- $u
Запускать sendmail для работы с двумя очередями нужно так:
/sbin/sendmail -bd -C /etc/sendmail.lis.cf /sbin/sendmail -q10m -C /etc/sendmail.cf
Для большей определенности приведу листинг mc-файла:
divert(-1) dnl This is the macro config file used to generate the /etc/sendmail.cf .... dnl work. include(`../m4/cf.m4') define(`confDEF_USER_ID',``8:12'') OSTYPE(`linux') undefine(`UUCP_RELAY') undefine(`BITNET_RELAY') define(`confAUTO_REBUILD') define(`confTO_CONNECT', `1m') define(`confTRY_NULL_MX_LIST',true) define(`confDONT_PROBE_INTERFACES',true) define(`QUEUE_DIR',`/var/spool/mqueue1') define(`KAVKEEPER_MAILER',`/opt/AVP/kavkeeper/kavkeeper') define(`KAVKEEPER_CONFIG',`/etc/kavkeeper.ini') FEATURE(`smrsh',`/usr/sbin/smrsh') FEATURE(mailertable) FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable') FEATURE(redirect) FEATURE(always_add_domain) FEATURE(use_cw_file) MAILER(smtp) MAILER(kavkeeper2) FEATURE(`access_db') FEATURE(`blacklist_recipients') ...
Вам также потребуется еще один файл - kavkeeper2.m4. Его листинг ниже:
PUSHDIVERT(-1) ifdef(`KAVKEEPER_MAILER_PATH',, `ifdef(`KAVKEEPER_MAILER', `define(`KAVKEEPER_MAILER_PATH', KAVKEEPER_MAILER)', `define(`KAVKEEPER_MAILER_PATH', /opt/AVP/kavkeeper/kavkeeper)')') ifdef(`KAVKEEPER_MAILER_FLAGS',, `define(`KAVKEEPER_MAILER_FLAGS', `ASPhnu9')') define(`KAV_CONF_ARG', ifdef(`KAVKEEPER_CONFIG', `-c KAVKEEPER_CONFIG', `')) ifdef(`KAVKEEPER_MAILER_ARGS',, `define(`KAVKEEPER_MAILER_ARGS', `kavkeeper -s $f -r $u -x $h -m sendmail KAV_CONF_ARG')') POPDIVERT VERSIONID(`@(#)kavkeeper.m4 1.0 (Kaspersky Lab) 20/03/2000') Mkavkeeper, P=KAVKEEPER_MAILER_PATH, F=CONCAT(`DFM', KAVKEEPER_MAILER_FLAGS), S=0, R=0, T=DNS/RFC822/X-Unix, ifdef(`KAVKEEPER_MAILER_MAX', `M=KAVKEEPER_MAILER_MAX, ')A=KAVKEEPER_MAILER_ARGS LOCAL_RULE_0 R$* $#kavkeeper $@$1 $:$1
На этом описание метода можно считать завершенным. Какой из методов использовать - решать вам. При выборе метода руководствуйтесь простым правилом: чтобы работал :). Если будут какие-нибудь вопросы, пишите, постараюсь ответить.