Интеграция Антивируса Касперского с почтовой системой

Денис Колисниченко

В этой статье мы рассмотрим два метода установки 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


На этом описание метода можно считать завершенным. Какой из методов использовать - решать вам. При выборе метода руководствуйтесь простым правилом: чтобы работал :). Если будут какие-нибудь вопросы, пишите, постараюсь ответить.


Cчетчик Linux coutner
Hosted by uCoz