Назад | Перейти на главную страницу

При использовании LDAP в виртуальной конфигурации Postfix электронные письма возвращаются с пометкой «пользователь неизвестен»

Я занимаюсь этой проблемой в течение нескольких дней и, похоже, исчерпал все способы устранения неполадок, поэтому подумал, что обращусь к сообществу за любой помощью.

Без внедрения OpenLDAP в почтовую инфраструктуру Postfix и Dovecot работали хорошо. В течение последних нескольких дней Postfix MTA был настроен с настройками виртуального LDAP, но сообщения электронной почты показывают статус возврата, хотя Postfix может читать и знать этих реальных пользователей почты, почтовых псевдонимов и виртуальных доменов. Вот соответствующие виртуальные настройки в моем Postfix main.cf.

НОТА: Всего 3 виртуальных конфигурации LDAP

virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 virtual_minimum_uid = 5000 virtual_mailbox_domains = ldap:/etc/postfix/ldap-virtual-domains.cf virtual_mailbox_maps = ldap:/etc/postfix/ldap-vmailbox.cf virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf virtual_mailbox_limit = 512000000 virtual_mailbox_base = /home/vmail transport_maps = hash:/etc/postfix/transport

Вот содержимое каждого виртуального файла LDAP.

ldap-virtual-domains.cf

server_host = ldap://ldap.example.net/ search_base = ou=Domains,dc=example,dc=net version = 3 bind = no query_filter = (&(ObjectClass=dNSDomain)(dc=%s)) result_attribute = dc

ldap-vmailbox.cf

server_host = ldap://ldap.example.net/ search_base = ou=Mail,dc=example,dc=net version = 3 bind = no query_filter = (&(objectclass=inetOrgPerson)(mail=%s)) result_attribute = mail

ldap-aliases.cf

server_host = ldap://ldap.example.net/ search_base = ou=Mail,dc=example,dc=net version = 3 bind = no query_filter = (&(objectclass=inetLocalMailRecipient)(mailLocalAddress=%s)) result_attribute = mail

Проверка того, что Postfix может читать и обрабатывать все 3 виртуальных файла LDAP, прошла успешно

ldap-virtual-domains.cf:

postmap -q example.net ldap:/etc/postfix/ldap-virtual-domains.cf example.net postmap -q example.org ldap:/etc/postfix/ldap-virtual-domains.cf example.org postmap -q example.com ldap:/etc/postfix/ldap-virtual-domains.cf example.com

ldap-vmailbox.cf:

postmap -q user1@example.net ldap:/etc/postfix/ldap-vmailbox.cf user1@example.net postmap -q user2@example.net ldap:/etc/postfix/ldap-vmailbox.cf user2@example.net postmap -q user3@example.net ldap:/etc/postfix/ldap-vmailbox.cf user3@example.net

ldap-aliases.cf:

postmap -q alias1@example.org ldap:/etc/postfix/ldap-aliases.cf user1@example.net postmap -q alias2@example.org ldap:/etc/postfix/ldap-aliases.cf user2@example.net

Вот что я вижу в журналах почты:

