Займемся настройкой самообучающейся защиты от спама и включим автообучение SpamAssassin. Встроенный модуль Bayes научит SpamAssassin распознавать спам по вашей почте.
В этой статье описал настройку SpamAssassin и где настроили пересылку спама в отдельную папку. Фильтр заработал, но, скорее всего, он иногда ошибается. Пускает назойливую рекламу во «Входящие» или, что хуже, отправляет в «Спам» важное письмо.
Чтобы сделать SpamAssassin «умнее», нужно задействовать его встроенный модуль Bayes (Байесовская фильтрация). Он обучается на примерах, запоминает слова из «хороших» писем (Ham) и «плохих» (Spam).
Что такое Байесовская фильтрация и почему она «умная»?
Если просто, то это математическая система, которая обучается на примерах. Она не знает заранее, что слова «кредит» или «гарантия» — это спам. Вместо этого она:
- Анализирует тысячи слов в письмах, которые пользователи вручную пометили как спам (Spam) и не-спам (Ham).
- Вычисляет вероятность для каждого слова. Например, слово «договор» может часто встречаться и в спаме, и в рабочих письмах. А вот «бесплатно iPhone» — почти наверняка спам.
- Суммирует вероятности всех слов в новом письме и выносит вердикт: «скорее всего спам» или «скорее всего нормальное».
Итог: Чем больше его тренируем на своей почте, тем лучше он начинает понимать именно наш поток писем. Он узнает стиль наших рассылок, термины из нашей работы и особенности спама, который приходит именно нам.
Итак, теории достаточно. Начнём.
Включаем автообучение
В файле /etc/spamassassin/local.cf активируем следующие строки:
# Включаем Байесовскую фильтрацию
use_bayes 1
# Разрешаем обучение фильтра
bayes_auto_learn 1
# Указываем SpamAssassin где хранить базу данных Bayes
bayes_path /var/lib/spamassassin/.spamassassin/bayes
# Настройки прав, чтобы разные процессы могли читать/писать
bayes_file_mode 0666
Далее, надо связать и автоматизировать скрипты обучения с Dovecot (будем думать что именно он у нас MDA). Идея такая, когда пользователь будет перемещать письмо в СПАМ, Dovecot через модуль Sieve будет тригерить скрипты обучения SpamAssassin.
Установим необходимые компоненты для Dovecot-а:
apt install dovecot-sieve dovecot-managesieved
Создаём скрипты обучения.
Для этого нам нужно два скрипта: один для спама, другой для чистых писем. Сначала создаём папку: mkdir -p /etc/dovecot/sieve-pipe
Скрипт для СПАМА (/etc/dovecot/sieve-pipe/learn-spam.sieve):
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];
if anyof (environment :is "imap.cause" "COPY", environment :is "imap.cause" "APPEND") {
pipe :copy "sa-learn-pipe.sh" [ "--spam" ];
}
Скрипт для ХАМА (чистых писем) (/etc/dovecot/sieve-pipe/learn-ham.sieve):
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];
if anyof (environment :is "imap.cause" "COPY", environment :is "imap.cause" "APPEND") {
pipe :copy "sa-learn-pipe.sh" [ "--ham" ];
}
Далее, создаем Bash-обертку. Sieve не может напрямую вызвать sa-learn, ему нужен shell-скрипт. Создаём файл /etc/dovecot/sieve-pipe/sa-learn-pipe.sh:
#!/bin/bash
# Читаем письмо из стандартного ввода и обучаем
exec /usr/bin/sa-learn "$1" -u debian-spamd
И делаем его исполняемым:
chmod +x /etc/dovecot/sieve-pipe/sa-learn-pipe.sh
Настраиваем Dovecot
В файл /etc/dovecot/conf.d/90-sieve.conf добавим следующее:
plugin {
# Пути к скриптам
sieve_plugins = sieve_imapsieve sieve_extprograms
# Обучение при перемещении В папку Junk
imapsieve_mailbox1_name = Junk
imapsieve_mailbox1_causes = COPY APPEND
imapsieve_mailbox1_before = file:/etc/dovecot/sieve-pipe/learn-spam.sieve
# Обучение при перемещении ИЗ папки Junk
imapsieve_mailbox2_name = *
imapsieve_mailbox2_from = Junk
imapsieve_mailbox2_causes = COPY APPEND
imapsieve_mailbox2_before = file:/etc/dovecot/sieve-pipe/learn-ham.sieve
# Разрешаем запуск внешних скриптов
sieve_pipe_bin_dir = /etc/dovecot/sieve-pipe
}
Активируем плагины в Dovecot. В /etc/dovecot/conf.d/10-mail.conf или /etc/dovecot/conf.d/20-imap.conf:
protocol imap {
mail_plugins = $mail_plugins imap_sieve
}
Перезапустим Dovecot:
systemctl restart dovecot
И обязательно скомпилируем Sieve-скрипты (после перезапуска Dovecot!):
sievec /etc/dovecot/sieve-pipe/learn-spam.sieve
sievec /etc/dovecot/sieve-pipe/learn-ham.sieve
Далее, проведём ручное обучение на папках пользователей. Пути у каждого свои, разумеется меняем их по ситуации, но обязательно проверяем чтобы у пользователя debian-spamd (в Debian-совместимых дистрибутивах) был доступ к папкам пользователей как к входящим, так и к СПАМу. Можно добавить его в группу mail или vmail. Если всё норм, то запускаем ручное обучение:
sa-learn --spam /var/vmail/domain.ru/user/.Spam/cur
sa-learn --ham /var/vmail/domain.ru/user/cur
Первая команда — СПАМ, вторая для хороших писем (про пути не забываем – прописываем те что настроили в почте). Тут мы задаем начальное обучение на уже имеющихся письмах в папках пользователей. Единственное, будет плохо, если у кого-то в папке «Входящие» остался какой-то СПАМ.
Перезапускаем dovecot, spamassassin и spamass-milter и на этом всё.
Как понять, что Bayes заработал?
Воспользуемся командой:
sudo -u debian-spamd sa-learn --dump magic
В дампе будут строки содержащие nspam и nham. Цифры в них указывают на количество обработанных писем. Через какое-то время повторите эту команду и если цифры растут, значит все нормально, обучение SpamAssassin идёт штатно.
Мы перевели SpamAssassin из режима статичного сторожа в режим самообучающегося охранника. Он больше не слепо следует общим правилам, а понимает контекст нашей почты. Это главный шаг к тому, чтобы забыть о ручной сортировке спама.
И ещё терпение, SpamAssassin Bayes заработает обработав примерно 200 спам-писем.