Ключевые слова:mail, filter, sendmail, blocking, howto, milter, (найти похожие документы)
Date: Mon, 03 Jun 2002 21:46:06 +0400
From: Dmytro Fadeyenko <[email protected]>
Newsgroups: fido7.ru.unix.bsd
Subject: Прикручивание к sendmail фильтр аттачей по расширениям (vbsfilter)
Выкладываю для публичного обнюхивания и обругивания бета-версию HOWTO по
прикручиванию vbsfilter. Буду рад, если кому-то пригодится. :)
Прикручиваем к sendmail'у фильтр аттачей по расширениям
1. Лирическое вступление
~~~~~~~~~~~~~~~~~~~~~~~~
Рассмотрим классический случай: вы настраиваете почтовый сервер в
организации, где большая часть пользователей не имеет представления о методах
защиты от компьютерных вирусов - в частности, приходящих по электронной почте.
Можно сколько угодно предупреждать пользователей о недопустимости тех или иных
действий, но рано или поздно кто-нибудь откроет ворота перед очередным
троянским конем - или последний сам пролезет через дырку в ограде любимого
всеми секретаршами Outlook Express'а.
Противодействие очевидно: если бы вы могли сделать так, чтобы вредоносные
вложения не попали к пользователю, то угроза заражения посредством электронной
почты автоматически исчезла бы. А поскольку имя приаттаченного к письму файла
определяется (в кодировке MIME) из заголовка следующего вида:
Content-Type: application/octet-stream;
name="whatever.exe"
то в sendmail.cf вы добавляете следующие строки:
HContent-Type: $>CheckContentType
SCheckContentType
R$*name="$*.exe"$* $#error $: Bad attachment detected!
И... е работает. И не должно работать: ведь инструкция sendmail'а 'H'
проверяет только заголовок (header) письма, а в него входит только первый
Content-Type со значением 'multipart/mixed'. аш же Content-Type находится
глубоко в теле письма.
Как быть? Оказывается, выход совсем рядом, надо только его заметить.
sendmail, начиная с версии 8.10, содержит библиотеку libmilter (Mail fILTER) -
мощное средство написания собственных внешних фильтров проходящей почты. Причем
фильтр может находиться как на локальном, так и на удаленном хосте, что
особенно удобно для сетей с несколькими MX. И нам даже не придется изобретать
велосипед: за нас это сделал парень по фамилии Смит. Его vbsfilter
(http://aeschi.ch.eu.org/milter/) переименовывает MIME- и UU-encoded файлы с
потенциально опасными расширениями (.exe, .vbs, .bat и другие, всего около
сорока) в .txt. То есть в худшем случае наш пользователь откроет аттач в
классическом блокноте. vbsfilter включен в дерево портов FreeBSD.
2. Заложим фундамент
~~~~~~~~~~~~~~~~~~~~
Хотя сам vbsfilter - это всего девять килобайт на Си, нам придется
основательно подготовиться к его установке. Дело в том, что по умолчанию
sendmail компилируется без поддержки libmilter.
Следовательно, начнем с резервного копирования содержимого каталога
/etc/mail. После чего вытянем свежую версию sendmail. а момент написания
данного документа таковой является версия 8.12.2 (а vbsfilter - версия 1.8).
Если ваш sendmail версии не ниже 8.11, то можно обойтись и содержимым папки
/usr/src/contrib/sendmail. Все дальнейшие пути в этом разделе будут указаны от
каталога, в который вы распаковали исходные тексты sendmail.
Теперь внимательно читаем файлы README, INSTALL, libmilter/README и, если
вы раньше не собирали sendmail, то обратите особое внимание на то, что для
этого процесса не используется привычная последовательность команд - configure,
make, make install. Прочитав и уяснив суть, компилируйте по приведенному в
файле INSTALL алгоритму сначала libmilter, а потом сам sendmail и утилиты.
Перед сборкой конфига из файла .mc добавьте в последний такую строку:
INPUT_MAIL_FILTER(`vbsfilter', `S=unix:/var/run/vbsfilter, F=R')
Завершив процесс установки новой версии sendmail, следует внимательно
отредактировать /etc/mail/sendmail.cf, сверяясь в процессе с резервной копией.
Если у вас возникнет желание проверить работу sendmail на этом этапе (без
фильтра), то в файле /etc/sendmail.cf в строке, задающую адрес сокета, следует
закомментировать окончание (', F=R'). Поскольку вы, надеюсь, внимательно
прочитали документацию на libmilter, то уже знаете, что синтаксис 'F=R'
заставляет sendmail при недоступности фильтра отклонять всю поступающую почту;
более того, в таком случае sendmail откажется запускаться в режиме демона.
3. Доводим до ума vbsfilter
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Вот мы и на финишной прямой. Если, конечно, нас устраивает предлагаемое
мистером Смитом преобразование всех расширений подряд в .txt. Поскольку
наверняка найдутся недовольные: если деловой партнер перешлет необходимые для
работы файлы, то далеко не каждый сотрудник вашей организации сможет отличить
по содержанию com от msi, а exe от dll или scr. Поэтому я предлагаю внести в
исходный текст vbsfilter минимальные исправления, в результате которых первая
буква расширения будет заменяться фильтром на подчерк (символ 5Fh), а остальные
останутся без изменений.
Вот тут придется вспомнить, что vbsfilter написан под solaris, и, чтобы
собрать его под FreeBSD, требуется наложить приведенный в портах патч. И,
поскольку классический админ достаточно ленивый, чтобы ручками патчить исходник
или набирать параметры командной строки компилятора (особенно при отсутствии
элементарной мыши), то мы займемся небольшим мошенничеством.
Перейдя в /usr/ports/mail/vbsfilter, изменяем в Makefile в строке
параметров компилятора имя файла с исходным текстом фильтра с vbsfilter_1.8.c
на vbsfilter_1.8.new.c. Больше ничего не трогаем.
Запускаем make. Программа вытягивает исходные тексты фильтра, накладывает
патчи и: Останавливается, поскольку никакого файла vbsfilter_1.8.new.c у нас
нет. Зато в files/work лежит уже пропатченный vbsfilter_1.8.c. Копируем его в
vbsfilter_1.8.new.c и редактируем последний.
В теле процедуры detect_header есть следуюшие строки:
*(r-3) = ext2[0];
*(r-2) = ext2[1];
*(r-1) = ext2[2];
rc++;
и, чуть ниже,
*(r-2) = ext2[0];
*(r-1) = ext2[1];
rc++;
Указываем необходимость замены первого символа на подчерк и закомментариваем
(или удаляем) "лишние" инструкции.
*(r-3) = 95; /* ext2[0];
*(r-2) = ext2[1];
*(r-1) = ext2[2];*/
rc++;
и, соответственно,
*(r-2) = 95; /* ext2[0];
*(r-1) = ext2[1];*/
rc++;
После чего возвращаемся в ../.. и повторно запускаем make, затем make
install.
Для запуска фильтра служит шелл-скрипт /usr/local/etc/rc.d/vbsfilter.sh. Он
автоматически выполняется в процессе загрузки, но вызывается после запуска
sendmail. Соответственно последний при запуске сообщает об ошибке, т.к. сокет,
на котором должен отвечать vbsfilter, еще не создан. Более верно было бы
запускать фильтр до запуска sendmail, но для этого придется, например, добавить
вызов скрипта в соответствующее место /etc/rc - файла, в который лучше не
лазить грязными руками.
Теперь можно раскомментарить в /etc/mail/sendmail.cf ранее закомментаренное
указание отклонять соединения при отсутствии фильтра и заняться окончательной
проверкой работы связки sendmail-vbsfilter. апример, послав самому себе письмо
с файлом autoexec.bat, вы должны получить письмо с файлом autoexec._at...
Д. Фадеенко, 2002.
ps: версия sendmail 8.12.2 таки указана на момент написания HOWTO, это я все не
мог решить, стереть этот текст или запустить его в сеть. :)))
S.Y. Dmytro e-mail:[email protected] ICQ: 12509269