Главная | Контакты



Главная > Программы > SpamAssassin

Прикручиваем spamassassin к транзитной почте

Принцип взаимодействия

Постоянно крутится демон spamd (перловая программка), ожидая соединения на определенном порту (по умолчанию - на интерфейсе lo, порт 783). Этот демон работает от имени непривилигированного пользователя. Еще, работает связующая програмка-демон spamass-milter держащая открытый сокет, по умолчанию, в /var/run/spamass.sock . Sendmail при получении каждого письма согласно своей конфигурации передает spamass-milterу текст этого письма, а он - демону spamd. Этот демон меняет заголовки, ( и, иногда, BODY письма). Для каждого письма демон проверяет определенные параметры, ключевые слова, элементы заголовка и т.д. За каждый элемент начисляются определенные очки (как положительные, так и отрицательные). Если сумма очков превосходит порог (по умолчанию, 5), сообщение считается спамом.

Установка

Нам понадобится последний дистрибутив spamassassin (брать отсюда),
spamassassin-milter (брать отсюда)

Разархивируем spamassassin в директорию, компилируем
perl Makefile.PL
make
make install

Нам понадобится (новый) пользователь, от имени которого будет работать spamd. У него желательно убрать шелл в /etc/passwd
Создаем конфигурационную директорию

mkdir /etc/mail/spamassassin
На директорию необходимо дать права на запись пользователю от имени которого будет работать демон spamd (, а у остальных - желательно отнять эти права), то есть
chown spamduser /etc/mail/spamassassin
chmod 755 /etc/mail/spamassassin
Создаем конфигурационный файл /etc/mail/spamassassin/local.cf
(полная документация - см. perldoc Mail::SpamAssassin::Conf)
Пример:

auto_learn 1
use_bayes 1
bayes_path /etc/mail/spamassassin/bayes
bayes_file_mode 0666
bayes_learn_to_journal 1
bayes_min_ham_num 1
bayes_min_spam_num 1
score SUBJ_FULL_OF_8BITS 0.00
score HTML_COMMENT_8BITS 0.01
score HEADER_8BITS 0.00
score TO_NO_USER 0.01
score FORGED_MUA_OUTLOOK 0.5
score X_AUTH_WARNING 0.01
score SUBJ_HAS_UNIQ_ID 9.99
score HTTP_USERNAME_USED 9.99
score FORGED_YAHOO_RCVD 9.99
score FORGED_JUNO_RCVD 16
score UNWANTED_LANGUAGE_BODY 1.02
score MLM 5.55
score RCVD_NUMERIC_HELO 4.95
ok_languages en ru
ok_locales en ru
subject_tag MESSAGE_MARKED_AS_SPAM
whitelist_to vt@bykoff.ru
whitelist_from root@localhost
whitelist_from root@localhost.localhost

auto_whitelist_path /etc/mail/spamassassin/auto-whitelist auto_whitelist_file_mode 0666 auto_learn_threshold_nonspam -2 auto_learn_threshold_spam 9
blacklist_from *@888.com blacklist_from *@msn.com blacklist_from *@cat.es blacklist_from *@pmail.gen.nz blacklist_from *@femenino.com blacklist_from *@infonium.com blacklist_from *@outblaze.com
Примечание -
bayes_path /etc/mail/spamassassin/bayes указывает что демон создаст три файла базы данных Bayesian фильтра для хранения создаваемых образчиков писем:
/etc/mail/spamassassin/bayes_seen
/etc/mail/spamassassin/bayes_journal
/etc/mail/spamassassin/bayes_toks

Параметры
bayes_min_ham_num 1
bayes_min_spam_num 1
указывают, сколько чистых писем и писем со спамом должно накопится в Bayesian базе прежде чем демон будет пользоваться этой базой (по умолчания - 200 чистых и спама)

Посмотреть базу можно командой sa-learn -dump

auto_whitelist_path /etc/mail/spamassassin/auto-whitelist - Если Вы запустили демон с опцией -a то есть автообучения адресов, указывает, что демон создаст два файла базы данных адресов

/etc/mail/spamassassin/auto-whitelist.dir
/etc/mail/spamassassin/auto-whitelist.pag

auto whitelisting вычисляет средний уровень оценки для каждого отправителя и прибавляет его к оценке очередного письма. Это позволяет не блокировать "благонадежных" отправителей если оценка отдельного письма вдруг превысит предел. Кстати, посмотреть базу адресов можно из директории с распакованным дистрибутивом командой ./tools/check_whitelist /etc/mail/spamassassin/auto-whitelist

Создаем Bayes-базу

sa-learn --rebuild
Затем следует убедится, что владелец файлов в директории /etc/mail/spamassassin/ - это наш новый пользователь.

Запускаем демон

perl /usr/local/bin/spamd -d -a -u spamduser
в почтовом логфайле должны появится соответствующие строки о запуске демона

Проверка демона:

spamassassin -D --lint
необходимо внимательно изучить вывод этой команды. Если в Perl не установлен модуль DB_File, то мы не сможем пользоваться обучением фильтра, так что этот модуль стоит доставить.
Если мы захотим пользоваться lookup-ом в централизованых спам-базах, нам так же понадобится модуль Net::DNS, качать отсюда

