суббота, 27 февраля 2010 г.

Обучаем SpamAssassin

Как и обещал в этом посте, рассказываю как научить SpamAssasssin уму-разуму.
Начнем с того, что для меня, как системного администратора, хранение пользователями почты на локальных машинах (= использование POP3) является безусловным злом, поскольку приучить абсолютное большинство пользователей к самостоятельному выполнению резервного копирования почты невозможно. По этому для блага пользователей и собственного душевного спокойствия почту будем хранить на IMAP сервере, в нашем случае конкретная реализация роли не играет, главное, чтобы почта на сервере хранилась в формате maildir. В качестве ОС, как обычно, используем Gentoo.
Итак, приступим



Белые/черные списки
Самый простой способ обеспечить безусловный прием или блокирование сообщений от конкретного адресата, это добавление его в белый или черный список соответственно. Списки можно вести в двух местах, либо в файле глобальных настроек /etc/mail/spamassassin/local.cf, либо в файле настроек для конкретного пользователя, от чьего имени запускается spamassassin /home/user/.spamassassin/user_prefs:
whitelist_from user1@example.com
blacklist_from user2@example.com
Так же можно включить в список не конкретного пользователя, а весть домен:
whitelist_from *@example.com
blacklist_from *@example.net
Весьма эффективно можно использовать черные списки по получателю, для этого создаем почтовый ящик user@example.com и активно засвечиваем его где только можно, чтобы он точно попал в базы рассылки спамеров, далее добавляем в настройках запись:
blacklist_to user@example.com
 В этом случае все сообщения, в которых хотя бы одним из получателей будет адрес user@example.com будут идентифицированы как спам.
Аналогично, для безусловной доставки сообщений, используется ключ whitelist_to user@example.com. Хотя, на мой взгляд, его использование сводит на нет все наши усилия.
То же самое относится и к использованию автоматических белых списков, но вдруг кому все же пригодится... Чтобы включить использование автоматических белых списков, необходимо добавить в local.cf следующие строки:
use_auto_whitelist 1 #включить авто. белые списки
auto_whitelist_path        /etc/mail/spamassassin/auto-whitelist #путь к файлу списка
auto_whitelist_file_mode   0666 #права на файл списка
 Обучение
Чтобы иметь возможность обучать spamassassin, при его установке необходимо включить USE-флаг tools
USE="tools" emerge spamassassin
Создаем в почтовых ящиках пользователей папки spam и ham. Тут нам потребуется много терпения и неслабый дар убеждения, поскольку без помощи пользователей не обойтись - договариваемся с пользователями о том, что все сообщения являющиеся спамом, но пропущенные спам-фильтром должны перемещаться из папки "Входящие" в папку "spam", а в папку "ham" копировались нормальные сообщения, хотя бы иногда. Поскольку если обучать spamassassin только спам-сообщениями, высока вероятность того, что он начнет резать и нормальную почту.
Для обучения служит команда sa-learn:
sa-learn --spam -u user /home/user/spam/ #обучаем спам-сообщениями
sa-learn --ham -u user /home/user/ham/ #обучаем нормальными сообщениями
Поскольку в ручную это делать глупо, автоматизируем - teacher.sh:
#! /bin/bash

#Ищем сообщения в папках spam и ham
#всех ящиков всех доменов и переносим их в отдельные папки
find /var/spool/mail/*/*/.spam/cur/* -exec mv {} /home/user/spam/ \;
find /var/spool/mail/*/*/.ham/cur/* -exec mv {} /home/user/ham/ \;
chown -R user:group /home/user/spam/
chown -R user:group /home/user/ham/
#Определяем кол-во spam-сообщений
cs=`ls /home/user/spam/|wc -l`
#Определяем кол-во ham-сообщений
ch=`ls /home/user/ham/|wc -l`
echo "Found" $cs "new spam-messages and" $ch "ham-messages"
#Если есть spam/ham сообщения то учим,
#если нет - сообщаем и выходим
if [ $cs = 0 ]
then
echo 'No new spam messages. Nothing to do'
else
echo 'Start to teach SpamAssassin with spam messages...'
sa-learn --spam -u user /home/user/spam/ && rm /home/user/spam/* && echo 'Done.'
fi
if [ $ch = 0 ]
then
echo 'No new ham messages. Nothing to do'
else
echo 'Start to teach SpamAssassin with ham messages...'
sa-learn --ham -u user /home/user/ham/ && rm /home/user/ham/* && echo 'Done.'
fi
 Далее добавляем запись teacher.sh в /etc/crontab, либо просто копируем его в  /etc/cron.hourly
Выше описанных действий мне оказалось достаточно, чтобы количество spam-сообщений попадающих в ящики пользователей сократилось в среднем до 1-2х в неделю, естественно не сразу, а в течении пары месяцев. Поскольку подобное положение дел всех устраивает, дальнейшей оптимизацией я заниматься не стал. Кому этого окажется недостаточно, читаем руководство по spamassassin и крутим настройки, например score SPAMMY_XMAILER, score BAYES_99 и т.д.

Комментариев нет:

Отправить комментарий