Установка и настройка антивируса DrWeb для sendmail под FreeBSD4.5.
«Поставлю-ка DrWeb под FreeBSD4.5 и sendmail» — подумал я, и вот результат. Особенно мне понравилось, что демо-версия вполне пригодна для использования — она не может только лечить заражённые файлы, смотреть почтовые базы и заглядывать в архивы, а мне этого особо и не надо 🙂
Скачиваем с сайта www.drweb.ru дистрибутив антивируса.
Дистрибутивы версии, которую использовал я, можете скачать из моего архива:
drweb-4.28.1-freebsd4.tgz (1,4Мб)
а также фильтр drweb-smf для сендмейла:
drweb-sendmail-4.28.3-freebsd4.tgz (200Кб)
Схема проверки почты достаточно проста и понятна. Если объяснять своими (моими 🙂 словами, то получается примерно так — сендмейл, получив сообщение, передаёт его фильтру drweb-smf, который, обращаясь к демону
drwebd, проверяет сообщение, если демон не находит в нём вирус, то сообщение попадает к адресату, если же в сообщении найден вирус, то фильтр, в зависимости от настроек, помещает в карантин и рассылает уведомления отправителю, получателю и администратору.
Установка и настройка сканера и демона DrWeb
Во-первых хочу отметить, что для всего есть очень даже приличные описания как на английском, так и на русском языках. Так что особых проблем у меня не возникло.
Распаковываем файл drweb-4.28.1-freebsd4.tgz и видим дерево каталогов:
etc
opt
usr
var
Раскладываем всё куда положено, и получается вот что:
/etc/drweb — конфиги демона и фильтра;
/usr/local/drweb — бинарники и дока;
/usr/local/etc/rc.d — скрипт запуска демона drwebd;
/var/drweb — временные файлы, спул, сокеты.
Правим в файле /etc/drweb/drweb32.ini некоторые ключики, связанные с путями размещения компонентов антивируса:
[BSD] EnginePath = "/usr/local/drweb/lib/drweb32.dll" Key = "/usr/local/drweb/drweb.key" UpdatePath = "/var/drweb/bases" [BSD:Daemon] EnginePath = "/usr/local/drweb/lib/drweb32.dll" Key = "/usr/local/drweb/drwebd.key" UpdatePath = "/var/drweb/bases"
Демон может взаимодействовать с фильтром через TCP/IP соединение, например, если демон и фильтр работают на разных машинах. В случае же если и демон и фильтр установлены на одном копьютере, то им лучше взаимодействовать через локальный UNIX-сокет (зачем нам лишний открытый порт). Для этого нам нужно
внести несколько исправлений в конфиг /etc/drweb/drweb32.ini в раздел демона:
[BSD:Daemon] ;SocketMode = TCP (закомментировали) ;DaemonPort = 3000 (закомментировали) SocketFile = "/var/drweb/run/drwebd.socket" SocketMode = Unix SocketAccess 0666
Также хотелось бы, чтобы демон работал не от имени рута, а от имени пользователя drweb, для чего, в том же /etc/drweb/drweb32.ini исправляем ключик:
User = drweb
Ну и, конечно же, должен быть создан указанный пользователь, лучше в поле пароля задать ему «*», чтобы никто не смог использовать этот логин для других целей, также папка /var/drweb должна принадлежать этому пользователю.
Теперь попробуем обновить антивирусные базы. Для этого есть скрипт /usr/local/drweb/update/update.pl. Почему он у меня сразу работать не захотел, ругался вот так:
mv: rename /tmp/drw42805.vdb0.957098969258368 to /var/drweb/bases/*.vdb,/var/drweb/bases/drw42805.vdb: No such file or directory
Оказалось, что неверно описаны пути к базам, исправил:
# grep update /etc/drweb/* drweb32.ini:UpdatePath = "/var/drweb/updates" drweb32.ini:UpdatePath = "/var/drweb/updates"
Создал указанную папку. После этого обновление работает без ошибок.
Для проверки можем запустить сканер (/usr/local/drweb/drweb), если всё нормально, то он должен сказать что-то типа этого:
Key file: /usr/local/drweb/drweb.key Registration info: 0100003942 Evaluation Key (ID Anti-Virus Lab. Ltd, St.Petersburg) This is an EVALUATION version with limited functionality! To get your registration key, call regional dealer. Loading /var/drweb/bases/drwtoday.vdb - Ok, virus records: 117 Loading /var/drweb/bases/drw42804.vdb - Ok, virus records: 123 Loading /var/drweb/bases/drw42803.vdb - Ok, virus records: 73 Loading /var/drweb/bases/drw42802.vdb - Ok, virus records: 143 Loading /var/drweb/bases/drw42801.vdb - Ok, virus records: 76 Loading /var/drweb/bases/drwebase.vdb - Ok, virus records: 29405
Отлично! Попробуем подсунуть сканеру какой-нибудь вирус. Для этого лучше использовать специальный тестовый якобы_вирус 🙂 Почитайте описание этого тестового вируса в файле /usr/local/drweb/doc/readme.eicar
Скопируйте оттуда строку:
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
в отдельный файл, например, test.com. Этот файл и будем проверять сканером:
/usr/local/drweb/drweb test.com
В отчёте сканера должна быть строчка:
... /usr/local/drweb/test.com infected with EICAR Test File (NOT a Virus!) ...
Ура! Сканер работает и находит вирусы.
Если я не ошибаюсь, сканер в проверке почты никак не участвует. Нас больше интересует демон drwebd. Запускаем его:
/usr/local/etc/rc.d/drwebd.sh start
Если демон нормально запустился, то в папке /usr/var/drweb/run должен быть создан сокет (специальный файл) drwebd.socket, а также отчитаться в логи:
... Daemon is installed, UNIX socket created in file /var/drweb/run/drwebd.socket
Метод вывода логов задаётся в конфиге /etc/drweb/drweb32.ini. По-умолчанию, логи передаюся syslog-демону с типом Daemon:
SyslogFacility = "Daemon"
В документации сказано, что проверить работу демона можно с помощью клиента drwebc, который прилагается в дистрибутиве. Но, судя по всему, это не относится к данному дистрибутиву, т.к. такой программы я не нашёл. Есть правда программа /usr/local/drweb/clients/demo/drwebdc-demo, но разобраться с ней оказалось сложнее чем настроить непосредственно фильтр drweb-smf.
Установка и настройка фильтра drweb-smf
Распаковываем файл drweb-sendmail-4.28.3-freebsd4.tgz, видим две папки etc и opt. Делаем то же, что и для сканера и демона, т.е. перекладываем etc/drweb в /etc/drweb, а opt/drweb /usr/local/drweb.
Поправляем конфиг фильтра /etc/drweb/drweb_smf.conf (описание на русском языке прилагается в дистрибутиве):
[DaemonCommunication] Address = local:/var/drweb/run/drwebd.socket [SendmailCommunication] Address = local:/var/drweb/run/drweb-smf.sock [Actions] ScanningErrors = tempfail ProcessingErrors = tempfail [NotificationOptions] NotifyHashSalt = !!!Chtob_nikto_ne_dogodalsya!!! [VirusNotifications] SenderNotify = no
Обязательно нужно исправить первые два ключа Address. Последний ключ я выставляю в no, т.к. не считаю нужным отсылать уведомление о вирусе отправителю, т.к. мне кажется, что чаще всего обратный адрес указан фальсифицированный и лишняя нагрузка на почтовый сервер будет напрасной.
Также по умолчанию параметр ScanningErrors установлен в reject — в случае ошибок сканирования отвергать все сообщения, т.е. сообщения вернутся с ошибкой, мне кажется лучше поставить значение tempfail — временная недоступность, почтовая система будет пытаться отправить сообщение позже. Примерно то же самое относится в параметру ProcessingErrors.
Интересная, и неожиданная для меня, возможность задания списка исключений для фильтра (/etc/drweb/users.conf), т.е. вы можете указать для каких адресов проверять сообщения, а для каких не проверять. Пример файла
/etc/drweb/users.conf:
[version=2] # не проверять входящую почту для этих адресов: deny to subst malik@mydomain.kg deny to subst igor@mydomain.kg # для остальных проверять входящую почту: allow to regex .*
В данном случае получается, что фильтр должен проверять почту только для пользователей igor@myhost.kg и malik@myhost.kg, а почту для остальных адресов домена не проверять.
Об угловых скобках. В примерах из поставки адреса указаны без угловых скобок, но у меня точное соответствие (exact) без них никак не получалось. А вот с угловыми скобками всё отлично работает, но всё равно надёжнее указывать не точное соответствие exact, а поиск подстроки subst.
ВАЖНО!!! Однажды очень долго боролся с этими списками, пока не задал вопрос на форуме производителя DrWeb-а (спасибо Sergey Akhapkin). Короче говоря, при использовании этих списков необходимо проверить значение параметра DenyMode в конфиге почтового фильтра (drweb_smf.conf) и выставить подходящее значение.
В конце концов, запускаем фильтр (демон должен быть уже запущен) и проверяем наличие в процессах демона и фильтра:
ps xa|grep drweb
Перекомпиляция сендмейла с поддержкой milter-а
Для работы drweb-фильтра необходим сендмейл, скомпилированный с поддержкой milter-а. К сожалению, сендмейл на моей машине оказался без оной. Ну раз уж нужно перекомпилировать сендмейл скачаю последнюю версию: sendmail.8.12.3.tar.gz (1,8Мб)
Компилирую и устанавливаю сендмейл с поддержкой milter-а (все пути даются относительно папки с дисрибутивом):
— дописываю в файл devtools/Site/site.config.m4 (если такого файла нет, то
создаём):
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')
— в папке libmilter говорим
Build Build install
— в папке дистрибутива sendmail запускаю:
Build -c Build install
Готово — скомпилировали и установили. Про стандартную настройку сендмейла не говорю, это должен знать каждый (кто взялся за установку антивируса 🙂
В моём случае, предыдущая версия сендмейла не отличалась от новой по настройкам, поэтому ничего менять не пришлось.
Запускаю и проверяю работоспособность моей почтовой системы — 25-й порт слушает, почту получает/отправляет, логи пишет — красота 🙂
Правим sendmail.cf
Чтобы сообщения передавалиь фильтру drweb-smf нужно внести некоторые изменения в конфиг сендсейла. Считается, что правильнее внесить изменения в sendmail.cf при помощи m4, но в данном случае мне этот метод показался слишком громоздким и длинным (да простят меня знатоки сенмейла 😉 Я просто, как описано в документации к фильтру, добавил несколько строк в существующий sendmail.cf:
# Input mail filters O InputMailFilters=drweb-filter O Milter.LogLevel=6 O Milter.macros.envfrom=i Xdrweb-filter, S=local:/var/drweb/run/drweb-smf.sock, F=T,T=S:5m;R:5m;E:1h
Говорим сендмейлу о необходимости перечитать свой конфиг:
kill -HUP `head -1 /var/run/sendmail.pid`
Смотрим логи сендмейла /var/log/maillog и, если всё нормально, пробуем послать сообщение с вложенным тестовым вирусом. Если возникают какие-либо проблемы — внимательно читайте логи. Можно увеличить уровень логирования в sendmail.cf:
O Milter.LogLevel=14
А также изменить в конфиге фильтра /etc/drweb/drweb_smf.conf значение параметра в секции [Logging]:
Level = Verbose
Запуск
Теперь необходимо запускать демон и фильтр при загрузке системы.
Правильнее для этого поместить скрипт в папку /usr/local/etc/rc.d При этом скрипт обязательно должен понимать ключи start и stop, и иметь расширение ‘sh’.
Учтите также, что если работа завершилась неправильно (например, комьютер перезагрузился из-за скачка напряжения), то сохранившийся сокет фильтра (/var/drweb/run/drweb-smf.sock) не позволит ему запуститься в следующий раз.
У меня получился вот такой скрипт:
#!/bin/sh RETVAL=0 case "$1" in start) echo -n "Starting Dr. Web daemon..." /usr/local/drweb/drwebd rm /var/drweb/run/drweb-smf.sock /usr/local/drweb/drweb-smf ;; stop) echo -n "Shutting down Dr. Web daemon..." kill -TERM `cat /var/drweb/run/drwebd.pid | head -1` killall -TERM drweb-smf ;; *) echo "Usage: $0 {start|stop}" RETVAL=1 esac exit $RETVAL
Для полного счастья осталось только регулярно запускать скрипт обновления, например, из папок /etc/periodic/daily или /etc/periodic/weekly
Ну вот вроде и всё.
Май 2002.