Для начала я немного расскажу, что такое Rspamd. Rspamd — это альтернативный SpamAssassin’у демон (служба) для фильтрации почтового спама. Показывает гораздо большую производительность, чем Spamassassin, а также имеет гибкие настройки и легко интегрируется с MTA Postfix и Exim. Насколько мне известно, данный продукт весьма успешно трудится в Rambler почте, а разработчиком является Всеволод Стахов.
Работает вся эта связка по следующему принципу
На наш почтовый сервер стучится другой MTA и пытается передать письмо для пользователя который обслуживается в нашем домене. После всех проверок самого MTA (наличие пользователя и т.д) письмо передается Rmilter, который в свою очередь передает его демону Rspamd и после проверки отдает его обратно постфиксу. Затем, если письмо превышает установленные ограничения оно отбрасывается, в противном случае передается LDA и раскладывается по локальным ящикам.
На этом мы закончим вступление и перейдем к «зависимостям». Я исхожу из того, что уже есть работающие как надо Posfix и Dovecot. Также стоит отметить, что нам потребуется Debian 7 (пакеты существуют и для RH дистров, таких как Centos). Сначала у меня стоял Debian 6 и уже собранные пакеты имели неудовлетворенные зависимости. Но если имеется достаточный скилл по сборке из исходников и последующей дебианизации собранного — вперед. Могу заверить, что собирается все отлично и на 6 дебьяне.
Получить пакет rspamd можно добавив репозиторий, либо скачать готовые пакеты напрямую и установить их через dpkg.
Для трансляции писем в Rspamd нам потребуется Rmilter. Его также можно установить из репозитория. В конфигах Rspamd в принципе ничего перенастраивать не надо, по крайней мере на первоначальном этапе. Единственное что я менял — систему метрик или другими словами бальную систему.
Откроем
/etc/rspamd/metrics.conf
Нас интересуют строки
metric { name = "default"; actions { reject = 10; add_header = 3; greylist = 6;
и в частности подсекция actions.
Параметр reject. В нем задается бальный порог при превышении которого письмо будет отвергнуто нашим сервером. Советую не увлекаться и не занижать это значение, потому как сервер будет отвергать и белую корреспонденцию. Потенциальный спам лучше принимать и потом уже фильтровать его Dovecot’ом при локальной доставке. Параметр add_header задает пограничное значение, превышая которое к письму добавляется X-Spam заголовок. Для чего нам это нужно мы поговорим чуть позже.
Параметр greylist по тому же принципу добавляет письма в greylist.
Теперь перейдем к Rmilter. Нам потребуется новая версия Rmilter 1.6.1
В конфигурационном файле Rmilter задаются так называемые «цепочки» в которые письмо будет направлено после прохождения первичных проверок MTA. Существуют несколько цепочек:
- Clamav — Антивирусная проверка (если установлено)
- Spamd — Проверка фильтрами Rspamd
Это только основные цепочки, есть и множество других, но у меня используется только первая — Rspamd.
Главное, что нам нужно выделить в конфиге Rmilter — это настройка подключения к Rspamd. Выглядит это так.
spamd { servers = r:localhost:11333; connect_timeout = 1s; results_timeout = 20s; error_time = 10; dead_time = 300; maxerrors = 10; reject_message = "Spam? No way!"; whitelist = 127.0.0.1/32; rspamd_metric = "default"; };
Собственно объяснять тут особо нечего итак все ясно. Обращу внимание на то, что параметр
servers = r:localhost:11333;
явно указывает использовать протокол rspamd, а запись вида
servers = localhost:11333;
указывает использовать spamd протокол.
Далее укажем сокет через который MTA будет передавать сообщение rmilter’у.
bind_socket = unix:/run/rmilter/rmilter.sock;
Здесь я остановлюсь подробнее. Так как Postfix у вас работает скорее всего в chroot окружении, то указанный сокет он не увидит, так как корневая директория для него /var/spool/postfix. Для этого создадим директорию rmilter в корне chroot окружения Postfix.
mkdir /var/spool/postfix/rmilter
и забиндим в нее директорию созданную rmilter’ом
mount -o bind /run/rmilter /var/spool/postfix/rmilter
Теперь у нас в /var/spool/postfix/rmilter точная копия того, что находится в /run/rmilter. Для автоматизации данного процесса выполним от рута
echo '/run/rmilter /var/spool/postfix/rmilter tmpfs defaults,bind,auto 0 0' >> /etc/fstab
Теперь сокет для MTA виден, но скорее всего при подключении к нему rmilter’a будем получать Permission denied, так как сокет имеет права 770 владельца rmilter и принадлежит группе adm. Я решил эту проблему путем добавления пользователя postfix в группу adm.
usermod -G postfix,adm postfix
Данное костыльное решение мне самому совсем не нравится, но переписка с мантейнером пакета под Debian и разработчиком ничего не дала в этом плане. Если у Вас есть какие либо предложения, как это исправить более правильным и красивым методом — велкам в каменты.
В остальном дефолтный конфиг вполне жизнеспособен и допиливание под свои нужды можно оставить на потом.
Теперь нам нужно настроить MTA (в моем случае это Postfix)
Делается это достаточно просто:
Открываем
/etc/postfix/main.cf
и дописываем в него
smtpd_milters = unix:rmilter/rmilter.sock milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen} milter_protocol = 4 milter_rcpt_macros = i {rcpt_addr} # skip mail without checks if milter will die milter_default_action = accept
Обращаю ваше внимание на то, что {auth_authen} нужно добавить обязательно, иначе письма от авторизованных пользователей также будут проверяться и есть большая вероятность, что такую проверку они не пройдут).
Больше собственно в MTA настраивать нечего и мы перейдем к LDA (Dovecot) В начале статьи я упоминал про X-Spam headers которые нам сейчас и понадобятся. Мы настроили так, что после достижения определенного порога по весу к письму будут добавляться X-Spam заголовки, теперь с помощью них мы будем ложить подозрительную почту в определенную папку. Я выбрал для этих целей Junk, но Вы вольны выбрать свою, например Spam.
Делать это мы будем с помощью sieve, поэтому откроем файл
/etc/dovecot/conf.d/90-sieve.conf
и приведем его к такому виду.
plugin { sieve = ~/.dovecot.sieve sieve_dir = ~/sieve sieve_global_dir = /etc/dovecot/conf.d/sieve sieve_before = /etc/dovecot/conf.d/sieve/spam.sieve }
Далее создадим директорию:
mkdir -p /etc/dovecot/conf.d/sieve
Создадим скрипт содержащий:
nano -w /etc/dovecot/conf.d/sieve/spam.sieve
require ["fileinto"]; # rule:[spam] if header :is "X-Spam" "Yes" { fileinto "Junk"; }
Скомпилим его при помощи sievec и дадим необходимые разрешения получившемуся бинарнику:
sievec /etc/dovecot/conf.d/sieve/spam.sieve
chown -R postfix:dovecot /etc/dovecot/conf.d/sieve/spam.svbin && chmod 644 /etc/dovecot/conf.d/sieve/spam.svbin
Теперь вся почта получившая >=3 балла при проверке будет падать в Junk директорию почтового ящика юзера.
Осталось лишь запустить rspamd, rmilter и перезапустить postfix и dovecot.
//Какие либо предложения и вопросы по статье оставляем в комментариях.