АНДРЕЙ МОЗГОВОЙ
Postfix + ... + SpamAssassin
Mini-HOWTO
Спам. Рассылка рекламы. Бороться с нежелательной почтой можно по-разному. Эта статья расскажет, как прикрутить фильтр SpamAssassin к MTA Postfix. Надеюсь, статья получится выдержанной в стиле mini-howto.
Пожалуйста, не пытайтесь прикрутить фильтр к ненастроенному/работающему серверу Postfix. Далее будем полагать, что у читателя настроен и нормально работает почтовый сервер и уже установлен SpamAssassin.
Установка SpamAssassin (коротко): SpamAssassin – это perl-модуль. Состоит из трех основных частей:
- spamd – daemon, к которому подключается клиент;
- spamc – client, который подключается к spamd. На вход клиенту подаются письма, с выхода забираются отфильтрованные письма;
- spamassassin – perl-скрипт, работает сам по себе, подробней – «man spamassassin». Установка подробно описана в файле INSTALL.
Мой Postfix работает в следующей связке: Postfix + Cyrus-SASL + Mysql + Courier-IMAP + SquirrelMail + DrWeb, а теперь еще и SpamAssassin.
- Postfix – сам MTA;
- Cyrus-SASL – используется для авторизации пользователей (пока только SMTP AUTH);
- MySQL – БД – хранит все бюджеты пользователей;
- Courier-IMAP – POP3- и IMAP-сервисы;
- SquirrelMail – веб-интерфейс для пользователей, кстати, нормально работает с кириллицей;
- DrWeb – антивирус, работает как фильтр, в этом собственно вся проблема и была. Если прикручивать SpamAssassin как один-единственный фильтр, думаю, проблем особых возникнуть не должно. Схема проста, в master.cf прописывам фильтр, например, spam, с опцией:
-o content_filter=spam
daemon smtpd, говорим «использовать фильтр spam». Письмо, пришедшее на smtp, переправляется на spamс, spamс проверяет и с помощью sendmail возвращает обратно в очередь.
--- MASTER.CF ---
#=====================================================================
# service type private unpriv chroot wakeup maxproc command+args
# (yes) (yes) (yes) (never) (100)
#=====================================================================
smtp inet n - n - 50 smtpd
-o content_filter=spam:dummy
...
# SpamAssassin Filter
# ====================================================================
spam unix - n n - - pipe
flags=R user=spam argv=/usr/bin/spamc -u spam -e /usr/sbin/sendmail -t
--- END MASTER.CF ---
(Кстати, с «:dummy» надо еще поэкспериментировать.)
Но SpamAssassin у меня не единственный фильтр, есть еще и DrWeb. Вот как было все прописано до использования SpamAssassin.
--- MASTER.CF ---
#=====================================================================
# service type private unpriv chroot wakeup maxproc command+args
# (yes) (yes) (yes) (never) (100)
#=====================================================================
smtp inet n - n - 50 smtpd
-o content_filter=drweb:dummy
...
# DrWeb AntiVirus Filter
#=====================================================================
drweb unix - n n - - pipe
flags=R user=drweb argv=/opt/drweb/drweb-postfix -f ї
${sender} -- ${recipient}
--- END MASTER.CF ---
Фильтровать почту будем, используя именно spamc/spamd, а не через perl-скрипт spamassassin. Так оно намного быстрее… да и вообще симпатичнее.
Создаем в системе пользователя с домашним каталогом «/etc/mail/spamassassin», shell можно не давать (/bin/fasle). Но валидный shell очень удобен, когда надо добавить/удалить какой-нибудь адрес в White/Black List. Решайте сами. Также создаем группу spam. Каталоги /etc/mail/spamassassin и /usr/local/share/spamassassin отдаем в распоряжение бюджету spam (chown –R spam.spam /path/to/dir).
С документацией по настройке spamd трудности [2], я использовал веб-интерфейс, написанный Michael Moncur [3]. Принцип фильтрации следующий: во всех письмах, распознанных как спам, поля темы меняются на «SPAM: ».
Запускаем spamd: прочтите руководство и выберите необходимые параметры (man spamd). Меня устроило следующее:
/usr/bin/spamd -d -a -c -m 50 -u spam
* используйте опцию "-D" для отладки.
* не забудьте прописать spamd в стартовых скриптах
Уже можно протестировать SpamAssassin. Сохраните спамовское письмо, которое пришло к вам, на сервере и подайте его на вход spamc (желательно сразу использовать параметр -u user).
/usr/bin/spamc -u spam -e /usr/sbin/sendmail –t
Письмо пройдет проверку и вернется в очередь MTA, затем опять упадет к вам в Home_Dir. Можете проверять почтовый ящик. Если spamd был запущен с опцией «-D» – в лог-файле (скорее всего в /var/log/maillog) вы найдете подробный отчет о проделанной работе. Работает? Отлично, прикручиваем фильтр в Postfix. (Не работает? Внимательно прочтите сообщения в лог-файле.)
Приступим к настройке Postfix. (DrWeb настроен и нормально работает.) Есть как минимум два варианта, как подключить SpamAssassin к Postfix.
- Первый способ я нашел в статье reVen [6]. Его суть: передача почты от сервиса к сервису, прописанных в master.cf. Но мне такой способ не понравился. Зачем дополнительно использовать Perl в перенаправления с сокета на сокет? Можно вообще без лишних сокетов (мое личное мнение).
- Может, я изобрел велосипед, но дошел до этого сам, хотя ничего сложного в нем нет. Изменяем в master.cf фильтрсервис drweb, в сумме получаем следующий файл:
--- MASTER.CF ---
#=====================================================================
# service type private unpriv chroot wakeup maxproc command+args
# (yes) (yes) (yes) (never) (100)
#=====================================================================
smtp inet n - n - 50 smtpd
-o content_filter=drweb:dummy
...
# DrWeb AntiVirus Filter and SpamAssassin Filter
# ====================================================================
drweb unix - n n - - pipe
flags=R
user=drweb
argv=/usr/local/sbin/postfix_filter -f ${sender} -- ${recipient}
--- END MASTER.CF ---
А вот и маленький, да удаленький скриптик на BASH, который получает письмо от Postfix, проверяет его на spam с помощью spamc и отдает его (письмо) антивирусу DrWeb.
--- /usr/local/sbin/postfix_filter ---
#!/bin/sh
(/usr/bin/spamc -u spam -s 1024000 | /opt/drweb/drweb-postfix $@) <&0
--- END /usr/local/sbin/postfix_filter ---
* -s – максимальный разрер проверяемого письма,
* по умолчанию 250k
Вот и вся настройка. Еще раз повторюсь, если что-то не работает, внимательно прочтите лог-файлы.
Ссылки:
- SpamAssassin Homesite: http://www.spamassassin.org, в статье описывается версия 2.55.
- http://www.spamassassin.org/doc/Mail_SpamAssassin_Conf.html
- http://www.yrex.com/spam/spamconfig.php
- http://www.perl.com/CPAN – все необходимое для Perl.
- Postfix Homesite: http://www.postfix.org
- http://raven.elk.ru/unix/how-to/postfix2+cyrus-sasl2+kav+spamassassin+courier-imap+tls+mysql+FreeBSD4/postfix2+cyrus-sasl2+kav+spamassassin+courier-imap+tls+mysql+FreeBSD4.html – вариант использования Postfix + SpamAssassin
- Статьи по настройке Postfix: http://www.onix.opennet.ru/mail/mail.html; http://linuxnews.ru/docs/new/isp-mail/version1.2/isp-mail-howto.1.2.rus.txt