Постоянно крутится демон 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
(, а у остальных - желательно отнять эти права), то есть
Примечание -
bayes_path /etc/mail/spamassassin/bayes указывает что демон создаст три файла базы данных Bayesian фильтра для хранения создаваемых образчиков писем:
указывают, сколько чистых писем и писем со спамом должно накопится в Bayesian базе прежде чем демон будет пользоваться этой базой (по умолчания - 200 чистых и спама)
Посмотреть базу можно командой sa-learn -dump
auto_whitelist_path /etc/mail/spamassassin/auto-whitelist - Если Вы запустили демон с опцией -a то есть автообучения адресов, указывает, что демон создаст два файла базы данных адресов
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:
для благонадежных писем.
Примечание: если у Вас есть ящики пользователей, которые ушли из организации, в которые теперь падает лишь спам, очень удобно, например, по расписанию, скармливать их содержание в Bayesian базу
Sendmail должен быть скомпилирован с поддержкой MILTER
Проверяем командой
echo a|sendmail -d | grep MILTER
Если это не так, необходимо его перекомпилировать, добавив в файл соответствующий Вашей ОС (например, devtools/OS/Linux) строчку
Sendmail откажется запуститься, если у all есть права записи на директорию,
в которой находится сокет spamass-milter_а, то есть, на всякий случай
chmod a-w /var
chmod a-w /var/run
Что дальше?
Сам по себе spamassassin меняет текст писем, которые он считает спамом, на предупреждение
и прикладывает оригинальное письмо в виде аттачмента. Пользователь волен воспользоваться
фильтром в своем почтовом клиенте, например,
чтобы автоматически переложить подозрительные
письма в отдельную папку для дальнейшего изучения.
Если мы хотим отфутболить эти письма, необходимо установить параметр
spamass-milter -r NN при котором будет происходить отлуп
Пример .mc файла:
Примечание: в третьей строке примера конфигурации
параметр S - задает сокет для соединения с spamass-milter
Параметр F - задает поведение sendmail когда ему не удается присоединится
к сокету мильтера: отсутствие
означает "игнорировать" (то есть сообщение обрабатывается sendmail-ом дальше),
F=T - означает выдать ошибку 471 (временно недоступен) и обработка письма прекращается,
F=R - отвергнуть письмо окончательно
Параметр T - разные таймауты..
Привет!
Прочитал твою статью
Большое спасибо, у меня вопросик, можно ли письма спамовые сохранять
где-нибудь как это делает amavis, а то бывает хорошее важное письмо
отлупывается. amavis'ом пользовался, не нравится, мильтером удобнее.
У spamass-milter есть удобная опция -b somemailbox, вся спамерская почта идет в ящик somamailbox. Только ее нельзя использовать совместно с -r а также рекомендуется в /etc/mail/spamassassin/local.cf поставить опции "rewrite_subject 0" и "report_safe 1", чтобы спамовые сообщения не коверкались. А вообще, есть интересный набор скриптов, см. здесь: http://www.numbski.net/softs/quarantine.html