Oct 26 16:54:17 example.net postfix/cleanup[2789]: 3D26A105CC: info: header Subject: testing virtual LDAP from [REDACTED]; from=tony@macbook-air.moon to=user1@example.net proto=ESMTP helo=macbook-air.moon
Oct 26 16:54:17 example.net postfix/cleanup[2789]: 3D26A105CC: message-id=20151026235417.139081C7F821@macbook-air.moon
Oct 26 16:54:17 example.net opendkim[11877]: 3D26A105CC: [REDACTED] not internal
Oct 26 16:54:17 example.net opendkim[11877]: 3D26A105CC: not authenticated
Oct 26 16:54:17 example.net opendkim[11877]: 3D26A105CC: no signature data
Oct 26 16:54:17 example.net postfix/qmgr[26221]: 3D26A105CC: from=tony@macbook-air.moon, size=571, nrcpt=1 (queue active)
Oct 26 16:54:17 example.net postfix/smtpd[2461]: disconnect from [REDACTED] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
Oct 26 16:54:17 example.net postfix/pipe[2791]: 3D26A105CC: to=user1@example.net, relay=dovecot, delay=0.12, delays=0.08/0.01/0/0.02, dsn=5.1.1, status=bounced (user unknown)
Oct 26 16:54:17 example.net postfix/cleanup[2789]: 55F2B1080A: message-id=20151026235417.55F2B1080A@mail.example.net
Oct 26 16:54:17 example.net postfix/qmgr[26221]: 55F2B1080A: from=, size=2460, nrcpt=1 (queue active)
Oct 26 16:54:17 example.net postfix/bounce[2793]: 3D26A105CC: sender non-delivery notification: 55F2B1080A
Oct 26 16:54:17 example.net postfix/qmgr[26221]: 3D26A105CC: removed
Oct 26 16:54:17 example.net postfix/smtp[2794]: 55F2B1080A: to=tony@macbook-air.moon, relay=none, delay=0.02, delays=0/0.01/0/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=macbook-air.moon type=A: Host not found)

Действительные почтовые учетные записи, существующие в LDAP, показывают это в журналах: Oct 26 16:56:14 example.net postfix/pipe[3592]: 457871080A: to=vmail@example.net, orig_to=montest@example.net, relay=dovecot, delay=0.03, delays=0.01/0/0/0.02, dsn=5.1.1, status=bounced (user unknown)

vmail@example.net - это настоящий почтовый адрес в LDAP, а montest@example.net - это настоящий псевдоним в LDAP. У Postfix нет проблем с их поиском при проверке с помощью postmap -q.

Вот полный конфиг Postfix:

alias_database = $alias_maps
alias_maps = hash:/etc/postfix/aliases
append_dot_mydomain = no
broken_sasl_auth_clients = yes
command_directory = /usr/bin
compatibility_level = 2
daemon_directory = /usr/lib/postfix/bin
data_directory = /var/lib/postfix
debug_peer_level = 2
debug_peer_list = 127.0.0.1
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
header_checks = regexp:/etc/postfix/header_checks
home_mailbox = Maildir/
html_directory = no
inet_interfaces = all
inet_protocols = ipv4
mail_owner = postfix
mail_spool_directory = /var/spool/mail
mailbox_command = /usr/lib/dovecot/deliver
mailq_path = /usr/bin/mailq
manpage_directory = /usr/share/man
message_size_limit = 20480000
meta_directory = /etc/postfix
milter_default_action = accept
milter_protocol = 2
mydestination =
mydomain = example.net
myhostname = mail.$mydomain
mynetworks = 127.0.0.0/8 10.8.0.0/24 192.168.128.0/17 [SERVER IP REDACTED] [::1]/128 [2600:3c01::]/64 [fe80::]/64
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases
non_smtpd_milters = inet:127.0.0.1:8891
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix
recipient_delimiter = +
sample_directory = /etc/postfix/sample
sendmail_path = /usr/bin/sendmail
setgid_group = postdrop
shlib_directory = /usr/lib/postfix
smtp_tls_mandatory_protocols = !SSLv2,!SSLv3
smtp_tls_note_starttls_offer = yes
smtp_tls_protocols = !SSLv2,!SSLv3
smtp_tls_security_level = may
smtpd_error_sleep_time = 1s
smtpd_hard_error_limit = 20
smtpd_milters = inet:127.0.0.1:8891
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, check_policy_service inet:mail.example.net:12340
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain =
smtpd_soft_error_limit = 10
smtpd_tls_CAfile = /etc/postfix/ssl/PositiveSSL.ca-bundle
smtpd_tls_cert_file = /etc/postfix/ssl/STAR_example_net.crt
smtpd_tls_key_file = /etc/postfix/ssl/key.pem
smtpd_tls_loglevel = 1
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3
smtpd_tls_protocols = !SSLv2,!SSLv3
smtpd_tls_received_header = yes
smtpd_tls_security_level = may
smtpd_tls_session_cache_timeout = 3600s
smtpd_use_tls = yes
tls_random_source = dev:/dev/urandom
transport_maps = hash:/etc/postfix/transport
unknown_local_recipient_reject_code = 550
virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf
virtual_gid_maps = static:5000
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = ldap:/etc/postfix/ldap-virtual-domains.cf
virtual_mailbox_limit = 512000000
virtual_mailbox_maps = ldap:/etc/postfix/ldap-vmailbox.cf
virtual_minimum_uid = 5000
virtual_transport = dovecot
virtual_uid_maps = static:5000

