Добрый день, предлагаю вашему вниманию мои соображения по поводу не совсем "чистой" обработки query_filter в postfix table lookup механизме.
я оформил свои "иследования" для postfix-users@postfix.org.К несчастью ничего интереного моя переписка с англоязычными колегами мне не принесла, поэтому решил искать правды у своих :)
[Описание] систуация следующего характера:
нужно распределить доступ между пользователями домена vtg.com.ua, на тех кто может посылать почту за его пределы и тех кто может пользоватся почтой только в его пределах.
[Решение] smtpd_restriction_classes = local, remote local = check_recipient_access pcre:/usr/local/etc/postfix/maps/local remote = check_recipient_access pcre:/usr/local/etc/postfix/maps/remote
/usr/local/etc/postfix/maps/local has: /vtg.com.ua/ OK /.*/ REJECT local account
/usr/local/etc/postfix/maps/remote has: /.*/ OK
smtpd_recipient_restrictions = check_sender_access ldap:/usr/local/etc/postfix/sender.cf, local, reject
where /usr/local/etc/postfix/sender.cf has search_base = cn=remote, ou=groups, dc=vtg query_filter = member=uid=%u result_attribute = cn
формат записи в ldap базе: member=uid=<username1> member=uid=<username2> member=uid=<username3> cn=remote
идея заключается в следующем: username part of email address, которому разрешено посылать почту во внешний мир хранится в ветке cn=remote,ou=groups,dc=vtg, при уcпешном поиске должно вернутся поле cn, которое содержит описанный выше класс remote
[Проблема] Проблема заключается в следующем механизме обработки поиска, пример из лог файла:
dict_ldap_lookup: Searching with filter member=uid=strait dict_ldap_lookup: Search returned nothing dict_ldap_lookup: Searching with filter member=uid=it.vtg dict_ldap_lookup: Search returned nothing dict_ldap_lookup: Searching with filter member=uid=vtg (1) dict_ldap_lookup: Search returned remote
как видите поиск происходит не только по %u как указано в query_filter = member=uid=%u а по всем словам встречающимся в адресе
поскольку у меня существует пользователь vtg@vtg.com.ua, находящийся в групе доступа (member=uid=vtg), срабатывает поиск в последней строке (1) в результате чего ВСЕ письма будут отправлятся наружу независимо от наличия/отсутсвия пользователя в списке доступа.
между прочим, команда postmap работает коректно: при условии что username находится в списке разрешенных, команда postmap -q username@domain.vtg ldap:/usr/local/etc/postfix/sender.cf возвращает remote, если отсутсвует nothing.
более детальный просмотр с ключем -v показывает только один поиск с query_filter = member=uid=username, а не 3 как в логе работы smtpd
[Выводы] мне кажется что метод проверки адреса реализованный в smtpd/smtpd_check.c function check_mail_access не соответсвует идеологии использования ключей %[usd] для определения query_filter, возможно имеет смысл пересмотреть эту механику.
метод используемый в postmap мне кажется более прозрачным с точки зрения идеологии.