[exim-conf] dlfunc для интеграции exim с rspamd

Victor Ustugov victor на corvax.kiev.ua
Пт Янв 28 23:35:53 EET 2011


приветствую

в рамках расширения набора поддерживаемых контент сканеров написан
тестовый вариант 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




Подробная информация о списке рассылки exim-conf