[exim-conf] патчи, связанные с обработкой ldap запросов, и новые сборки exim

Victor Ustugov victor на corvax.kiev.ua
Вт Фев 23 14:32:20 EET 2010


Sergey Kobzar wrote:

>>> Ты бы еще копию этой месаги в exim-users на exim.org.ua запостил.
>>> Явный баг, причем оч. неприятный.
> 
>> да вроде в exim-rusers никто подобных тем (наличия LDAP паролей в 
>> сообщениях SMTP клиенту) никогда и не поднимал.
> 
> Ну так много багов не поднимается в рассылках.

возможно, возможно...

>> тут же вопрос в том, что у меня возникает это сообщение не на этапе 
>> доставки, а на этапе verify recipient. да еще и выполняется от двух до
>> четырех запросов в одном роутере (по крайней мере это касается алиасов).
> 
> Потому что эти раутеры принимают участие в verify recipient?

нет, дело не в verify recipient.

дело в схеме хранения алиасов.

адрес пользователя у меня указывается в атрибуте mail объекта user 
(наследник organizationalPerson), адрес группового алиаса - в атрибуте 
mail объекта group. чтобы включить адрес пользователя в групповой алиас, 
нужно просто включить пользователя в соответствующую группу.

так вот, чтобы потом по адресу группвого алиаса получить список почтовых 
адресов членов группы, мне пришлось первым LDAP запросом получить 
distinguishedName соответствующей группы, а потом вторым запросом 
получить адреса пользователей этой группы. т. е. запросы получились 
вложенные. и результат выполнения первого запроса входит в условия 
фильтра второго запроса

как получить адреса пользователей, входящих в определенную группу, если 
мы о ней знает лишь значение одного атрибута, я не знаю.

это два запроса. а еще два - такая же схема, но с organizationalUnit 
(ибо для того, чтобы сделать общий алиас на все подразделение, может 
будет не включать всех сотрудников подразделения в одельную группу, т. 
к. они уже включены в отдельный OU). правда для OU нет артибута mail, 
пришлось внести адрес в другой атрибут.

вот и получаем по одному запросу для группы и OU. если один из них 
вернет непустое значение, то выполняется еще один запрос.

в общем и целом все это видно тут:
http://mta.org.ua/exim-4.69-conf/deliveries/virtual_aliases.m4

нужно поискать по словам confVIRT_MDIR_LDAP_ALIAS, 
confVIRT_MDIR_LDAP_ALIAS_RECURSIVE, confVIRT_MDIR_LDAP_ALIAS2, 
confVIRT_MDIR_LDAP_ALIAS2_RECURSIVE.

хотя наверное лучше показать реальный роутер:

virtual_aliases_ldap:
         driver                  = redirect
         domains                 = +local_domains
         data                    = ${sg{\
   ${lookup ldapm{\
     user="..." pass=... \
     ldap://.../dc=ad,dc=company,dc=net?distinguishedName?sub?\
     (&\
       (objectClass=group)\
       (mail=${local_part}@${domain})\
     )\
   }{\
     ${lookup ldapm{\
       user="..." pass=... \
       ldap://.../dc=ad,dc=company,dc=net?mail?sub?\
       (&\
         (memberOf=$value)\
       )\
     }{$value,}{}}\
   }{}}\
   ${lookup ldapm{\
     user="..." pass=... \
     ldap://.../dc=ad,dc=company,dc=net?distinguishedName?sub?\
     (&\
       (objectClass=organizationalUnit)\
       (postalAddress=${local_part}@${domain})\
     )\
   }{\
     ${lookup ldapm{\
       user="..." pass=... \
       ldap://.../$value?mail?sub?\
     }{$value,}{}}\
   }{}}\
   }{\N[\n;]\N}{,}}
         file_transport          = address_file
         pipe_transport          = address_pipe
         reply_transport         = address_reply
         directory_transport     = delivery_to_virt_domain_by_filter


так вот, при проблемах с получением данных от домен контроллера exim 
вытягивал в одну строку все значение data, потом показывал его клиенту в 
SMTP сессии, а вслед писал, в чем именно проблема (failed to bind the 
LDAP connection to server, Invalid credentials и т. д.)

> Ну а то что у тебя в раутере неск. LDAP заппросов - спецефично точно.

все зависит от сложности инфраструктуры.

> Кстати, а для MySQL такого не проявляется?

гм... как-то я раньше не замечал... но вот сейчас пару лишних символов 
добавли в SQL запрос из роутера, разворачивающего алиасы в адреса, и 
получил в exim -bh:

451-failed to expand "${lookup mysql{ SELECT addressXX FROM aliases WHERE
451-alias="${quote_mysql:${sg{$local_part}{\N\+.*$\N}{}}@$domain}"
451-}{${sg{$value}{\N[\n;]\N}{,}}}{}}": lookup of "SELECT addressXX FROM
451-aliases WHERE alias="corvax на colocall.falbi.kiev.ua" " gave DEFER: MYSQL:
451 query failed: Unknown column 'addressXX' in 'field list'


что-то я не понимаю, как я раньше на это не наступал...

но хоть пароли не засвечены:

