镜像来自
https://github.com/rspamd/rspamd.git
synced 2024-07-31 08:18:22 +02:00
334 line
19 KiB
Plaintext
334 line
19 KiB
Plaintext
![]() |
=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.
|