Добрый день, предлагаю вашему вниманию мои соображения по поводу не совсем "чистой" обработки 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)
как видите поиск происходит не только по %u как указано в query_filter =
member=uid=%u а по всем словам встречающимся в адресе
поскольку у меня существует пользователь vtg@vtg.com.ua, находящийся в
групе доступа (member=uid=vtg), срабатывает поиск в последней строке (1)
dict_ldap_lookup: Search returned remote
в результате чего ВСЕ письма будут отправлятся наружу независимо от
наличия/отсутсвия пользователя в списке доступа.
между прочим, команда 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 мне кажется более прозрачным с точки зрения
идеологии.