451-failed to expand "${lookup mysql{ SELECT address FROM aliases WHERE
451-alias="${quote_mysql:${sg{$local_part}{\N\+.*$\N}{}}@$domain}"
451-}{${sg{$value}{\N[\n;]\N}{,}}}{}}": lookup of "SELECT address FROM 
aliases
451-WHERE alias="corvax на colocall.falbi.kiev.ua" " gave DEFER:
451-MYSQL connection failed: Access denied for user 'exim'@'localhost' 
(using
451 password: YES)

хотя все равно, приятного мало

>> так что моя ситуация достаточно специфичная.
> 
>> хотя с другой стороны, немного непонятно, зачем SMTP клиенту синтаксис
>> неудачно выполненных LDAP запросов. пусть даже без LDAP логинов и паролей.
> 
> Ну с одним запросом у меня просто вываливалось - Temporary internal
> error - че-то типа этого.

возможно дело именно в том, что я все завтра все равно обертываю обычно 
еще в ${sg как минимум

> В логи - еще куда не шло, ну exim -bh (bt), но явно не выплевывать
> подобную инфу наружу первому встречному.

так в логах и дебаговом выводе это все и так видно

>> если есть желание, протолкни patch-src::hide_ldap_pass.patch 
>> разработчикам. мне немного не до этого сейчас.
> 
> Желание есть. Вопрос наличия времени.
> Если разгребусь - попробую на след. неделе сделать.

ok

>>> Tuesday, February 23, 2010, 12:15:19 PM, Victor wrote:
>>>
>>>> приветствую
>>>> на выходных переводил почтовую систему одной компании на хранение 
>>>> учетных записей почтовых пользователей и алиасов в Active Directory.
>>>> и только после окончания переноса я обнаружил, что при проблемах при 
>>>> выполнении ldap запросов к домен контроллеру exim прямо в SMTP сессию 
>>>> вываливает клиенту все выражение, которое не смог проэкспандить, со 
>>>> всеми ldap логинами и паролями.
>>>> в src/deliver.c в функции post_process_one реализована замена в таких 
>>>> ситуациях символов пароля на символ "x".
>>>> но тут есть две проблемы:
>>>> 1. при обработке не всех сообщений, в которых содержатся ошибки с 
>>>> указанием ldap логинов и паролей, задействована функция post_process_one
>>>> из src/deliver.c
>>>> 2. в функции post_process_one из src/deliver.c на "x" заменяются символы
>>>> толко первого пароля. а мне при обработке алиасов пришлось в роутере 
>>>> выполнять четыре ldap запроса.
>>>> т. о. пришлось написать два патча:
>>>> http://mta.org.ua/exim-4.69-conf/patches/exim-4.71-hide_ldap_pass/patch-src::hide_ldap_pass.patch
>>>> http://mta.org.ua/exim-4.69-conf/patches/exim-4.71-hide_ldap_error/patch-src::hide_ldap_error.patch
>>>> в patch-src::hide_ldap_pass.patch реализована замена на "x" символов 
>>>> всех ldap паролей в функции post_process_one из src/deliver.c, а также в
>>>> двух местах в функции route_address из src/route.c.
>>>> в patch-src::hide_ldap_error.patch реализована замена всего сообщения в
>>>> SMTP сессии на "Temporary internal error", т. к. информация о причинах
>>>> ошибки будет помещена в mainlog и rejectlog, а полный текст 
>>>> синтаксической конструкции, которую не удалось вычислить, будет доступен
>>>> в дебаговом выводе exim -bh
>>>
>>>> данные патчи взаимоисключающие. т. е. единовременно можно использовать
>>>> толко один из них.
>>>
>>>> для использования данных патчей модифицирован механизм сборки порта exim
>>>> под FreeBSD:
>>>> http://mta.org.ua/exim-4.69-conf/ports/exim-4.71/
>>>> для сборки exim с atch-src::hide_ldap_pass.patch необходимо в файл 
>>>> ports/exim-4.71/Makefile.local добавить строку
>>>> WITH_HIDE_LDAP_PASS=YES
>>>
>>>> для сборки exim с atch-src::hide_ldap_error.patch необходимо в файл 
>>>> ports/exim-4.71/Makefile.local добавить строку
>>>> WITH_HIDE_LDAP_ERROR=YES
>>>
>>>> для использования данных патчей модифицирован механизм сборки rpm'ов для
>>>> RedHat/CentOS/Fedora:
>>>> http://mta.org.ua/exim-4.69-conf/redhat/exim-4.71-2.corvax/
>>>> для сборки exim с atch-src::hide_ldap_pass.patch необходимо в файл 
>>>> redhat/exim-4.71-2.corvax/Makefile.local добавить строку
>>>> RPMBUILD_OPTIONS+= --with hide_ldap_pass
>>>
>>>> для сборки exim с atch-src::hide_ldap_error.patch необходимо в файл 
>>>> redhat/exim-4.71-2.corvax/Makefile.local добавить строку
>>>> RPMBUILD_OPTIONS+= --with hide_ldap_error
>>>
>>>> сегодня собраны и выложены в yum рипозитарий http://mta.org.ua/updates
>>>> бинарные пакеты для поддерживаемых версий Linux - RHEL4 i386, RHEL4 x64,
>>>> CentOS 5.1, FC6, FC8, FC9.
> 
> 


-- 
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