Пример действующего пользователя в LDAP с несколькими псевдонимами

Пользователь LDAP

Кажется, я так близок, но, возможно, другая пара глаз может дать некоторое представление о решении этой проблемы. Любой вклад приветствуется.

ОБНОВЛЕНИЕ 1

Мне удалось решить status=bounced (user unknown) ошибок путем изменения значения virtual_transport в main.cf из

virtual_transport = dovecot

к

virtual_transport = lmtp:unix:private/dovecot-lmtp

В master.cf Я изменил эту строчку

dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

к этой строке

dovecot unix - n n - - pipe flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}

Я добавил нового пользователя в LDAP с именем postmaster@example.net и быстро postmap -q доказывает, что Postfix знает о postmaster@example.net, но затем я вижу эту ошибку.

Oct 26 23:46:46 example.net dovecot: quota-status(postmaster@example.net): Error: User initialization failed: Namespace '': stat(/home/vmail/postmaster/.Maildir) failed: Permission denied (euid=5003() egid=5000(vmail) missing +x perm: /home/vmail, dir owned by 5000:5000 mode=0700) Oct 26 23:46:46 example.net postfix/smtpd[25851]: NOQUEUE: reject: RCPT from[REDACTED]: 450 4.7.1 : Recipient address rejected: Invalid user settings. Refer to server log for more information.; from= to= proto=ESMTP helo=

После небольшого исследования я начал изучать свою конфигурацию LDAP Dovecot, в частности dovecot-ldap.conf.ext

hosts = ldap.example.net auth_bind = no ldap_version = 3 base = ou=Mail,dc=example,dc=net deref = never scope = subtree user_attrs = uidNumber=uid,gidNumber=gid,mailHomeDirectory=home,quotaBytes=quota_rule=*:bytes=%$ user_filter = (&(objectclass=inetOrgPerson)(mail=%u)) pass_attrs = mail=user,userPassword=password pass_filter = (&(objectClass=posixAccount)(uid=%u)) default_pass_scheme = SSHA

Я больше не вижу user unknown в журналах почты, но я вижу неудачные попытки входа в систему. Точно не знаю, но думаю, это могло быть из-за user_attrs или любые другие атрибуты LDAP из моего dovecot-ldap.conf.ext.

Oct 27 00:01:19 example.net dovecot: imap-login: Disconnected (auth failed, 1 attempts in 2 secs): user=<vmail@example.net>, method=PLAIN, rip=192.168.176.128, lip=192.168.176.128, TLS: Disconnected, session=<w/r1pBAj0YjAqLCA>

ОБНОВЛЕНИЕ 2

Я создал учетную запись администратора в OpenLDAP под названием Dovecot и дал ей read доступ с этой линии

by dn="uid=dovecot,ou=System,dc=example,dc=net" read

Dovecot теперь успешно читает атрибут userPassword. Вот как dovecot-ldap.conf.ext похоже с включенной привязкой.

hosts = ldap.example.net auth_bind = yes auth_bind_userdn = uid=%u,ou=Mail,dc=example,dc=net dn = uid=dovecot,ou=System,dc=example,dc=net dnpass = password ldap_version = 3 base = ou=Mail,dc=example,dc=net deref = never scope = subtree user_filter = (&(objectclass=inetOrgPerson)(mail=%u)) pass_filter = (&(objectclass=inetOrgPerson)(mail=%u)) default_pass_scheme = SSHA user_attrs = uidNumber=uid,gidNumber=gid,mailHomeDirectory=,quotaBytes=quota_rule=*:bytes=%$ pass_attrs = mail=uid,userPassword=password

