You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

why-rspamd.pod 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. =encoding utf8
  2. =head1 Фильтрация спама при помощи системы rspamd.
  3. =head2 1. История и предпосылки создания.
  4. Мы долгое время использовали для фильтрации спама spamassassin, однако, при
  5. наших объемах почтового трафика (9-10 миллионов писем в сутки) spamassassin
  6. не обеспечивал достаточной производительности. После анализа исходного кода и
  7. принципов работы было выявлены следующие "врожденные" проблемы SA:
  8. =over
  9. =item *
  10. обработка письма осуществляется набором регулярных выражений, однако,
  11. количество этих выражений слишком велико и является ключевым моментом
  12. задумчивости SA (например, для извлечения received заголовков письма, SA
  13. проверяет оные на соответствие всем ему известным MTA, очевидно, что такое
  14. действие не является оптимальным);
  15. =item *
  16. нет возможности явно получить ip адрес, с которого нам отправили письмо (в SA
  17. это делается парсом received заголовков, что я лично не считаю правильным, а тем
  18. более оптимальным способом, так как MTA всегда знает, откуда ему пришло данное
  19. письмо)
  20. =item *
  21. нет возможности передачи спам фильтру данных SMTP диалога
  22. =item *
  23. MIME парсинг писем очень медленный, так как опять же сделан на базе регулярных
  24. выражений
  25. =back
  26. В итоге можно сказать, что основная проблема SA - это излишняя увлеченность
  27. авторов регулярными выражениями и отсутствие оптимизации. В итоге, в качестве
  28. базовых принципов создания rspamd были принципы оптимизации времени обработки
  29. писем, в числе которых:
  30. =over
  31. =item *
  32. полностью асинхронная работа с сетью (на базе libevent), в том числе DNS запросы
  33. и работа с http
  34. =item *
  35. быстрые механизмы выделения памяти
  36. =item *
  37. компиляция всех регулярных выражений и вызов только тех из них, которые наиболее
  38. возможны (то есть, имеется механизм ведения статистики срабатывания различных
  39. правил, и при обработке следующего письма учитывается обработка предыдущих, что
  40. позволяет максимально быстро провести основные тесты)
  41. =item *
  42. расширяемая архитектура: возможность написания плагинов на си, lua, возможность
  43. добавления новых типов фильтров, расширений протокола rspamc, возможность
  44. добавления новых типов статистических алгоритмов, алгоритмов нормализации и
  45. парсинга текстов
  46. =item *
  47. возможность динамической загрузки различных настроек, списков ip адресов и
  48. прочей информации через HTTP протокол с поддержкой даты модификации таких
  49. списков
  50. =item *
  51. использование везде, где возможно, специализированных конечных автоматов для
  52. разбора и анализа текстов
  53. =item *
  54. использование быстрого mime парсера gmime
  55. =back
  56. В результате перехода с SA на rspamd последний показал в среднем в 10 раз более
  57. быструю обработку сообщений. В данный момент rspamd имеет статус бета версии, но
  58. вполне пригоден для работы.
  59. =head2 2. Установка и настройка rspamd
  60. Для сборки rspamd вам потребуются:
  61. =over
  62. =item * libevent
  63. L<http://www.monkey.org/~provos/libevent/> - библиотека для асинхронной
  64. обработки событий
  65. =item * glib
  66. L<http://library.gnome.org/devel/glib/> - библиотека общего назначения,
  67. содержащая многие вещи, о которых разработчики libc, увы, забыли (glib не
  68. является графической библиотекой, хотя и используется, например, gtk)
  69. =item * gmime
  70. L<http://spruce.sourceforge.net/gmime/> - MIME парсер на базе библиотеки glib
  71. =item * lua
  72. L<http://www.lua.org/> - встраиваемый скриптовый язык (в принципе, наличие lua
  73. необязательно, но без lua многий функционал rspamd останется нереализованным)
  74. =item * perl
  75. L<http://www.perl.org/> - на перле написан, например, консольный клиент rspamc,
  76. распознаватель редиректов в URL'ях, поэтому наличие перла в системе крайне
  77. желательно
  78. =item * cmake
  79. L<http://www.cmake.org/> - система сборки, которая позволяет rspamd собираться
  80. (по крайней мере, в теории) на всех Posix совместимых системах. Использовать
  81. стандартные в данной ситуации autotools я не стал, так как считаю их самой
  82. неудобной в использовании системой сборки исходников, которую можно только
  83. придумать.
  84. =item * mercurial
  85. L<http://mercurial.selenic.com/> - система управления версиями (SCM),
  86. используемая для разработки rspamd. Так как в настоящее время rspamd находится в
  87. состоянии бета-версии, то релизы выходят нечасто и зачастую являются менее
  88. стабильными, чем текущая версия в репозитории, поэтому для установки rspamd
  89. лучше использовать версию непосредственно из репозитория.
  90. =back
  91. После установки всех требуемых программ и библиотек можно приступить
  92. непосредственно к установке rspamd.
  93. =over
  94. =item 1
  95. скачиваем текущее состояние репозитория: $ hg clone http://rspamd.hg.sourceforge.net:8000/hgroot/rspamd/rspamd
  96. =item 2
  97. конфигурируем rspamd: $ cd rspamd && cmake .
  98. (при необходимости изменить параметры можно вначале воспользоваться командой
  99. ccmake .)
  100. =item 3
  101. собираем: $ make
  102. =item 4
  103. устанавливаем: # make install
  104. =back
  105. =head3 Конфигурирование
  106. В процессе установки ставятся конфигурационные файлы по умолчанию в каталог
  107. {PREFIX}/etc. При этом, в каталог etc/rspamd устанавливаются правила по
  108. умолчанию (headers, html, drugs, loto и.т.п.), а в каталог
  109. etc/rspamd.conf.sample устанавливается конфигурационный файл по умолчанию. Его
  110. можно скопировать в файл etc/rspamd.conf и отредактировать в соответствии с
  111. собственными предпочтениями. Конфигурационный файл по умолчанию снабжен
  112. комментариями к каждой директиве, а также подробно описан в документации к
  113. rspamd, находящейся в каталоге исходников doc/rspamd.pdf. В данном же
  114. руководстве подробно изложен принцип работы rspamd и настройки всех модулей
  115. системы. Для базовой работы достаточно исправить пути к файлам логов, пидфайлу,
  116. а также обратить внимание на разделы factors и classifiers. Остановлюсь на этом
  117. несколько подробнее.
  118. Все директивы rspamd имеют формат param = value; где символ ';' является
  119. признаком окончания директивы. Также файл разбит на секции, каждая секция имеет
  120. имя (например worker {}) и внутренние директвы внутри фигурных скобок. После
  121. каждой секции также обязателен символ ';'. Также каждый модуль имеет особый
  122. формат секции:
  123. =begin html
  124. <pre>
  125. .module 'name' {
  126. param = value;
  127. };
  128. </pre>
  129. =end html
  130. Все это может показаться сложным на первый взгляд, но это позволяет лучше
  131. структурировать файл и облегчает расширяемость rspamd. Для первоначальной
  132. настройки достаточно обратить внимание на раздел factors, который описывает веса
  133. различных правил, раздел metric, который описывает максимальный вес, чтобы
  134. письмо считалось спамом, а также на раздел classifiers. Раздел classifiers
  135. обеспечивает работу статистических алгоритмов. В rspamd в настоящее время
  136. реализован алгоритм winnow, который работает следующим образом:
  137. =over
  138. =item 1
  139. текст разбивается на слова, также выделяется окно в пять слов
  140. =item 2
  141. окно перемещается по словам, при этом выделяются словосочетания по определенному
  142. алгоритму и вычисляется их хеш
  143. =item 3
  144. каждый полученный таким образом хеш проверяется в файле статистики, в котором
  145. хранятся хеши и их веса, если хеш найден, то его вес добавляется к суммарному
  146. весу данного файла
  147. =item 4
  148. файл, набравший в сумме больше веса считается классом письма
  149. =back
  150. Основная идея такого подхода в определении по словосочетаниям, к какому классу
  151. принадлежит данное письмо. В SA для этой цели используется вероятностный
  152. алгоритм bayes, который достаточно похож на вышеописанный, но считает не веса, а
  153. вероятности. Эффективность каждого из алгоритмов примерно одинакова и зависит в
  154. основном от эффективности обучения. Однако, в отличие от SA, rspamd использует
  155. не отдельные слова, а словосочетания, что повышает его эффективность. В секции
  156. classifiers можно установить различные классы писем, а далее в секции factors
  157. указать их вес (задав, например, для заведомо безвредных писем - ham -
  158. отрицательный вес). Размер файлов статистики должен быть разумно большим для
  159. хранения как можно большего числа хешей. Однако, необходимо учитывать, что эти
  160. файлы целиком загружаются в память (хотя, реализация отображения файла в памяти
  161. в различных ОС допускает загрузку и выгрузку страниц этого файла в своп системы,
  162. но эффективность этого довольно низка), поэтому необходимо соизмерять размер
  163. оперативной памяти и файлов статистики.
  164. =head2 4. Подключение и проверка работоспособности rspamd
  165. Для проверки работы системы rspamd проще всего воспользоваться командой rspamc:
  166. =begin html
  167. <pre>
  168. hostname:~> rspamc stat
  169. Do rspamc command stat
  170. Messages scanned: 1234040
  171. Messages learned: 59151
  172. Connections count: 1176623
  173. Control connections count: 59152
  174. Pools allocated: 2530714
  175. Pools freed: 2530699
  176. Bytes allocated: 66991793394
  177. Memory chunks allocated: 6453232
  178. Shared chunks allocated: 3
  179. Chunks freed: 6453090
  180. Oversized chunks: 468849
  181. Statfile: WINNOW_HAM (version 69); length: 100.0 MB; free blocks: 4563488; total blocks: 6553581; free: 69.63%
  182. Statfile: WINNOW_SPAM (version 36383); length: 100.0 MB; free blocks: 760504; total blocks: 6553581; free: 11.60%
  183. </pre>
  184. =end html
  185. В данном случае выводится общая статистика. Такого же эффекта можно достигнуть
  186. командой telnet на порт процесса controller (он описан в конфигурационном файле
  187. в секции worker, type у которого controller). По умолчанию это порт 11334 на
  188. адресе 127.0.0.1. Работу правил и статистики можно также проверить по команде
  189. rspamc:
  190. =begin html
  191. <pre>
  192. ~> rspamc symbols /tmp/mailman.eml
  193. Processing /tmp/mailman.eml
  194. Process file: /tmp/mailman.eml
  195. Sending 4950 bytes...
  196. RSPAMD/1.1 0 OK
  197. Metric: default; False; -3.35 / 10.00 / 0.00
  198. Symbol: WINNOW_HAM; 5.00
  199. Symbol: RECEIVED_RBL; pbl.spamhaus.org,insecure-bl.rambler.ru
  200. Urls:
  201. </pre>
  202. =end html
  203. В данном случае показываются баллы, набранные письмом, а также дополнительная
  204. информация. Подробнее о протоколе rspamc в документации (doc/rspamd.pdf). Для
  205. подключения rspamd к MTA лучше всего использовать milter, если ваш MTA postfix
  206. или sendmail. В качестве milter'а можно использовать, например, rmilter:
  207. L<https://www.milter.org/milter/71/>. О настройке postfix + rmilter мной была
  208. написана следующая заметка: L<http://cebka.pp.ru/blog/2009/02/-nginxpostfixrmilter.html>
  209. Для MTA exim можно воспользоваться файлом local_scan.c в каталоге contrib/exim.
  210. Инструкции по его установке описаны в самом файле, однако, это требует
  211. пересборки MTA. Также rspamd "понимает" протокол SA, поэтому для подключения
  212. rspamd можно использовать те же средства, что и для подключения к MTA SA.
  213. Подробнее о командах rspamc и протоколе rspamc написано опять же в документации.
  214. =head2 5. Обучение rspamd
  215. Процесс обучения важен для корректной работы статистики. Для обучения
  216. используется команда rspamc learn. Для указания файла (класса) письма
  217. используется ключ -s. Пример использования:
  218. =begin html
  219. <pre>
  220. ~> rspamc -s WINNOW_HAM learn /tmp/mailman.eml
  221. Processing /tmp/mailman.eml
  222. Process file: /tmp/mailman.eml
  223. Do rspamc command learn
  224. Sending 4950 bytes...
  225. Learn succeed. Sum weight: 128.48
  226. </pre>
  227. =end html
  228. В качестве параметров можно указывать несколько файлов, целые каталоги, а также
  229. imap папки:
  230. =begin html
  231. <pre>
  232. ~> rspamc -s WINNOW_SPAM learn imaps:user:cebka:password::host:somehost.rambler.ru:mbox:abuse.spam
  233. Processing imaps:user:cebka:password::host:mailsupport.rambler.ru:mbox:abuse.spam
  234. Enter IMAP password:
  235. Process imap: host: somehost.rambler.ru, mbox: abuse.spam
  236. Do rspamc command learn
  237. Sending 382650 bytes...
  238. Learn succeed. Sum weight: 1850.24
  239. <skipped>
  240. </pre>
  241. =end html
  242. При обучении необходимо учитывать, чтобы количество spam и ham писем было
  243. примерно равным. Вес показывает суммарный вес словосочетаний текста, который был
  244. до обучения данным письмом (то есть, то, насколько велика вероятность
  245. принадлежности данного письма к этому классу). При обнаружении неверных
  246. срабатываний статистики можно несколько раз применить learn к заданному письму,
  247. проверяя его суммарный вес.
  248. =head2 6. Поддержка и дальнейшие действия
  249. Если вы решили использовать rspamd для обработки вашей почты, то лучшим
  250. источником информации будет являться документация к rspamd, а также примеры lua
  251. плагинов: etc/plugins/lua. Целью же данной статьи является ознакомление с
  252. основными приемами по установке, конфигурированию и обучению rspamd, а также
  253. описание преимуществ rspamd по сравнению с SA. Если на любом этапе работы с
  254. rspamd у вас возникает проблема, то можно о ней сообщить мне:
  255. B<vsevolod@highsecure.ru> или же в список рассылки rspamd на sourceforge
  256. (англоговорящий): B<rspamd-devel@lists.sourceforge.net>. Сама система
  257. rspamd находится в состоянии бета-версии, поэтому ваша помощь в тестировании и
  258. запросы функциональности будут неоценимы в развитии rspamd.