Борьба со спамом в 2020 (rpamd, SpamAssassin и нейросети)

Уже 15 лет (ужас какой!) использую для фильтрации спама SpamAssassin, и что-то стали возникать к нему притензии. С одной стороны, кажется, спама в интернете стало сильно меньше, чем в конце нулевых. По моим ощущениям, мне стало в месяц приходить ~300 писем вместо нескольких тысяч. (Возможно дело в том, что крупные почтовые сервисы его довольно успешно фильтруют, благодаря своим ресурсам, и “обычные пользователи” стали сильно менее доступны для спамеров.) С другой же стороны, стал замечать, что SA успешно отфильтровывает примерно половину спама (с достаточно консервативными настройками без false-positive). С третьей стороны не байесом же единым, за последние десять лет и нейросети выросли и какой-нибудь SVM кажется кто-то должен уже был внедрить (по крайней мере Саша Петров мне еще в своей дипломной работе его прикручивал и вроде как неплохие результаты получал, хотя до продакшн решения не доделал).

В общем решил я посмотреть на то, что у нас нового появилось в этой области: количество инструментов увеличилось, но всё это просто классификаторы (практически все на наивном байесе, хотя некоторые, вроде как заявляется, и более точные, чем тот, что внутри SpamAssassin), в отличие от SA, который еще с кучей эвристик, нацеленных именно на анализ почты (корректность заголовков, работа с RBL, скоринг для хостов, сетей и автономных систем, участвовавших в передаче письма, DMARC, DKIM, SPF и прочее).

Но на фоне всего этого болота заметил довольно развитый и живой проект rspamd. По сути примерно такой же комбайн, как SpamAssassin, только вместо перла C и lua, ну и комьюнити сильно меньше. Зато встроенный milter, вроде как более “правильный” байес, встроенная реализация dkim (можно выкинуть opendkim), встроенный грейлистинг (он вообще сейчас от спама помогает?) и даже есть экспериментальный нейросетевой классификатор.

В общем показалось, что штука довольно интересная, чтобы ее попробовать – поставил и показалось, что работает оно гораздо лучше, чем SpamAssassin.

Но, само-собой, недельные наблюдения за качеством фильтрации это совершенно не серьезно, нужен взвешенный анализ на большом количестве писем. Тут-то меня и ждало разочарование: у меня в ящике настроено автоудаление спама месячной давности, а поток спама, как я уже писал, в последнее время стал довольно слабый, так что для нормального эксперимента того, что у меня есть, явно не достаточно.

Ну раз так, то устроем side-by-side сравнение на живом трафике!

Дано:

  • Свежая чистая инсталляция почтового сервера: postfix + dovecot.
  • На postfix полностью отключены все аутлупы по rbl и фильтрации HELO, которые я использовал раньше.
  • rspamd 1.9.4 с чистой базой и дефолтными настройками. (add_header = 7)
  • SpamAssassin (через spamass-milter) с +/- дефолтными настройками (включил по максимуму разные модули, в том числе pyzor, razor и txrep) и тоже чистой базой. (required_score 7.0)
  • Немножко скриптов, которые отправляют на дообучение (в оба сервиса) те письма, которые были классифицированы неправильно (в тот момент, когда я перекладываю письмо в папку Junk или обратно).
  • Почтовый поток порядка нескольких тысяч писем в месяц, из которых две-три сотни – это спам.
  • Система “Спамографопостроитель 1.0”, которая рисует в реальном времени гистограммы оценок по всем полученным письмам.

Немного подробнее по гистограммам: они обновляются в реальном времени и рисуются в четырёх вариантах: общие оценки для rspamd и SA, оценки байесовского фильтра для rspamd и SA. Вертикальной чертой на каждом графике отображена граница спам/не спам, так что слева от нее мы видим не спам и фолс-негатив, а справа спам и фолс-позитив. Пока оценок мало + фильтры не натренированы графики должны быть довольно шумными, но, хочется надеяться, дальше ситуация исправится. Опять же по этим графикам можно будет прикинуть, насколько корректно выбрана граница для классификации.

Чуть позже добавлю генерацию численных метрик и гистограммы для нейросетевого классификатора rspamd, когда он обучится

А пока: давайте наблюдать!

PS. Дорогие спамеры, не могли бы насыпать мне побольше образцов спама на spam@gerasiov.net. Пожалуйста!

Удаление письма из хранилища dovecot

Отправил случайно в список рассылки письмо на много десятков мегабайт и оно разлетелось по всем разработчикам, что не есть хорошо, потому что у всех почта на нашем сервере и сразу полгига места ушло.
Решил удалить его прямо у пользователей из Maildir’ов. Вначале убедился, что ищутся правильные письма:
doveadm search -A FROM git@lvk.cs.msu.su LARGER 10M HEADER X-Git-Newrev 252417435200cca7d6ac33b8be24018100513527
Вроде, всё Ok, пытаюсь удалить:
doveadm -D expunge -A FROM git@lvk.cs.msu.su LARGER 10M HEADER X-Git-Newrev 252417435200cca7d6ac33b8be24018100513527
Получаю:

To avoid accidents, search query must contain MAILBOX in all search branches

Ну, в принципе, логично и правильно, от греха… Но у меня-то случай особый! =) Понятия не имею кто по каким папкам раскладывает коммит-логи, так что надо всё-таки удалять из всех, а не только из явно перечисленных. Пришлось в изысканиях дойти до исходников, где нашел, что можно указать не конкретную папку, а globe:
doveadm -D expunge -A mailbox '*' FROM git@lvk.cs.msu.su LARGER 10M HEADER X-Git-Newrev 252417435200cca7d6ac33b8be24018100513527
Вот так сработало.