Переменные и домены

Переменные и домены

Моя система устроена следующим образом.

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 — это одно и то же.

Томас

Связанный контент