приветствую
в рамках расширения набора поддерживаемых контент сканеров написан
тестовый вариант dlfunc для интеграции exim с rspamd:
http://mta.org.ua/exim-4.70-conf/dlfunc/rspamd/rspamd.c
rspamd позиционируется как алтернатива SpamAssassin'у:
http://webcrunch.ru/library/administration/security/rspamd/https://bitbucket.org/vstakhov/rspamd/downloads
пока тяжело сказать, сколько времени уйдет на доведение функционала
rspamd до функционала SpamAssassin, собранного с этими патчами
http://mta.org.ua/spamassassin/patches/, и использующего эти правила
http://mta.org.ua/spamassassin/rules.corvax/ и
http://mta.org.ua/spamassassin/rules.local/
но для систем с большим потоком входящей почты SpamAssassin явно не
является приемлемым решением.
вот пример configure для обработки ответа rspamd, полученного от dlfunc:
http://mta.org.ua/exim-4.70-conf/dlfunc/rspamd/configure-example-single-metric
как следует из навазния файла, этот пример годится для конфигурации
rspam с одной метрикой. что делать с результатами проверки при более чем
одной метрике, я пока не решил.
собственно, саму dlfunc не нужно модифицировать в случае использования
нескольких метрик.
обработку данных можно показать на примере.
ответ от rspamd:
RSPAMD/1.1 0 EX_OK
Metric: default; False; 9.00 / 10.00 / 0.00
Action: greylist
Symbol: FORGED_RECIPIENTS
Symbol: BAYES_SPAM; 1.00
Symbol: R_PARTS_DIFFER
Urls: shopinusa.com.ua, www.shopinusa.com.ua, estream.com.ua,
www.trackemailmarketing.com, www.gap.com,
0 EX_OK интерпретируется как признак успешной проверки
1.1 - версия протокола
значение поля Action я интерпретирую как значение для поля заголовка
X-Rspam-Status. значение "rejected" я заменяю на "Yes", значение
"greylist" на "Probably", в противном случае использую "No".
интерпретировать "greylist" как "Probably" мне пришлось потому, что
нужно было как-то обозначить "возможно спамовые" письма. для этого
неплохо подходит атрибут action раздела metric настроек spamd, в
значение которого использовано действие "greylist" и можно указать
пороговую сумму баллов, меньшую, чем в атрибуте required_score этой же
метрики.
баллы из поля Metric я использую для поля заголовков X-Rspamd-Score
остальная часть результата используется как значение поля X-Rspam-Report.
итак, фрагмент configure:
warn set acl_m0 = ${dlfunc{/usr/local/libexec/exim/exim-dlfunc.so}\
{rspamd}{127.0.0.1 11333}{defer_ok}}
запрос к rspamd и получение результата
warn condition = ${if eq{$acl_m0}{}{yes}{no}}
logwrite = RSPAMD check failed
add_header = X-Rspamd-Info: RSPAMD check failed
проверка полученного результата
warn condition = ${if match{$acl_m0}{\N^rspamd dlfunc:\s*\N}{yes}{no}}
logwrite = RSPAMD check defer: \
${sg{$acl_m0}{\N^rspamd dlfunc:\s*\N}{}}
add_header = X-Rspamd-Info: RSPAMD check deffered: \
${sg{$acl_m0}{\N^rspamd dlfunc:\s*\N}{}}
set acl_m0 =
обработка временных ошибок
warn condition = ${if eq{$acl_m0}{}{no}{yes}}
set acl_m1 = ${if match{$acl_m0}\
{\N^RSPAMD answer: RSPAMD/(\S+) 0 EX_OK\N}{$1}{}}
logwrite = RSPAMD check: RSPAMD protocol version: \
${if eq{$acl_m1}{}{not found}{$acl_m1}}
add_header = X-Rspamd-Protocol-Version: \
${if eq{$acl_m1}{}{not found}{$acl_m1}}
вычисление версии протокола и добавление поля X-Rspamd-Protocol-Version
warn condition = ${if eq{$acl_m0}{}{no}{yes}}
set acl_m1 = ${if match{$acl_m0}\
{\N^RSPAMD answer: RSPAMD/(.+?\r\n)+Action: (\S+)\r\n\N}{$2}{}}
set acl_m1 = ${if eq{$acl_m1}{}{unknown}{\
${if eq{$acl_m1}{reject}{Yes}{\
${if eq{$acl_m1}{greylist}{Probably}{No}}\
}}\
}}
logwrite = RSPAMD check: RSPAMD status: $acl_m1
add_header = X-Rspamd-Status: $acl_m1
преобразование значение поля Action в значение статуса и добавление поля
X-Rspamd-Status
warn condition = ${if eq{$acl_m0}{}{no}{yes}}
set acl_m1 = ${if match{$acl_m0}\
{\N^RSPAMD answer: RSPAMD/.+?\r\nMetric: \S+?; (\S+?);
(-?\d+\.\d+ / \d+\.\d+ / \d+\.\d+)\N}{$2}{}}
logwrite = RSPAMD check: RSPAMD scores: \
${if eq{$acl_m1}{}{not found}{$acl_m1}}
add_header = X-Rspamd-Score: $acl_m1
вычисление начисленных баллов и добавление поля X-Rspamd-Score
warn condition = ${if eq{$acl_m0}{}{no}{yes}}
set acl_m1 = ${if match{$acl_m0}\
{\N^(?s)^RSPAMD answer: RSPAMD/.+?\r\n((?:.*\r\n)+)Action:
\S+?\r\n((?:.*\r\n)+)$\N}\
{$1$2}{$acl_m0}}
logwrite = RSPAMD check: RSPAMD report: \
${if eq{$acl_m1}{}{not found}{$acl_m1}}
add_header = X-Rspamd-Report: \
${sg{$acl_m1}{\N\r\n(.)\N}{\r\n\t\$1}}
использование значений оставшихся полей (данных о метрике, сработавших
символах и URL) в качестве значения добавляемого поля X-Rspamd-Report
пример сырой, но с этим уже можно работать.
--
Best wishes Victor Ustugov mailto:victor на corvax.kiev.ua
public GnuPG/PGP key: http://victor.corvax.kiev.ua/corvax.asc
ICQ UIN: 77186900, 371808614 nic-handle: CRV-UANIC