[exim-conf] подмена разделителя полей в результатах запросов к файлам access-mail-domain-txt и access-mail-domain-spf

Victor Ustugov victor на corvax.kiev.ua
Вс Июл 27 15:30:32 EEST 2014


приветствую

реализована подмена разделителя полей в результатах запросов к файлам
access-mail-domain-txt и access-mail-domain-spf с ":" на "|" с целью
дать возможность использовать в результатах запросов вставку переменных,
в значениях которых может присутствовать символ ":".

в данном конкретном случае понадобилось в лог файл выводить содержимое
SPF записи. для этого надо содержимое самой SPF записи, содержащееся в
переменной $acl_m_key, вставить в третье поле результата запроса.

при этом поля действия, сообщения SMTP клиенту и сообщения в лог файл
разделены символом ":", который встречается почти во всех SPF записях,
при этом разделение всего результата запроса на поля производится
функцией ${extract как раз с использованием разделителя ":" уже поле
применения ко всему результату функции ${expand.

вариант применять ${expand по отдельности к разным полям результата
запроса уже после разделения функцией ${extract тоже оказался не очень
удобным, т. к. возникла ситуация (опишу ниже), при которой бывает
необходимо заворачивать все три поля результата в конструкции с логикой
и т. д.

меньшим злом показалась замена на лету разделителя ":" на "|" перед
${expand и выполнение ${extract уже с использованием "|" в качестве
разделителя.

минус один - при проверке SPF и TXT записей в сообщениях SMTP клиенту и
в сообщениях в лог файл нельзя использовать символ "|".

теперь о самой ситуации, из-за которой все это пришлось реализовывать.

уже несколько месяцев идет спам с доменов, у которых SPF запись имеет
примерно вот такой вид:

v=spf1 ip4:116.203.0.1/16 -all

т. е. сеть с маской "/16", номер сети заканчивается на ".0.1", политика
по умолчанию "-all".

синтаксически и технически всё верно, но практически вряд ли кто-то из
валидных отправителей будет использовать такую SPF запись.

поэтому была добавлена строка в файлы access-mail-domain-txt и
access-mail-domain-spf:

\N^v=spf1\x20ip4\x3A\d+\.\d+\.0\.1\/16\x20-all$\N : warn pause=20
greylist=10 reject=8 : Access denied : Strange network number in SPF record

т. е. письмо не отвергалось безусловно, при приеме применялась пауза,
серые списки и к счетчику опционального reject'а добавлялось 8 баллов.

при более детальном изучении писем, попавших под это правило, оказалось,
что почти все они из Вьетнамских сетей (немного из Китая, Индии и
Индонезии и совсем единичные экземпляры из нескольких других стран), а
домен отправителя сгенерирован случайно как поддомен третьего уровня в
одном из нескольких российских доменов. а за такое можно сразу deny делать.

чтобы не городить отдельный фильтр для такой ситуации была просто
модифицирована строка в access-mail-domain-txt и access-mail-domain-spf:

\N^v=spf1\x20ip4\x3A\d+\.\d+\.\d+\.1\/16\x20-all$\N : ${if
and{{!eq{$acl_m_sender_host_address_country}{}}{match{$acl_m_sender_host_address_country}{\N^(BR|CL|CN|HK|ID|IN|KR|PE|SA|VN)$\N}}{match{$sender_address_domain}{\N^([^\.]+\.)
{2,}ru$\N}}}{warn reject : Access denied : Message from
$acl_m_sender_host_address_country with strange network number in SPF
record "$acl_m_key" of sender adress domain $sender_address_domain
(subdomain of russian domain)}{warn pause=20 greylist=10 reject=8 :
Access denied : Strange network number in SPF record "$acl_m_key"
(sender address domain: $sender_address_domain${if
eq{$acl_m_sender_host_address_country}{}{}{, sender host address
country: $acl_m_sender_host_address_country}})}}


строка длинная, поэтому в письме выглядит ужасно.

она добавлена в конец файлов примеров:

http://mta.org.ua/exim-4.76-conf/samples/access-mail-domain-spf
http://mta.org.ua/exim-4.76-conf/samples/access-mail-domain-txt

там же чуть выше правая часть этой строки показана в чуть более
читабельном виде.

смысл конструкции заключается в том, что если в результате проверки SPF
записи она совпадет с регулярным выражением
^v=spf1\x20ip4\x3A\d+\.\d+\.0\.1\/16\x20-all$, то далее производится
проверка страны хоста получателя и домена отправителя.

если страна хоста получателя содержится в переменной
$acl_m_sender_host_address_country (а это так и будет, если используются
confCHECK_ACCESS_RELAY_COUNTRY или confCHECK_ACCESS_COMPAT_RELAY_COUNTRY
и, конечно, если удалось вычислить страну), если страна соответствует
регулярному выражению (в данном случае
^(BR|CL|CN|HK|ID|IN|KR|PE|SA|VN)$) и если домен из адреса отправителя
является доменом третьего уровня из зоны .ru, то применяются действия
warn и reject с сообщением "Access denied" SMTP клиенту и сообщением
"Message from $acl_m_sender_host_address_country with strange network
number in SPF record "$acl_m_key" of sender adress domain
$sender_address_domain (subdomain of russian domain)" в лог файл.

в сообщении в лог файл используется переменная
$acl_m_sender_host_address_country для указания страны хоста отправителя
и переменная $acl_m_key для указания значения SPF записи.

если же не используется определение страны по IP адресу или если страну
хоста отправителя определить не удалось или если эта страна не
соответствует указанному выше регулярному выражению или если домен
отправителя не является доменом третьего уровня из зоны .ru, то
применяются действия warn pause=20 greylist=10 reject=8 и более другие
сообщения SMTP клиенту и в лог файл.

по сути всё это было обоснованием того, почему теперь нельзя
использовать символ "|" в правой части строк в файлах
access-mail-domain-txt и access-mail-domain-spf :)

-- 
Best wishes Victor Ustugov  mailto:victor на corvax.kiev.ua
public GnuPG/PGP key:       http://victor.corvax.kiev.ua/corvax.asc
ICQ UIN: 371808614          JID: corvax_at_nb на jabber.corvax.kiev.ua
nic-handle: CRV-UANIC



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