LINUX.ORG.RU
ФорумAdmin

[mail] Dovecot-lda и структура LDAP


0

1

Здравствуйте.

Сперва некоторые пояснения. Используется postfix+openldap+dovecot и виртуальные пользователи.

Организована такая структура каталога LDAP, что возможен такой результат запроса:

# extended LDIF
#
# LDAPv3
# base <ou=Mail, dc=ph, dc=local> with scope subtree
# filter: (&(mail=someuser@p.ru)(|(AccountStatus=active)(accountStatus=shared)))
# requesting: mailMessageStore 
#
dn: cn=lala,ou=Mail,dc=ph,dc=local
mailMessageStore: /var/mail/someuser/Maildir/

# Eset, Mail, ph.local
dn: cn=Eset,ou=Mail,dc=ph,dc=local

# admins, Mail, ph.local
dn: cn=admins,ou=Mail,dc=ph,dc=local

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3

Что это означает? А означает следующее: dn «cn=Eset,ou=Mail,dc=ph,dc=local» и «cn=admins,ou=Mail,dc=ph,dc=local» — аккаунты, не хранящие ничего локально и являющиеся, по сути, списками рассылки. Соответственно, если послать письмо на адрес-алиас mailAlternateAddress такой рассылки, то оно будет разослано всем, кто указан в поле mail. Очень удобно. В данном конкретном случае, такое письмо попадёт к «dn: cn=lala,ou=Mail,dc=ph,dc=local», где и будет благополучно засунуто в mailMessageStore.

Разумеется, прямые письма к «dn: cn=lala,ou=Mail,dc=ph,dc=local» будут сразу ему доставлены локально.

Кроме того, некоторые пользователи электронной почтой не имеют почтовых адресов, совпадающих с их uid. Вообще никаких: ни mail, ни mailAlternateAddress.

Вся эта конструкция замечательно работала и работает, если использовать в postfix

virtual_transport = virtual

Захотелось, чтобы dovecot, кроме простой раздачи писем по IMAP, просеивал письма через sieve, следил за квотами и т.д. Соответственно, приходится настраивать dovecot-lda.

Соединение между dovecot и postfix настроено нормально, в целом всё прекрасно, за исключением вот таких, описанных выше случаев.

В main.cf:

dovecot_destination_recipient_limit = 1
virtual_transport = dovecot
#virtual_transport = virtual

В master.cf :

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}
Сперва вместо recipient стояло user, но, поскольку, как уже было сказано, некоторые пользователи не имеют почтовых адресов, совпадающих с их uid, пришлось исправить это на recipient.

Соответствующее место в dovecot-ldap.conf:

user_filter = (&(objectClass=qmailUser)(|(AccountStatus=active)(accountStatus=shared))(|(mail=%u)(mailAlternateAddress=%u)))
pass_filter = (&(objectClass=qmailUser)(|(AccountStatus=active)(accountStatus=shared))(|(mail=%u)(mailAlternateAddress=%u)))
user_attrs = mailMessageStore=home
pass_attrs = uid=user,userPassword=password

Посылаю письмо указанному в самом начале someuser:

mutt -s "test $(date +%d/%m/%Y:%H.%M)" -- someuser@p.ru < /dev/null
и в логе получаю:
dovecot: lda: Debug: Module loaded: /usr/lib64/dovecot/lib90_sieve_plugin.so
dovecot: auth: Debug: master in: USER#0111#011someuser@p.ru#011service=lda
dovecot: auth: Debug: ldap(someuser@p.ru): user search: base=ou=Mail, dc=ph, dc=local scope=subtree filter=(&(objectClass=qmailUser)(|(AccountStatus=active)(accountStatus=shared))(|(mail=someuser@p.ru)(mailAlternateAddress=someuser@p.ru))) fields=mailMessageStore
dovecot: auth: Debug: ldap(someuser@p.ru): result: mailMessageStore(home)=/var/mail/someuser/Maildir/
dovecot: auth: Error: ldap(someuser@p.ru): user_filter matched multiple objects, aborting
dovecot: auth: Debug: master out: FAIL#0111
dovecot: lda: Error: user someuser@p.ru: Auth USER lookup failed
dovecot: lda: Debug: auth input: 
dovecot: lda: Fatal: Internal error occurred. Refer to server log for more information.
postfix/pipe[3259]: 89001846: to=<someuser@p.ru>, relay=dovecot, delay=0.15, delays=0.07/0.01/0/0.07, dsn=4.3.0, status=deferred (temporary failure)

Эта ситуация меня безмерно огорчает.

Вопрос: возможно ли заставить postfix через ${user} в master.cf передавать на dovecot-lda найденный postix'ом же uid, который будет искаться в LDAP для конкретного письма, а не тупо браться из адреса назначения, как вот тут: dovecot-ldap.conf

user_filter = %u %n %d
master.cf
dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${user}
и результат посылки письма:
dovecot: auth: Debug: ldap(someuser): user search: base=ou=Mail, dc=ph, dc=local scope=subtree filter=someuser someuser  fields=mailMessageStore
(см. на текст после filter=) ? Т.е., чтобы вместо someuser было написано login, взятое из uid.

Ответ на: комментарий от markevichus

Не используется. Всё в LDAP. :)

Собственно, ругань идёт, когда фильтр выдаёт не одну, а несколько записей. И даже mailMessageStore вытаскивается правильно, а потом — ошибка.

Если бы можно было как-то игнорировать её или задавать в deliver ключ -f так, чтобы он однозначно определял соответствие.

HolyBoy ()
Ответ на: комментарий от HolyBoy

может поможет другой способ доставки через lmtp (dovecot 2.x)?

Atlant ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.