Сбор мыслей в кучу по подключению Rspamd к Exim


После некоторого тестирования решил, что сил хватит поддерживать корпоративную почту на должном уровне полностью своими руками на Exim. Перевел MX на себя с роутингом ящиков на другие сервера, т.к. сейчас, кроме моего сервера, часть нашей почты обслуживает Яндекс, часть Вымпелком/Билайн/АДС.

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

Остановился на Rspamd в связи с:

  1. Вроде, не сильно грузит систему
  2. По описанию автора, писался под Rambler-почту
  3. Писал наш согражданин
  4. Поддерживается текущим Exim "из коробки"
  5. Обещает, что может, все что нужно.

У меня возникло ощущение, что документация на него предполагает, что вы дружитесь со своим почтовым сервером и спокойно можете прикрутить к нему SpamAssassin.

Т.к. это не совсем мой случай, то вылезли некоторые проблемы.

1. В подключении полностью подменяют секцию проверки тела сообщения:

acl_smtp_data = acl_check_spam

На мой взгляд, это не совсем корректно, правильнее добавить необходимые опции в свою текущую секцию, по умолчанию она acl_check_data.

2. Не мог понять, как инициировать проверку письма на спам

Оказалось, что это делает строка

warn spam = nobody:true

Был бы полезен комментарий перед ней, мол тут дергаем Rspamd, чтобы он проверил письмо и вернул/инициализировал используемые в дальнейшем переменные.

Дальше вроде, все понятно, только при копипасте нужно иметь в виду, что письма определенные как спам, начисто отвергаются сервером с сообщением об этом отправителю правилом:

# discard high-scoring mail
  deny  condition = ${if eq{$spam_action}{reject}}
        message = Message discarded as high-probability spam

На мой взгляд, для корпоратива это не совсем правильно, т.к. лучше, пусть все получат, а потом поместить в папку спам пользователя. Но это уже по вкусу.

Т.к. меня интересовало только определение спам/не спам, у себя я оставил так:

 warn    spam = nobody:true
           condition = ${if eq {$interface_port}{25} {yes}{no}}
           add_header = X-RSpamD-Action: $spam_action

Т.е. проверяем письмо на спам только если оно пришло на 25 порт и добавляем в шапку действие, которое определил Rspamd.

Это я в дальнейшем использую, для определения работает ли Rspamd и что именно он думал о письме.

3. Не очень ярко видно описание веб интерфейса.

По этому не мог придумать, где что настраивать и куда и как коннектиться.

в файле rspamd.conf правим секцию:

worker {
#    bind_socket = "localhost:11334";
    bind_socket = "*:11334";
    .include "$CONFDIR/worker-controller.inc"
}

После чего открываем server:11334 c паролем из файла worker-controller.inc. По умолчанию q1 и q2. Особой разницы в паролях не заметил.

Обучение байсового фильтра:

rspamc learn_ham file_or_dir
rspamc learn_spam file_or_dir

Остальной механизм работы фильтрации и обучениия был использован от SpamProbe.

Ну и красивая картиночка, что в результате получилось.

Web интерфейс Rspamd

Получилась такая статистика сравнения работы SpamProbe и Rspamd за сутки.

Определено как спам количество (за сутки) за 3-е суток месяц
SpamProbe and RSpamD 401 1438 13662 61,3%
only by RSpamD 86 547 1927 8,6%
only by SpamProbe 205 765 6663 29,9%
ALL 692 2750 22252 100%
Жалоб, что много почты стало попадать в папку Spam не появилось.
  На данный момент получается, что данная версия RSamD у меня ловит дополнительно около 9% от общей массы спама спама, т.е. на эти 9% увеличилась эфективность.
Но т.к. есть спам, который ловит только один спам фильтр на данный момент, необходимо использовать оба.

P.S. Как оказалось, у меня на FreeBSD 9.3-RELEASE-p2 встал только из пакеджей Rspamd daemon version 0.8.3. Из портов, с первой попытки, что-то не пошло.

P.P.S. Еще была возможность использовать Rspamd как smtp proxy, но ее сломали.