Фотогалереи

Помощь при использовании сайта

Настройка 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.

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

5
1 голос
Ваша оценка: Нет


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".
Аватар пользователя anonymous

Замечательное руководство, спасибо! Очень редкий случай, когда не нужно вообще ничего додумывать и исправлять — бери и делай, всё получится. У Вас явный педагогический талант :)

В качестве дополнения — не могли бы Вы написать ещё и методичку по использованию WebUI? Никак не получается отконфигурировать Apache, чтобы запросы к виртуальному хосту /usr/local/www/apache24/data (куда скопировал содержимое static_dir = "${WWWDIR}") перенаправлялись на порт 11334 и к rspamd.

Вообще, неплохая разработка страдает полным отсутствием нормальной документации. Не мог найти даже простейших вещей вроде определения $PLUGINSDIR. Вот, правда, это где? Методом тыка: /usr/local/share/rspamd. Но совсем не уверен.

Юрий

P. S. Капча: «При делении синуса на косинус получаем...?», — моё почтение :)

Аватар пользователя admin
anonymous пишет:

В качестве дополнения — не могли бы Вы написать ещё и методичку по использованию WebUI?

Добрый день Юрий!
WebUI не использую и не пробовал его настраивать, но если буду, то обязательно манулу напишу. А сейчас пока мир, май, шашлыки...

Аватар пользователя anonymous

Спасибо за ответ!

Честно говоря, мне тоже веб-интерфейс не очень нужен. Но дефолтная установка не очень корректна. Например, ругается при загрузке на ratelimit (не определены сервера), не знаю как отключить сообщения вида
2015-05-02 08:46:21 #44575(main) rspamd_rcl_statfile_handler: statfile BAYES_HAM has no explicit 'spam' setting, trying to guess by symbol
2015-05-02 08:46:21 #44575(main) rspamd_rcl_statfile_handler: guessed that statfile with symbol BAYES_HAM is ham

Какую настройку надо ему скормить в файле statistic.conf? Нигде ничего найти невозможно (разбираться в исходниках дело неблагодарное (да и нет их у меня, инсталлировал через pkg install…)).

Ещё одно сообщение бесит:
2015-05-02 08:46:21 #44575(main) rspamd_map_add: map '/var/db/rspamd/rspamd_dynamic' is not found, but it can be loaded automatically later

Вот оно-то, видимо, относится к WebUI. Можно отключть совсем, закомментировав (наверное):
dynamic_conf = "$DBDIR/rspamd_dynamic";
но недоработка налицо.

Отдыхайте, конечно :) Я это пишу, чтобы привлечь внимание к проекту. Может быть, автор даже заглянет. Как в своё время можно было встретить Wietse Venema в любом блоге, где упоминался Postfix.

С уважением,

Юрий

Аватар пользователя anonymous

Ну, я заглянул. Хотя претензии к документации мне зачастую сложно понять: на любой вопрос, как правило, есть ответ либо в основной документации, либо в '--help', либо в 'rspamadm confighelp'. Ну и стремление отключать информационные сообщения мне тоже не очень понятно.

Аватар пользователя admin

Забыл про комментарий годовалой давности. Вот только сейчас вернулся с шашлыков, впервые с мая 2015 ;)

По поводу использования Rspamd. Хороший проект, нужный. За 2 года использования была только одна проблема. После обновления по моему с версии 0.8.* до 1.1 долго не мог понять почему не добавляется к сообщению X-spam header, а как оказалось сменился немного синтаксис (теперь в metrics.conf надо писать так:

"add header" = 3;

вместо

add_header = 3;

В остальном проблем не было никогда

Аватар пользователя anonymous
admin пишет:
"add header" = 3;

вместо

add_header = 3;

В остальном проблем не было никогда

Видимо, когда-то был баг: сейчас должны работать оба варианта.

На самом деле, к rspamd довольно много претензий из-за того, что нет понимания политики веток, которая, в целом, идентична nginx: есть stable branch и есть experimental branch. Например, сейчас stable - это rspamd-1.2, а experimental - 1.3 (который пока доступен вообще только из master ветки). К сожалению, в прошлом у меня было очень мало времени на анонсы, поддержку стабильных веток и ведение актуальной документации. Сейчас, когда я работаю над rspamd full time, с этим все стало лучше.

Аватар пользователя admin

Хорошо, проверю и отпишусь.

Аватар пользователя anonymous

> mkdir /var/spool/postfix/rmilter
> и забиндим в нее директорию созданную rmilter'ом
> mount -o bind /run/rmilter /var/spool/postfix

В неё, это:
mount -o bind /run/rmilter /var/spool/postfix/rmilter

Аватар пользователя admin

Спасибо, опечатался.

Аватар пользователя anonymous

Спасибо за познавательную статью, все сделал по вашему мануалу.

Только вот проблема с запуском rmilter

никак не запускается

Сначала было так:
- sudo service rmilter start
Starting rmilter: config file parse error! line: 3, text: /etc/rmilter.conf.common, reason: yylex: cannot glob include file /etc/rmilter.conf.common: No such file or directory

Потом создал файл /etc/rmilter.conf.common

в котором изменил только секцию smapd, так:
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";
};