Запускаем связующий сервис spamass-milter

Распаковываем, и компилируем и устанавливаем spamass-milter, затем, запускаем его
spamass-milter -p /var/run/spamass.sock -f
В почтовом логе должна появится соответствующая строка

Обучение фильтра

Образцы спама и благонадежных писем могут попадать в Bayesian базу двумя способами:
  • автоматически, с помощью Autolearn - когда очки письма (без учета очков за AWL, BAYES_XX, BLACKLIST и WHITELIST) выходят за пределы между auto_learn_threshold_nonspam и auto_learn_threshold_spam. Это можно узнать если в заголовке письма в поле X-Spam-Status: присутствует запись autolearn=spam или autolearn=ham.
  • вручную (или при помощи скрипта) командой sa-learn Для этого необходимо скормить письмо или целый ящик писем с помощью команы sa-learn:
    cat spam_letter | sa-learn -spam 
    /usr/local/bin/sa-learn  --spam --mbox /var/spool/mail/spam
    
    для спама, или
    cat good_letter | sa-learn -ham 
    /usr/local/bin/sa-learn  --ham --mbox /var/spool/mail/good
    
    для благонадежных писем.
    Примечание: если у Вас есть ящики пользователей, которые ушли из организации, в которые теперь падает лишь спам, очень удобно, например, по расписанию, скармливать их содержание в Bayesian базу

Sendmail должен быть скомпилирован с поддержкой MILTER

Проверяем командой
echo a|sendmail -d  | grep MILTER

Если это не так, необходимо его перекомпилировать, добавив в файл соответствующий Вашей ОС (например, devtools/OS/Linux) строчку

APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')

Конфигурация sendmail:

Добавляем .mc файл
INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass.sock, F=, T=C:15m;S:4m;R:4m;E:10m')dnl
define(`confMILTER_MACROS_CONNECT',`b, j, _, {daemon_name}, {if_name},{if_addr}')dnl
Sendmail откажется запуститься, если у all есть права записи на директорию, в которой находится сокет spamass-milter_а, то есть, на всякий случай
chmod a-w /var
chmod a-w /var/run

Что дальше?

Сам по себе spamassassin меняет текст писем, которые он считает спамом, на предупреждение и прикладывает оригинальное письмо в виде аттачмента. Пользователь волен воспользоваться фильтром в своем почтовом клиенте, например, чтобы автоматически переложить подозрительные письма в отдельную папку для дальнейшего изучения.
Если мы хотим отфутболить эти письма, необходимо установить параметр spamass-milter -r NN при котором будет происходить отлуп


Пример .mc файла:
VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $')
OSTYPE(linux)dnl
INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass.sock, F=, T=C:15m;S:4m;R:4m;E:10m')dnl
define(`confMILTER_MACROS_CONNECT',`b, j, _, {daemon_name}, {if_name}, {if_addr}')dnl
.
.
MAILER(smtp)dnl 
.
.

Примечание: в третьей строке примера конфигурации
параметр S - задает сокет для соединения с spamass-milter
Параметр F - задает поведение sendmail когда ему не удается присоединится к сокету мильтера: отсутствие означает "игнорировать" (то есть сообщение обрабатывается sendmail-ом дальше), F=T - означает выдать ошибку 471 (временно недоступен) и обработка письма прекращается, F=R - отвергнуть письмо окончательно
Параметр T - разные таймауты..

Пример скрипта для автозапуска

/etc/rc.d/init.d/spamd
#!/bin/sh
#

RETVAL=0

case "$1" in
  start)
	echo  "Starting SPAMASSASSIN-MILTER connector: "
	/usr/local/sbin/spamass-milter -p /var/run/spamass.sock -f -r 5
	# опция -r 5 задает уровень спама в сообщении 
	# при превышении которого будет происходить отлуп
	echo -n $"Starting SPAMASSASSIN server: "
	perl /usr/local/bin/spamd -d -a -u spamduser 
	echo
	;;
  stop)
	echo "Stopping SPAMASSASSIN server: "
	i=`ps auxw | grep spamd | grep -v grep | grep usr | awk '{print $2}'`
	if [ `ps auxw | grep spamd | grep -v grep | grep -c usr` -ne 0 ]; then
		kill $i
	fi
	echo "Stopping SPAMASSASSIN-MILTER connector: "
	i=`ps auxw | grep spamass-milter | grep -v grep | awk '{print $2}'`
	if [ `ps auxw | grep spamass-milter | grep -v grep | grep -c milter` -ne 0 ]; then
		kill $i
	fi
	echo "10 seconds..."
	sleep 10
	i=`ps auxw | grep spamass-milter | grep -v grep | awk '{print $2}'`
	if [ `ps auxw | grep spamass-milter | grep -v grep | grep -c milter` -ne 0 ]; then
		kill -9 $i
	fi
	echo
	;;
  restart)
	$0 stop
	sleep 3
	$0 start
	RETVAL=$?
	;;
  *)
	echo $"Usage: $0 {start|stop|restart}"
	exit 1
esac

exit $RETVAL

Материал взят с сайта: http://www.vtornik.com/ph/spamassassin.php

Главная > Программы > SpamAssassin