Для хранения виртуальных доменов, ящиков, алиасов используется древовидная структура в LDAP:
o=p
ou=Domains,o=p
dc=local,ou=Domains,o=p
dc=test,dc=local,ou=Domains,o=p
для домена test.local и mail=example@test.local,dc=test,dc=local,ou=Domains,o=p
для почтового ящика example@test.local. Таким образом, если у нас 100500 разных доменов, то такая структура уменьшает объёмы повторяющейся информации.
Чтобы запросить нужную информацию, надо сформировать соответствующий запрос. Для exim он выглядит примерно так, скажем, если ищем local_domains
:
LDAP_AUTH = user="uid=exim,ou=S,o=p" pass="123"
LDAP_URL = ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock
DOMAIN_IN_DC = ${sg{$domain}{[.]}{,dc=}}
LDAP_BASE = dc=DOMAIN_IN_DC,ou=Domains,o=p
LDAP_QUERY_DOMAINS = dc?base?(&(objectClass=mailDomain)(accountStatus=active))
domainlist local_domains = @ : ${lookup ldap {LDAP_AUTH LDAP_URL/LDAP_BASE?LDAP_QUERY_DOMAINS}{$domain}fail}
Основное тут следующее: в макросе DOMAIN_IN_DC мы test.local приводим к виду test,dc=local
, затем, LDAP_BASE возвращает dc=test,dc=local,ou=Domains,o=p
и мы ищем нужные данные в ветке, зависящей от домена.
Решил посмотреть, что на эту тему есть у postfix и не нашёл ничего интересного. Т.е., да, postfix умеет искать в LDAP, но делает это примитивно, в расчёте на то, что все домены представляют собой плоский список, а поскольку я не создаю для записи dc=test,dc=local,ou=Domains,o=p
атрибута типа virtDomain со значением test.local, т.к. не вижу смысла дублировать уже имеющуюся информацию, то получается, что в древовидной схеме постфикс не найдёт доменов.
Вопросы: это неизлечимый дефект в дизайне постфикса? Если излечимый, то как его можно поправить? Написать отдельный аутентификатор, который это умеет? Написать отдельный демон, который будет сам общаться с LDAP и отдавать postfix результаты поиска?