|
www.sendmail.aiq.ru
Sendmail+DrWeb
В конце-концов меня достали потоки вирусов, которые присылают мне стар и
млад, и я решил поставить на свой почтовый сервер антивирус. Подумав очень
немного, я остановился на DrWeb. Остановился я на нем по многим причинам, но
самой главной было то, что я имею хорошие связи с DrWeb и после выставки у
меня появился полноценный ключ для DrWeb.
Все нижеприведенное я
ставил на ASPLinux 7.1, поставленный в режиме "разработчик". Все ставилось по
умолчанию. Все тестовые email (multik@router и так далее) со стороны
внешнего мира не доступны ;-). Если вас не удовлетворяют значения по
умолчанию, читайте документацию на drweb и sendmail.
Отмазка: все
нижеприведенное написано в расчете на людей, которые понимают, что делают с
системой, а не просто следуют инструкциям. Не засыпайте меня вопросами про
то, как пересобрать sendmail.cf, что такое m4 и почему ничего
не компилируется. Если вы не чуствуете в себе достаточных знаний - не
делайте ничего.
Итак, забираем с их сайта последюю версию
drweb.
Устанавливаем ее. rpm -i drwebd-4.26-linux.i386.rpm
Все
установилось в /opt/drweb. Имеющийся (ключ drweb32.key) копируем в drweb.key
и drwebd.key. Эти файлы нужны для самого drweb и drwebd.
Первым делом
правим drweb32.ini - меняем OutputMode = Color на OutputMode = Terminal,
иначе из-за красот вы ничего не сможете увидеть нормально.
Проверим,
как работает drweb.
[root@multik /root]# /opt/drweb/drweb
/home/multik/VIRUS.EXE Key file: /opt/drweb/drweb.key Registration
info: 0010007419 ASPLinux Team Loading /opt/drweb/drwebase.vdb - Ok,
virus records: 26390 /home/multik/VIRUS.EXE infected with
Win98.Vecna.23040 Scan report for "/home/multik/VIRUS.EXE": Scanned : 1
Cured : 0 Infected : 1 Deleted : 0 Modified : 0 Renamed : 0
Suspicious : 0 Moved : 0 Scan time : 00:00:00 Scan speed : 22
Kb/s
Как видим, drweb находит в специально подготовленном файле VIRUS.EXE
вирус. Как найти для тестирования вирус, я думаю не проблема. В крайнем
случае воспользуйтесь тестовым вирусом, идущим в комплекте. Где его искать
и создавать, написано в документации к DrWeb.
Теперь настроим
автообновление баз drweb. Для этого служит модуль /update/update.pl. Для его
работы мне понадобился модуль String/CRC32.
Забираем, компилируем и
устанавливаем модуль
wget
http://cpan.org/modules/by-module/String/String-CRC32-1.2.tar.gz tar zxvf
String-CRC32-1.2.tar.gz cd String-CRC32-1.2 perl
Makefile.PL make make install
Теперь открываем в любом текстовом
редакторе update.pl и изменяем 22ю строчку на
my $fetch = "wget -q
-O"; # autotest for fetch, wget
Это необходимо для того, что бы на экран
не выводилась ругань на отсутствие команды fetch. В общем, командуем
update.pl использовать только wget.
Проверяем его
работу
./update.pl /opt/drweb
В итоге в каталоге /opt/drweb должны
появиться последние обновления для drweb. Плюс будет ругань на невозможность
перезапустить drwebd - тут все правильно - он же у нас не запущен
пока.
Теперь делаем небольшой файл для автоматического
обновления. touch /etc/cron.daily/drweb и в любом текстовом редакторе
приводим его содержимое к виду
#!/bin/sh /opt/drweb/update/update.pl
/opt/drweb
Делаем его выполняемым chmod 755
/etc/cron.daily/drweb
и на всякий случай перезапускаем
crond. /etc/init.d/crond restart
Все, теперь у нас в каталоге
/opt/drweb постоянно свежие базы с вирусами. При необходимости поправьте
update.pl и он будет забирать обновления оттуда, откуда скажете.
В
принципе, если на машине есть файловые архивы для windows пользователей,
то полезно рядышком сделать запуск /opt/drweb/drweb -cu -ha -icr
/savlka_file Информацию о ключах смотрите в помощи по drweb.
Теперь
запустим вручную drwebd и посмотрим, что получилось. Если на экране появилось
что-то типа
[root@multik drweb]# ./drwebd Key file:
/opt/drweb/drwebd.key Registration info: 0010007419 ASPLinux
Team Loading /opt/drweb/drwebase.vdb - Ok, virus records: 26390 Daemon is
installed, TCP socket created on port 3000
и в списке открытых портов,
полученных по netstat -napl|grep drweb появится
[root@multik drweb]#
netstat -napl|grep drweb tcp 0 0 127.0.0.1:3000 0.0.0.0:* LISTEN 28499/drwebd
unix 2 [ ] DGRAM 255764247 28499/drwebd
значит drweb демон работает
и даже готов получать задания на вылечивание вирусов. Это
хорошо.
Теперь будем прикручивать drweb к sendmail. Если он у вас новый и
собран, с поддержкой libmilter, то все хорошо. Если нет, то придеться
пересобирать его. У меня мало того, что он был собран без поддержки этой
библиотеки, так он еще оказался и старым. Так что я решил обновить заодно и
sendmail. Кстати, в /opt/drweb/clients/sendmail/readme.sendmail.rus все
расписано. Ниже приведены шаги, которые я делал у себя, согласовываясь с этим
файлом.
Выкачиваем sendmail и разворачиваем его. wget
ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.12.0.tar.gz tar zxvf
sendmail.8.12.0.tar.gz cd sendmail-8.12.0/
Включаем поддержку нужной
библиотеки.
cd devtools/Site/ touch site.config.m4
Добавляем в
этот файл строчки dnl Milter APPENDDEF(`conf_sendmail_ENVDEF',
`-DMILTER')
И компилируем эту библиотеку. cd
../../libmilter/ ./Build -c
И компилируем сам sendmail cd
.. ./Build
Все должно откомпилироваться adduser smmsp - если юзера
такого нет еще
Удаляем старый sendmail, предварительно сохранив
где-нибудь каталог /etc/mail и файл /etc/aliases.
rpm -e --nodeps
sendmail
и устанавливаем новый. ./Build install
Все должно
встать на положенные места.
[root@multik sendmail-8.12.0]# ls -l `which
sendmail` -r-xr-sr-x 1 root smmsp 601664 Окт 1 13:47
/usr/sbin/sendmail
Теперь идем в /opt/drweb/clients/drwebdc и
запускаем configure отвечаем y на все вопросы, кроме communigatepro - он нам
не нужен, и говорим make
В итоге в этом каталоге должны получиться
файлы drwebdc и drweb-smf
говорим adduser drweb - из под этого
пользователя потом будет работать drweb-smf. Ну или потом его можно будет
загнать под какого-нибудь другого бесправного пользователя.
Теперь
идем в /opt/drweb/clients/sendmail
Говорим configure и ВДУМЧИВО отвечаем
на все вопросы, задаваемые скриптом. В итоге получаем файл
drweb-sendmail.init Которым можно рулить всю связку drweb+drweb sendmail
filter ...
Пробуем ./drweb-sendmail.init restart
Оно вроде как
работает ... но хреееново, разборки оставим на потом.
Здесь же появились
файлы sendmail.*.addon - это то,что надо добавить в файлы .cf или .mc
соответвенно
Пересобираем sendmail.cf. Я использовал следующий .mc
файл
divert(-1) include(`/usr/share/sendmail-cf/m4/cf.m4') VERSIONID(`linux
setup for Red Hat
Linux')dnl OSTYPE(`linux') define(`confDEF_USER_ID',``8:12'')dnl undefine(`UUCP_RELAY')dnl undefine(`BITNET_RELAY')dnl define(`confTO_CONNECT',
`1m')dnl define(`confTRY_NULL_MX_LIST',true)dnl define(`confDONT_PROBE_INTERFACES',true)dnl define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl define(`ALIAS_FILE',
`/etc/aliases')dnl define(`STATUS_FILE',
`/var/log/sendmail.st')dnl define(`UUCP_MAILER_MAX',
`2000000')dnl define(`confUSERDB_SPEC',
`/etc/mail/userdb.db')dnl define(`confPRIVACY_FLAGS',
`authwarnings,novrfy,noexpn,restrictqrun')dnl define(`confAUTH_OPTIONS',
`A')dnl dnl TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl dnl
define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl dnl
define(`confTO_QUEUEWARN', `4h')dnl dnl define(`confTO_QUEUERETURN',
`5d')dnl dnl define(`confQUEUE_LA', `12')dnl dnl define(`confREFUSE_LA',
`18')dnl dnl
FEATURE(delay_checks)dnl FEATURE(`no_default_msa',`dnl')dnl FEATURE(`smrsh',`/usr/sbin/smrsh')dnl FEATURE(`mailertable',`hash
-o /etc/mail/mailertable')dnl FEATURE(`virtusertable',`hash -o
/etc/mail/virtusertable')dnl FEATURE(redirect)dnl FEATURE(always_add_domain)dnl FEATURE(use_cw_file)dnl FEATURE(use_ct_file)dnl FEATURE(local_procmail)dnl FEATURE(`access_db')dnl FEATURE(`blacklist_recipients')dnl EXPOSED_USER(`root')dnl dnl
This changes sendmail to only listen on the loopback device 127.0.0.1 dnl
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA') dnl Accept unresovable
domains dnl FEATURE(`accept_unresolvable_domains')dnl dnl
FEATURE(`relay_based_on_MX')dnl MAILER(smtp)dnl MAILER(procmail)dnl MAIL_FILTER(`drweb-filter',
`S=inet:3001@127.0.0.1, F=T,
T=S:5m;R:5m;E:1h') define(`confINPUT_MAIL_FILTERS',
`drweb-filter') define(`confMILTER_LOG_LEVEL',`6')
Как видите, он в
принципе абсолютно стандартный для RedHat-основанных систем.
Запускаем
sendmail и начинаем окончательно проверять все
Проверка простого
файла
[root@multik drweb]# ./drweb /home/multik/VIRUS.EXE Key file:
/opt/drweb/drweb.key Registration info: 0010007419 ASPLinux
Team Loading /opt/drweb/drwebase.vdb - Ok, virus records:
26390 /home/multik/VIRUS.EXE infected with Win98.Vecna.23040 Scan report
for "/home/multik/VIRUS.EXE": Scanned : 1 Cured : 0 Infected : 1 Deleted
: 0 Modified : 0 Renamed : 0 Suspicious : 0 Moved : 0 Scan time :
00:00:00 Scan speed : 22 Kb/s
Проверка работы клиента в режиме работы с
файлами.
[root@multik drwebdc]# ./drwebdc -w
-f/home/multik/VIRUS.EXE Daemon address is not defined, default will be
used. Use defaults library settings: tcp/localhost:3000, timeout(0 sec 0
msec) TCP sockets: call resolver for localhost TCP sockets: resolver
return 127.0.0.1 TCP sockets: connecting to 127.0.0.1:3000. Results:
daemon return code 0x20 (known viruses) Final code 0x1.
Плюс с этими
проверками в /var/log/messages видим следующие сообщения
Oct 1 14:26:43
multik drwebd: /home/multik/VIRUS.EXE infected with Win98.Vecna.23040
То
есть вирусы не скроются от нас.
Теперь отправим письмо с вирусом самому
себе
uuencode /home/multik/VIRUS.EXE VIRUS.EXE| mail -s "Cool Girl"
multik@router
Ооопс ... должны получить что-то подобное
Oct 1
14:56:45 multik sendmail[1287]: f91AujCP001287: from=root, size=31770, class=0,
nrcpts=1, msgid=<200110011056.f91AujCP001287@multik.outpost.sw.ru>,
relay=root@localhost Oct 1 14:56:45 multik sendmail[1288]: f91AujlT001288:
Milter (drweb-filter): error connecting to filter: Connection refused by
127.0.0.1 Oct 1 14:56:45 multik sendmail[1288]: f91AujlT001288: Milter
(drweb-filter): to error state Oct 1 14:56:45 multik sendmail[1287]:
f91AujCP001287: to=multik@router, ctladdr=root (0/0), delay=00:00:00,
xdelay=00:00:00, mailer=relay, pri=30038, relay=localhost [127.0.0.1],
dsn=4.0.0, stat=Deferred: 451 4.7.1 Please try again later
И
drweb-sendmail.init не помогает. Оказывается, судя по логам, drweb-smf
не запускается. Полазив в инете и увидев, что не я один с такой проблемой
сижу, я приуныл. Однако вспомнив, что drweb-smf поставляется в исходных
текстах, я навтыкал в него проверок и отладочных сообщений (что бы я делал с
windows в этом случае, я просто не представляю). К моему огорчению,
оказалось, что скриптописатели у drweb просто ... плохие. Как миниум, не
проверяют, что они там написали. По крайней мере под Linux.
Я
аккуратно поправил файл drweb-sendmail.init. Суть правки простая -
удаляем лишние пробелы в ключах и добавляем запись к ключу -f.
То есть
если ранее строка выглядела так: FILTER_OPT=" -v -f -a
/opt/drweb/infected.!!! -e multik -g multik -x -t 160000 -o drweb -r -h -bt -yt
-ka -jr -zd"
То она должна выглядеть так FILTER_OPT=" -v
-a/opt/drweb/infected.!!! -emultik -gmultik -x -t160000 -odrweb -f/var/tmp -r -h
-bt -yt -ka -jr -zd"
Ну и аналогично я поправил штуки четыре выше. После
этого все стало как в сказке - вирусы ловятся, все команды отрабатываются и
так далее. Понятное дело, что значения ключей и прочего я сознательно оставил
по умолчанию - документация у drweb в этом плане на высоте.
Проверяем
еще раз.
uuencode /home/multik/VIRUS.EXE VIRUS.EXE| mail -s "Cool Girl"
multik@router
И пытаемся забрать почту. Получаем письмо о том, что
письмо-то было того, с вирусом и до нас не дошло. Что и требовалось
получить.
Все, я просто скопировал drweb-sendmail.init в
/etc/init.d/drweb и с помощью ntsysv включил запуск drweb при старте. Дальше
уже пошел тюнинг и это не интересно ;-).
Да, я не претендую на
правильность вышеизложенного, но оно работает. Если вы нашли какие-нибудь
ляпы, будьте добры, напишите мне об этом.
Вот и все. (c) 2001 Вячеслав
Калошин multik@asplinux.ru
|