123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 |
- =encoding utf8
-
- =head1 Фильтрация спама при помощи системы rspamd.
-
- =head2 1. История и предпосылки создания.
-
- Мы долгое время использовали для фильтрации спама spamassassin, однако, при
- наших объемах почтового трафика (9-10 миллионов писем в сутки) spamassassin
- не обеспечивал достаточной производительности. После анализа исходного кода и
- принципов работы было выявлены следующие "врожденные" проблемы SA:
-
- =over
-
- =item *
- обработка письма осуществляется набором регулярных выражений, однако,
- количество этих выражений слишком велико и является ключевым моментом
- задумчивости SA (например, для извлечения received заголовков письма, SA
- проверяет оные на соответствие всем ему известным MTA, очевидно, что такое
- действие не является оптимальным);
-
- =item *
- нет возможности явно получить ip адрес, с которого нам отправили письмо (в SA
- это делается парсом received заголовков, что я лично не считаю правильным, а тем
- более оптимальным способом, так как MTA всегда знает, откуда ему пришло данное
- письмо)
-
- =item *
- нет возможности передачи спам фильтру данных SMTP диалога
-
- =item *
- MIME парсинг писем очень медленный, так как опять же сделан на базе регулярных
- выражений
-
- =back
-
- В итоге можно сказать, что основная проблема SA - это излишняя увлеченность
- авторов регулярными выражениями и отсутствие оптимизации. В итоге, в качестве
- базовых принципов создания rspamd были принципы оптимизации времени обработки
- писем, в числе которых:
-
- =over
-
- =item *
- полностью асинхронная работа с сетью (на базе libevent), в том числе DNS запросы
- и работа с http
-
- =item *
- быстрые механизмы выделения памяти
-
- =item *
- компиляция всех регулярных выражений и вызов только тех из них, которые наиболее
- возможны (то есть, имеется механизм ведения статистики срабатывания различных
- правил, и при обработке следующего письма учитывается обработка предыдущих, что
- позволяет максимально быстро провести основные тесты)
-
- =item *
- расширяемая архитектура: возможность написания плагинов на си, lua, возможность
- добавления новых типов фильтров, расширений протокола rspamc, возможность
- добавления новых типов статистических алгоритмов, алгоритмов нормализации и
- парсинга текстов
-
- =item *
- возможность динамической загрузки различных настроек, списков ip адресов и
- прочей информации через HTTP протокол с поддержкой даты модификации таких
- списков
-
- =item *
- использование везде, где возможно, специализированных конечных автоматов для
- разбора и анализа текстов
-
- =item *
- использование быстрого mime парсера gmime
-
- =back
-
- В результате перехода с SA на rspamd последний показал в среднем в 10 раз более
- быструю обработку сообщений. В данный момент rspamd имеет статус бета версии, но
- вполне пригоден для работы.
-
- =head2 2. Установка и настройка rspamd
-
- Для сборки rspamd вам потребуются:
-
- =over
-
- =item * libevent
- L<http://www.monkey.org/~provos/libevent/> - библиотека для асинхронной
- обработки событий
-
- =item * glib
- L<http://library.gnome.org/devel/glib/> - библиотека общего назначения,
- содержащая многие вещи, о которых разработчики libc, увы, забыли (glib не
- является графической библиотекой, хотя и используется, например, gtk)
-
- =item * gmime
- L<http://spruce.sourceforge.net/gmime/> - MIME парсер на базе библиотеки glib
-
- =item * lua
- L<http://www.lua.org/> - встраиваемый скриптовый язык (в принципе, наличие lua
- необязательно, но без lua многий функционал rspamd останется нереализованным)
-
- =item * perl
- L<http://www.perl.org/> - на перле написан, например, консольный клиент rspamc,
- распознаватель редиректов в URL'ях, поэтому наличие перла в системе крайне
- желательно
-
- =item * cmake
- L<http://www.cmake.org/> - система сборки, которая позволяет rspamd собираться
- (по крайней мере, в теории) на всех Posix совместимых системах. Использовать
- стандартные в данной ситуации autotools я не стал, так как считаю их самой
- неудобной в использовании системой сборки исходников, которую можно только
- придумать.
-
- =item * mercurial
- L<http://mercurial.selenic.com/> - система управления версиями (SCM),
- используемая для разработки rspamd. Так как в настоящее время rspamd находится в
- состоянии бета-версии, то релизы выходят нечасто и зачастую являются менее
- стабильными, чем текущая версия в репозитории, поэтому для установки rspamd
- лучше использовать версию непосредственно из репозитория.
-
- =back
-
- После установки всех требуемых программ и библиотек можно приступить
- непосредственно к установке rspamd.
-
- =over
-
- =item 1
- скачиваем текущее состояние репозитория: $ hg clone http://rspamd.hg.sourceforge.net:8000/hgroot/rspamd/rspamd
-
- =item 2
- конфигурируем rspamd: $ cd rspamd && cmake .
- (при необходимости изменить параметры можно вначале воспользоваться командой
- ccmake .)
-
- =item 3
- собираем: $ make
-
- =item 4
- устанавливаем: # make install
-
- =back
-
- =head3 Конфигурирование
-
- В процессе установки ставятся конфигурационные файлы по умолчанию в каталог
- {PREFIX}/etc. При этом, в каталог etc/rspamd устанавливаются правила по
- умолчанию (headers, html, drugs, loto и.т.п.), а в каталог
- etc/rspamd.conf.sample устанавливается конфигурационный файл по умолчанию. Его
- можно скопировать в файл etc/rspamd.conf и отредактировать в соответствии с
- собственными предпочтениями. Конфигурационный файл по умолчанию снабжен
- комментариями к каждой директиве, а также подробно описан в документации к
- rspamd, находящейся в каталоге исходников doc/rspamd.pdf. В данном же
- руководстве подробно изложен принцип работы rspamd и настройки всех модулей
- системы. Для базовой работы достаточно исправить пути к файлам логов, пидфайлу,
- а также обратить внимание на разделы factors и classifiers. Остановлюсь на этом
- несколько подробнее.
-
- Все директивы rspamd имеют формат param = value; где символ ';' является
- признаком окончания директивы. Также файл разбит на секции, каждая секция имеет
- имя (например worker {}) и внутренние директвы внутри фигурных скобок. После
- каждой секции также обязателен символ ';'. Также каждый модуль имеет особый
- формат секции:
-
- =begin html
-
- <pre>
- .module 'name' {
- param = value;
- };
- </pre>
-
- =end html
-
- Все это может показаться сложным на первый взгляд, но это позволяет лучше
- структурировать файл и облегчает расширяемость rspamd. Для первоначальной
- настройки достаточно обратить внимание на раздел factors, который описывает веса
- различных правил, раздел metric, который описывает максимальный вес, чтобы
- письмо считалось спамом, а также на раздел classifiers. Раздел classifiers
- обеспечивает работу статистических алгоритмов. В rspamd в настоящее время
- реализован алгоритм winnow, который работает следующим образом:
-
- =over
-
- =item 1
- текст разбивается на слова, также выделяется окно в пять слов
-
- =item 2
- окно перемещается по словам, при этом выделяются словосочетания по определенному
- алгоритму и вычисляется их хеш
-
- =item 3
- каждый полученный таким образом хеш проверяется в файле статистики, в котором
- хранятся хеши и их веса, если хеш найден, то его вес добавляется к суммарному
- весу данного файла
-
- =item 4
- файл, набравший в сумме больше веса считается классом письма
-
- =back
-
- Основная идея такого подхода в определении по словосочетаниям, к какому классу
- принадлежит данное письмо. В SA для этой цели используется вероятностный
- алгоритм bayes, который достаточно похож на вышеописанный, но считает не веса, а
- вероятности. Эффективность каждого из алгоритмов примерно одинакова и зависит в
- основном от эффективности обучения. Однако, в отличие от SA, rspamd использует
- не отдельные слова, а словосочетания, что повышает его эффективность. В секции
- classifiers можно установить различные классы писем, а далее в секции factors
- указать их вес (задав, например, для заведомо безвредных писем - ham -
- отрицательный вес). Размер файлов статистики должен быть разумно большим для
- хранения как можно большего числа хешей. Однако, необходимо учитывать, что эти
- файлы целиком загружаются в память (хотя, реализация отображения файла в памяти
- в различных ОС допускает загрузку и выгрузку страниц этого файла в своп системы,
- но эффективность этого довольно низка), поэтому необходимо соизмерять размер
- оперативной памяти и файлов статистики.
-
- =head2 4. Подключение и проверка работоспособности rspamd
-
- Для проверки работы системы rspamd проще всего воспользоваться командой rspamc:
-
- =begin html
-
- <pre>
- hostname:~> rspamc stat
- Do rspamc command stat
- Messages scanned: 1234040
- Messages learned: 59151
- Connections count: 1176623
- Control connections count: 59152
- Pools allocated: 2530714
- Pools freed: 2530699
- Bytes allocated: 66991793394
- Memory chunks allocated: 6453232
- Shared chunks allocated: 3
- Chunks freed: 6453090
- Oversized chunks: 468849
- Statfile: WINNOW_HAM (version 69); length: 100.0 MB; free blocks: 4563488; total blocks: 6553581; free: 69.63%
- Statfile: WINNOW_SPAM (version 36383); length: 100.0 MB; free blocks: 760504; total blocks: 6553581; free: 11.60%
- </pre>
-
- =end html
-
- В данном случае выводится общая статистика. Такого же эффекта можно достигнуть
- командой telnet на порт процесса controller (он описан в конфигурационном файле
- в секции worker, type у которого controller). По умолчанию это порт 11334 на
- адресе 127.0.0.1. Работу правил и статистики можно также проверить по команде
- rspamc:
-
- =begin html
-
- <pre>
- ~> rspamc symbols /tmp/mailman.eml
- Processing /tmp/mailman.eml
- Process file: /tmp/mailman.eml
- Sending 4950 bytes...
- RSPAMD/1.1 0 OK
- Metric: default; False; -3.35 / 10.00 / 0.00
- Symbol: WINNOW_HAM; 5.00
- Symbol: RECEIVED_RBL; pbl.spamhaus.org,insecure-bl.rambler.ru
- Urls:
- </pre>
-
- =end html
-
- В данном случае показываются баллы, набранные письмом, а также дополнительная
- информация. Подробнее о протоколе rspamc в документации (doc/rspamd.pdf). Для
- подключения rspamd к MTA лучше всего использовать milter, если ваш MTA postfix
- или sendmail. В качестве milter'а можно использовать, например, rmilter:
- L<https://www.milter.org/milter/71/>. О настройке postfix + rmilter мной была
- написана следующая заметка: L<http://cebka.pp.ru/blog/2009/02/-nginxpostfixrmilter.html>
- Для MTA exim можно воспользоваться файлом local_scan.c в каталоге contrib/exim.
- Инструкции по его установке описаны в самом файле, однако, это требует
- пересборки MTA. Также rspamd "понимает" протокол SA, поэтому для подключения
- rspamd можно использовать те же средства, что и для подключения к MTA SA.
-
- Подробнее о командах rspamc и протоколе rspamc написано опять же в документации.
-
- =head2 5. Обучение rspamd
-
- Процесс обучения важен для корректной работы статистики. Для обучения
- используется команда rspamc learn. Для указания файла (класса) письма
- используется ключ -s. Пример использования:
-
- =begin html
-
- <pre>
- ~> rspamc -s WINNOW_HAM learn /tmp/mailman.eml
- Processing /tmp/mailman.eml
- Process file: /tmp/mailman.eml
- Do rspamc command learn
- Sending 4950 bytes...
- Learn succeed. Sum weight: 128.48
- </pre>
-
- =end html
-
- В качестве параметров можно указывать несколько файлов, целые каталоги, а также
- imap папки:
-
- =begin html
-
- <pre>
- ~> rspamc -s WINNOW_SPAM learn imaps:user:cebka:password::host:somehost.rambler.ru:mbox:abuse.spam
- Processing imaps:user:cebka:password::host:mailsupport.rambler.ru:mbox:abuse.spam
- Enter IMAP password:
- Process imap: host: somehost.rambler.ru, mbox: abuse.spam
- Do rspamc command learn
- Sending 382650 bytes...
- Learn succeed. Sum weight: 1850.24
- <skipped>
- </pre>
-
- =end html
-
- При обучении необходимо учитывать, чтобы количество spam и ham писем было
- примерно равным. Вес показывает суммарный вес словосочетаний текста, который был
- до обучения данным письмом (то есть, то, насколько велика вероятность
- принадлежности данного письма к этому классу). При обнаружении неверных
- срабатываний статистики можно несколько раз применить learn к заданному письму,
- проверяя его суммарный вес.
-
- =head2 6. Поддержка и дальнейшие действия
-
- Если вы решили использовать rspamd для обработки вашей почты, то лучшим
- источником информации будет являться документация к rspamd, а также примеры lua
- плагинов: etc/plugins/lua. Целью же данной статьи является ознакомление с
- основными приемами по установке, конфигурированию и обучению rspamd, а также
- описание преимуществ rspamd по сравнению с SA. Если на любом этапе работы с
- rspamd у вас возникает проблема, то можно о ней сообщить мне:
- B<vsevolod@highsecure.ru> или же в список рассылки rspamd на sourceforge
- (англоговорящий): B<rspamd-devel@lists.sourceforge.net>. Сама система
- rspamd находится в состоянии бета-версии, поэтому ваша помощь в тестировании и
- запросы функциональности будут неоценимы в развитии rspamd.
|