моя система настроена следующим образом.
smtp -> postfix -> dovecot (через LMTP) -> почтовый ящик
Сложная часть состоит в том, что аутентификация против LDAP.
Типичная запись LDAP выглядит так:
CN=Jon Doe
uid=jond
mail=jonny@example.com
Теперь происходит то, что postfix отправляет почту в dovecot. Dovecot выполняет поиск в пользовательской базе данных, но на основе адреса электронной почты назначения, который является « jonny@example.com ».
Таким образом, LDAP ищет (uid =% u), который затем ( uid=jonny@example.com ).
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 должен выполнить поиск на основе адреса электронной почты получателя?
РЕДАКТИРОВАТЬ: Я должен добавить, что часть 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))
Не могли бы вы использовать переменную% n вместо% u?
Проверьте это: https://wiki.dovecot.org/Variables
А это отрывок из https://wiki2.dovecot.org/AuthDatabase/LDAP/Userdb
Переменные и домены
Имена пользователей и домены можно отличить с помощью переменных% n и% d. Они разделяют предыдущее имя пользователя на символ «@». Предыдущее имя пользователя:
- Для LMTP это будет user @ hostname, где имя хоста зависит, например, от конфигурация Postfix. - Для IMAP это будет то, что база данных паролей обозначила в качестве имени пользователя. Если в базе данных паролей (LDAP) указано «user_attrs = = user =% n», то доменная часть имени входа будет удалена базой паролей. UserDB не увидит никакой части домена, т.е.% n и% u - это то же самое для UserDB.
Thomas
Я не знаю, должно ли это быть так, но я изменил конфигурацию 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 может справиться с этим более элегантно.
Я не буду разрешать этот вопрос, так как считаю, что это не тот способ, который был разработан.