Моя система устроена следующим образом.
smtp --> postfix --> dovecot (через LMTP) --> почтовый ящик
Сложность в том, что аутентификация выполняется по протоколу LDAP.
Типичная запись LDAP выглядит так:
CN=Jon Doe
uid=jond
[email protected]
Теперь происходит следующее: postfix отправляет почту в dovecot. Dovecot выполняет поиск в userdb, но на основе адреса получателя, который является "[email protected]".
Таким образом, LDAP ищет (uid=%u), который затем ([email protected]).
Postfix отправляет это через виртуальный стек, поэтому виртуальная часть настроена следующим образом:
virtual_alias_maps = ldap:/etc/postfix/ldap/ldap-aliases.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /
virtual_mailbox_domains = ldap:/etc/postfix/ldap/virtual_domains.cf
virtual_mailbox_maps = ldap:/etc/postfix/ldap/ldap-accounts.cf
virtual_minimum_uid = 5000
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_uid_maps = static:5000
Я ожидал, что postfix использует virtual_mailbox_maps для поиска пользователя и передачи этого пользователя в LMTP, чтобы dovecot мог выполнить поиск userdb. Поскольку postfix не знает, как это сделать, и я не нашел параметра virtual_map*, который мог бы это сделать, я не знаю, какой будет правильная процедура.
Должен ли postfix искать пользователя через LDAP и отправлять его в LMTP? Или LMTP должен делать поиск на основе адреса электронной почты получателя?
EDIT: Я должен добавить, что часть IMAP в dovecot работает нормально, когда я подключаюсь к почтовому клиенту для получения почты. Он правильно ищет все на основе моего имени входа, которое является uid. Это, конечно, возможно, поскольку когда я вхожу в IMAP, я передаю свой uid, поэтому его легко использовать для dovecot.
Мне как-то нужно сказать dovecot, чтобы он делал это по-другому, когда его использует postfix...
/etc/dovecot/dovecot-ldap.conf.ext
hosts = localhost
dn = cn=linagent,ou=people,dc=example,dc=org
dnpass = SECRET
tls = no
auth_bind = yes
base = dc=example,dc=org
deref = never
scope = subtree
user_attrs = \
=home=%{ldap:homeDirectory}, \
=uid=5000, \
=gid=5000, \
=mail=maildir:%{ldap:mailMessageStore}
user_filter = (&(objectClass=inetOrgPerson)(uid=%u))
pass_attrs = uid=user,userPassword=password
pass_filter = (&(objectClass=inetOrgPerson)(uid=%u))
решение1
Я не знаю, должно ли так быть, но я изменил конфигурацию ldap в dovecot следующим образом:
user_filter = (&(objectClass=inetOrgPerson)(|(uid=%u)(mail=%u)))
pass_filter = (&(objectClass=inetOrgPerson)(|(uid=%u)(mail=%u)))
Часть, где uid=%u, мне нужна для аутентификации из почтового клиента, поскольку почтовый клиент входит в систему через UID (имя пользователя).
Часть, где mail=%u мне нужна для получения LMTP от postfix, а postfix просто знает почту получателя.
Поскольку uid никогда не является почтовым адресом, я думаю, что это решение будет работать и не будет создавать никаких конфликтов. Это также имеет смысл для меня, но мне интересно, почему Courier мог бы справиться с этим более элегантно.
Но я не буду решать этот вопрос, так как считаю, что это не так, как задумано.
решение2
Разве вы не могли использовать переменную %n вместо %u?
Проверьте это:https://wiki.dovecot.org/Переменные
А это выдержка изhttps://wiki2.dovecot.org/AuthDatabase/LDAP/Userdb
Переменные и домены
Имена пользователей и домены можно различать с помощью переменных %n и %d. Они разделяют предыдущее имя пользователя по символу "@". Предыдущее имя пользователя:
- Для LMTP это будет user@hostname, где hostname зависит, например, от конфигурации Postfix. -Для IMAP это будет то, что база данных паролей назначила в качестве имени пользователя. Если база данных паролей (LDAP) имеет "user_attrs = =user=%n", то доменная часть имени входа будет удалена базой данных паролей. UserDB не увидит никакой доменной части, т. е. %n и %u для UserDB — это одно и то же.
Томас