Настройка Rspamd в Debian и его интеграция с Postfix и Dovecot

Для начала я немного расскажу, что такое 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.

//Какие либо предложения и вопросы по статье оставляем в комментариях.

Оцените статью