При попытке войти в учетную запись vmail я вижу, что Dovecot не может найти пользователя из userdb

Oct 27 20:42:47 example.net dovecot: auth: Error: ldap(vmail,192.168.176.128,<8C7h/CEjo5DAqLCA>): user not found from userdb Oct 27 20:42:47 example.net dovecot: imap: Error: Authenticated user not found from userdb, auth lookup id=4111597569 (client-pid=26724 client-id=1) Oct 27 20:42:47 example.net dovecot: imap-login: Internal login failure (pid=26724 id=1) (internal failure, 1 successful auths): user=<vmail>, method=PLAIN, rip=192.168.176.128, lip=192.168.176.128, mpid=26726, secured, session=<8C7h/CEjo5DAqLCA>

Если я изменю user_filter атрибут к строке ниже I жестяная банка войти успешно.

user_filter = (&(objectClass=posixAccount)(uid=%u))

Но затем сообщения снова начинают возвращаться.

Oct 27 20:46:09 example.net postfix/smtp[27702]: ECA4F10848: to=<tony@macbook-air.moon>, relay=none, delay=0.16, delays=0.01/0.01/0.14/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=macbook-air.moon type=A: Host not found)

Oct 27 20:46:08 example.net postfix/lmtp[27698]: E0994102FA: to=<tony@example.net>, relay=example.net[private/dovecot-lmtp], delay=0.06, delays=0.05/0.01/0/0, dsn=5.1.1, status=bounced (host mail.example.net[private/dovecot-lmtp] said: 550 5.1.1 <tony@example.net> User doesn't exist: tony@example.net (in reply to RCPT TO command))

На данный момент я думаю, что проблема может заключаться в пользователях и фильтрах, но я больше не знаю. Это текущая конфигурация Dovecot от dovecot -n и часть LDAP Dovecot: http://ix.io/lEE

Я надеюсь, что все это может дать подсказки относительно того, что может быть упущено или испорчено, чтобы пользовательский вход и отправка / получение почты прошли успешно.

pass_attrs = mail=user,userPassword=password

наверное не так. Это означает «использовать почту в качестве имени пользователя, имя атрибута ldap и пароль пользователя в качестве имени атрибута пароля».

Я считаю, что это следует читать:

pass_attrs = mail=uid,userPassword=password

Вы можете проверить это, посмотрев журналы OpenLDAP.

Я также с подозрением отношусь к:

user_attrs = mailHomeDirectory=home

потому что есть семантическое противоречие. Атрибут LDAP home используется для домашнего каталога Unix, но теперь он используется как расположение maildir. Не могли бы вы это дважды проверить?

Это было решено. В dovecot-ldap.conf.ext Я поменял следующие фильтры.

user_attrs = user_filter = (&(objectclass=inetOrgPerson)(uid=%n)(mailEnabled=TRUE))

Используется для поиска по dn

pass_attrs = mail=user,userPassword=password pass_filter = (&(objectclass=inetOrgPerson)(uid=%n))

Полный конфиг dovecot-ldap.conf.ext

hosts = ldap.example.net auth_bind = yes dn = uid=dovecot,ou=System,dc=example,dc=net dnpass = PASS ldap_version = 3 base = ou=Mail,dc=example,dc=net deref = never scope = subtree default_pass_scheme = SSHA user_attrs = user_filter = (&(objectclass=inetOrgPerson)(uid=%n)) pass_attrs = mail=user,userPassword=password pass_filter = (&(objectclass=inetOrgPerson)(uid=%n))

Мне также пришлось обновить mail_location в /etc/dovecot/conf.d/10-mail.conf к

mail_location = maildir:%Lh/Maildir/:INDEX=%Lh/Maildir/

Окончательные проверки разрешений

  • проверено /home/vmail/* имеет соответствующие права пользователя / группы как vmail:vmail
  • проверенные uidNumber и gidNumber - 5000

Агент местной доставки Dovecot теперь может обрабатывать электронные письма и сохранять их в /home/vmail/user@domain каталоги.