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


 Главная  |  Безопасность в сети  Регистрация доменов и хостинг  |  Программирование  |  Библиотека  |  UNIX  |  Украина  |  Иммиграция  |  Поиск  |  Заработок в Интернет  |  Unsorted  |

Hosted by   elektrod.com.ua