Автор Тема: Postfix + ldap  (Прочитано 40862 раз)

cosmostools

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Postfix + ldap
« : 31 Октябрь 2018, 15:38:41 »
Всем привет, долгое время пытаюсь подружить ldap и  Postfix , все безуспешно.
О проделанной работе в крацие:
1. Установлен ldap на отдельной виртуальной машине, так же установлен на эту же машину ldap account manager  (lam), все работает, ssh авторизация на данной машине тоже реализована;
2. На другой машине установлены : dovecot , Postfix (проверена, pam авторизация по локальным паролям работает), письма приходят, уходят, все норм;
3. На той же машине где dovecot и postfix установлен ldap, для связи с первой машиной, подключен ldap с помощью файла dovecot-ldap.conf.ext
Вот схема:
base = dc=ldaptest,dc=com

deref = never
scope = subtree

user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid
user_filter = (&(objectClass=posixAccount)(uid=%u))
pass_attrs = uid=user,userPassword=password
pass_filter = (&(objectClass=posixAccount)(uid=%u))
default_pass_scheme = CRYPT

Пробую авторизоваться в thunderbird , заходит, единственно приходится в /home создавать папку mail/ с рекурсивными  правами 755. Если не дашь права не авторизуется. Это тоже хотелось бы решить.
Далее пробую отправлять письмо, молчит. письма не приходят или не отправляются.

Пробую прописать в postfix  схемы:
postconf -e 'virtual_mailbox_base = /home/mail'
postconf -e 'virtual_mailbox_domains = ldap:/etc/postfix/ldap_virtual_domains_maps.cf'
postconf -e 'virtual_mailbox_maps = ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf'
postconf -e 'virtual_alias_maps = ldap:/etc/postfix/ldap_virtual_alias_maps.cf'
postconf -e 'smtpd_sender_login_maps = ldap:/etc/postfix/ldap_logins.cf'


ldap_logins.cf
# адрес LDAP-сервера
server_host = ldap://ldap_server_ip/
# где искать людей
search_base = ou=admin,dc=ldaptest,dc=com
# версия протокола
version = 3
# какие записи отфильтровывать
# брать только тех, у кого создан почтовый аккаунт
query_filter = (&(objectClass=gosaMailAccount)(|(mail=%s)(gosaMailAlternateAddress=%s)))
# требуемый атрибут
result_attribute = mail
# DN-запись для подключения к LDAP
bind_dn = cn=admin,dc=ldaptest,dc=com
bind_pw = 0000

и все в таком роде... есть умельцы, кто может подсказать по связке!?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #1 : 04 Ноябрь 2018, 09:10:20 »
Здравствуйте! Короткого ответа у меня нет, и вот почему.

Существует несколько способов настройки почтовой системы, в частности, связки Postfix+dovecot, так чтобы они получали информацию о пользователях (адресах)/паролях в каталаге LDAP. Так, Postfix (реализует SMTP) может как требовать аутентификацию пользователя перед отправкой почты, так и не требовать её, заниматься локальной доставкой почты (то есть складывать письма непосредственно в почтовые ящики пользователей) либо самостоятельно, либо делегировать локальную доставку стороннему процессу, например, одному из модулей dovecot. dovecot, в свою очередь, кроме прямых функций (реализация POP3 и IMAP), может выступать транспортом доставки почты, источником проверки аутентификации для других процессов (того же Postfix). Плюс к тому, важнейшую роль играет то, отображаются ли LDAP-учётки в локальные учётки пользователей, либо это только "виртуальные" записи для функционирования почтовой системы. В общем, этап проектирования, как и всегда, имеет важнейшее значение, но документации по dovecot, на мой взгляд, довольно путанная, составить по ней общую картину непросто.

В простейшем случае (LDAP-учётки каким-либо образом отображаются в локальные учётки пользователей, SMTP и IMAP используют одну и ту же базу пользователей, для SMTP не нужна аутентификация) возможен такой сценарий:
1. dovecot берёт аутентификацию (passdb) из PAM (которая уже настроена на использование LDAP), базу пользователей (userdb) из NSS (которая также настроена на получение учёток из LDAP), поэтому дополнительных LDAP-настроек в самом dovecot не требуется. Плюс к тому, неплохая практика заключается в том, чтобы не привязываться к домашним директориям пользователей, а хранить почту отдельно. Выглядеть это будет примерно так:

passdb {
    driver = pam
}

userdb {
    driver = passwd
    override_fields = uid=vmail gid=vmail home=/var/mail/%d/%n mail=maildir:/var/mail/%d/%n
}

2. В dovecot настраивается модуль LMTP (local mail transport), который позволяет осуществлять доставку (раскладывание) почты по тем же каталогам, что указаны базе пользователей (userdb). Выглядит это так:

protocols = imap lmtp

service lmtp {
    user = vmail
    unix_listener /var/spool/postfix/private/dovecot-lmtp {
user = postfix
group = postfix
mode = 0600
    }
}

3. В Postfix в качестве базы пользователей указывается тa же NSS (которая, как мы помним, берёт учётки из LDAP), а в качестве локального транспорта указывается dovecot-lmtp. Примерный кусок main.cf:

mydestination = mycompany.ru, mail.mycompany.ru, localhost

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

local_recipient_maps = proxy:unix:passwd.byname $alias_maps

mailbox_transport = lmtp:unix:private/dovecot-lmtp

Остальные настройки dovecot.conf и main.cf уже на Ваше усмотрение.

Немногим сложнее дело будет, если учётки в LDAP чисто виртуальные и не привязаны к локальным учёткам сервера через PAM+NSS. Изменятся настройки passdb и userdb (как раз будут указываться настройки подключения к серверу LDAP, фильтры, поля и т.д.), желательно также переопределить местонахождение почтовых каталогов. В Postfix нужно будет настраивать виртуальную доставку (virtual_mailbox_domains), а в качестве агента виртуальной доставки (virtual_transport) указать сервис dovecot-lmtp. Примерно так:
virtual_mailbox_domains = mycompany.ru
virtual_transport = lmtp:unix:private/dovecot-lmtp

В общих чертах так. Надеюсь, это наведёт Вас на правильное решение.

Егор


« Последнее редактирование: 06 Ноябрь 2018, 12:28:58 от egor »

cosmostools

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #2 : 05 Ноябрь 2018, 10:47:01 »
Все это хорошо и здорово, но мне как раз нужна настройка схемы ldap в связки с potfix.
Скину свою схему в dovecot  у меня вот что :

hosts = [ip-ldap-server]

dn = cn=admin,dc=ldaptest,dc=com

# Password for LDAP server, if dn is specified.
dnpass = secret

ldap_version = 3

base = dc=ldaptest,dc=com
deref = never
scope = subtree

user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid
user_filter = (&(objectClass=posixAccount)(uid=%u))

pass_attrs = uid=user,userPassword=password
pass_filter = (&(objectClass=posixAccount)(uid=%u))

default_pass_scheme = CRYPT


ip-ldap-server - у каждого свой сервак, или это локально расположенный ldap-server;
dnpass = secret - указываем свой пароль;

В postfix вот что:

home_mailbox = /home/mail/
virtual_mailbox_domains = hash:/etc/postfix/ldap_virtual_domains_maps.cf
virtual_mailbox_base = /home/mail/
virtual_mailbox_maps = hash:/etc/postfix/ldap_virtual_mailbox_maps.cf
virtual_transport = dovecot
virtual_alias_maps = hash:/etc/postfix/ldap_virtual_alias_maps.cf

transport_maps = hash:/etc/postfix/transport_map
smtpd_sender_login_maps = ldap:/etc/postfix/ldap_logins.cf

Не стал скидывать весь конфиг, так как все остальное работает с pam.
Вот что в файлах:
ldap_logins.cf

# адрес LDAP-сервера
server_host = ldap://[ip-ldap-server]/
# где искать людей
search_base = ou=People,dc=ldaptest,dc=com
# версия протокола
version = 3
# какие записи отфильтровывать
# брать только тех, у кого создан почтовый акаунт
query_filter = (&(objectClass=gosaMailAccount)(|(mail=%s)(gosaMailAlternateAddress=%s)))
# требуемый атрибут
result_attribute = mail
# DN-запись для подключения к LDAP
bind_dn = cn=admin,dc=ldaptest,dc=com
bind_pw = secret

ldap_virtual_alias_maps.cf
# адрес LDAP-сервера
server_host = ldap://[ip-ldap-server]/
# где искать людей
search_base = ou=People,dc=ldaptest,dc=com
# версия протокола
version = 3
# какие записи отфильтровывать
# брать только тех, у кого создан почтовый акаунт
query_filter = (&(objectClass=person)(mail=%s))
# требуемый атрибут
result_attribute = uid
# DN-запись для подключения к LDAP
bind_dn = cn=admin,dc=ldaptest,dc=com
bind_pw = secret

ldap_virtual_domains_maps.cf
# адрес LDAP-сервера
server_host = ldap://[ip-ldap-server]/
# где искать людей
search_base = ou=People,dc=ldaptest,dc=com
# версия протокола
version = 3
# какие записи отфильтровывать
# брать только тех, у кого создан почтовый акаунт
query_filter = (&(objectClass=person)(mail=%s))
# требуемый атрибут - мы забираем список доменов
result_attribute = uid
# DN-запись для подключения к LDAP
bind_dn = cn=admin,dc=ldaptest,dc=com
bind_pw = secret

ldap_virtual_mailbox_maps.cf 
# адрес LDAP-сервера
server_host = ldap://[ip-ldap-server]/
# где искать людей
search_base = ou=People,dc=ldaptest,dc=com
# версия протокола
version = 3
# какие записи отфильтровывать
# брать только тех, у кого создан почтовый акаунт
query_filter = (&(objectClass=person)(mail=%s))
# требуемый атрибут - мы забираем mail и gosaMailForwardingAddress
result_attribute = uid
# DN-запись для подключения к LDAP
bind_dn = cn=admin,dc=ldaptest,dc=com
bind_pw = secret

В принципе все построено по одинаковым схемам и должно работать.
Прошу натолкнуть на решение проблемы или указать явные ошибки, спасибо!

cosmostools

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #3 : 05 Ноябрь 2018, 10:48:25 »
Кстати забыл указать что ко всем вышеуказанным файлам нужно применить postmap что бы появились сходные файлы с раширением db

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #4 : 06 Ноябрь 2018, 14:02:07 »
Здравствуйте! Надеюсь, Вы внимательно прочитали мой предыдущий пост и сознательно выбираете сложный путь, то есть хотите настроить полноценную доставку почты средствами postfix и подстроить под неё dovecot. Шурупы можно забивать и молотком, но шуруповёртом, IMHO, всё же сподручнее. Тем не менее, можно сделать и по-сложному.

И ещё пара замечаний, прежде чем мы приступим к настройкам.
1. Не сочтите за занудство, но без понимания того, как работают программы, то есть без чтения документации к ним, настроить их грамотно не получится. А судя по той каше в настройках, которые Вы приводите, понимания нет. Применительно к postfix и нашему случаю, нужно, как минимум, разобраться с работой виртуального транспорта, картами postfix вообще и LDAP-картами, а о конкретных параметрах настройки почитать в соответствующих man-страницах postconf(5) и ldap_table(5). Поверьте мне, даже если удастся что-то по быстрому запустить по какому-нибудь HOWTO, Вы всё равно в будущем будете спотыкаться на каждом шагу, и рано или поздно читать документацию всё-равно придётся.

2. Не нужно пытаться настроить всё сразу. Разбейте задачу на части, и пока не добьётесь правильной работы одной из них, не переходите к следующим. Так значительно проще искать ошибки.

В целом задача для нашего сложного случая будет сформулирована так. Есть каталог, в котором хранятся записи пользователей, в том числе их учётные данные (логин и пароль) и адрес электронной почты, например, такая:

dn: uid=ivan,ou=Users,dc=mycompany,dc=ru
objectClass: inetOrgPerson
cn: Ivan Ivanov
sn: Ivanov
uid: ivan
userPassword: 123
mail: ivan@mycompany.ru

При получении запроса на отправку письма, если Postfix определит, что именно он отвечает за доставку письма в почтовый ящик пользователя, он, средствами одного из своих транстпортов (в данном случае virtual), обратится к каталогу (согласно настроек LDAP-карты), чтобы определить валидность адреса и место доставки, и собственно, выполнит доставку в почтовый ящик. В свою очередь, dovecot, при получении запроса от клиента, произведёт аутентификацию пользователя по учётным данным из каталога, определит на основании содержимого записи каталога, соответствующей этим учётным данным, местонахождение почтового ящика пользователя, и вернёт клиенту содержимое этого ящика.

Предлагаю начать с доставки почты виртуальным транспортом Postfix. Я поставил себе на ноутбук postfix, мой файл main.conf сейчас выглядит так:

### Настройки виртуальных пользователей ###
# домены, рассылка на которые будет обрабатываться транспортом virual
virtual_mailbox_domains = mycompany.ru
# транспорт по умолчанию
virtual_transport = virtual
# путь к корневой папке, где будут находится почта всех виртуальных пользователей
virtual_mailbox_base = /var/mail
# вся почта виртуальных пользователей будет принадлежать одному системному пользователю
# (например, mail), с uid=8 и gid=12
virtual_uid_maps = static:8
virtual_gid_maps = static:12
virtual_minimum_uid = 8

# место (относительно virtual_mailbox_base), куда будет складываться почта
# определяется из LDAP-карты
virtual_mailbox_maps = ldap:/etc/postfix/ldap_mailboxes.cf

Надеюсь, из комментариев всё понятно. Тут используются две статические карты (virtual_uid_maps и virtual_gid_maps) и одна LDAP-карта (virtual_mailbox_maps), вынесенная в отдельный файл (хотя, строго говоря, можно было и не выносить). Сама LDAP-карта выглядит так:

# настройки подключения к серверу, анонимный запрос
timeout = 10
server_host = ldap://127.0.0.1:389

# настройки поиска записи пользователя: от указанной базовой записи
search_base = ou=Users,dc=mycompany,dc=ru
# отбираются записи с объектным классом inetOrgPerson и тем адресом почты,
# который поступил в запросе
query_filter = (&(objectClass=inetOrgPerson)(mail=%s))

# место (относительно virtual_mailbox_base), куда будет складываться почта
# берётся из значения атрибута uid найденной записи
result_attribute = uid

# шаблон для результата, к значению атрибута uid добавляется слеш,
# чтобы формат почтового ящика был maildir (директория с письмами в отдельных файлах),
# а не mailbox (все письма в одном файле)
result_format = %s/

LDAP-карты НЕ НУЖНО переконвертировать postmap-ом, это точно.

Можно проверить работу карты с помощью postmap -q:

$ postmap -q ivan@mycompany.ru ldap:/etc/postfix/ldap_mailboxes.cf
ivan/

После перезапуска postfix я попробовал отправить почту на адрес ivan@mycompany.ru, файл с письмом успешно лёг в каталог /var/mail/ivan/new/ . В данном случае /var/mail взят из значения параметра virtual_mailbox_base, а ivan -- из значения атрибута uid записи пользователя. Файлы и подкаталоги принадлежат системному пользователю mail и его группе mail (значения параметров virtual_uid_maps и virtual_gid_maps). Всё просто и логично.

Если Вы этого добьётесь, можно переходить к настройке почтовых псевдонимов, аутентификации и т.п., а потом и к настройкам dovecot.

Егор.
« Последнее редактирование: 06 Ноябрь 2018, 14:04:39 от egor »

cosmostools

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #5 : 06 Ноябрь 2018, 16:23:02 »
вот мой конфиг postfix
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

readme_directory = no

compatibility_level = 2

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_security_level = may

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth


smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = mail.post.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, post.com, other.com,  mail.post.com, mail.other.com,  localhost.post.com, localhost
#relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.*.0/24
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all


home_mailbox = /home/mail/
mailbox_command =

virtual_mailbox_domains = ldap:/etc/postfix/ldap_virtual_domains_maps.cf
virtual_mailbox_base = /home/mail/
virtual_mailbox_maps = ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf

virtual_uid_maps = static:10003
virtual_gid_maps = static:10000
virtual_minimum_uid = 10000

virtual_transport = virtual

Вот так переделал файл со схемой подключения к ldap
# адрес LDAP-сервера
server_host = ldap://192.168.*.*:389
# где искать людей
search_base = ou=People,dc=ldaptest,dc=com
# версия протокола
version = 3
# какие записи отфильтровывать
# брать только тех, у кого создан почтовый акаунт
query_filter = (&(objectClass=inetOrgPerson)(mail=%s))
# требуемый атрибут - мы забираем список доменов
result_attribute = uid

Пробуем команду
postmap -q new@post.com ldap:/etc/postfix/ldap_virtual_domains_maps.cf
Пусто, ничего не происходит, не показывает каталог пользователя

Вот вывод команды ldapsearch
ldapsearch -hip -x -D "cn=admin,dc=ldaptest,dc=com" -W
где ip - адрес сервера ldap
команда отрабатывает (обращаю внимания сервер ldap и почтовик находятся на разных виртуалках, имеют разные ip адреса, ну так если что )
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <dc=ldaptest,dc=com> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# ldaptest.com
dn: dc=ldaptest,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: ldaptest.com
dc: ldaptest

# admin, ldaptest.com
dn: cn=admin,dc=ldaptest,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: e1NTSEF9T2pqdnpmYTRVNWk0cmF2K1BsSHRxTWxyWnEwMnJ6dzM=

# users, ldaptest.com
dn: ou=users,dc=ldaptest,dc=com
ou: users
objectClass: organizationalUnit
objectClass: top

# People, ldaptest.com
dn: ou=People,dc=ldaptest,dc=com
objectClass: organizationalUnit
ou: People

# group, ldaptest.com
dn: ou=group,dc=ldaptest,dc=com
objectClass: organizationalUnit
ou: group

# users, group, ldaptest.com
dn: cn=users,ou=group,dc=ldaptest,dc=com
objectClass: posixGroup
gidNumber: 10000
cn: users


# new, People, ldaptest.com
dn: cn=new,ou=People,dc=ldaptest,dc=com
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
uid: new
cn: new
uidNumber: 10003
gidNumber: 10000
sn: new
userPassword:: e1NTSEF9TjBxMUJISlBBY3d1WXRIcjQrT2Z5cUVHWEcxVFZXdzI=
homeDirectory: /home/mail/new


Что делать?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #6 : 07 Ноябрь 2018, 03:07:36 »
Ладно, начнём по порядку.

1. У Вас есть анонимный доступ к каталогу? Запрос
ldapsearch -x -H ldap://192.168.*.*:389 -b  ou=People,dc=ldaptest,dc=comчто-нибудь возвращает? Если нет, то в настройках LDAP-карты нужно указать то же имя и пароль, которые Вы указываете в ldapsearch при подключении (параметры LDAP-карты bind_dn и bind_pw).

2. В записи пользователя нет адреса электронной почты, соответственно, Ваша  LDAP-карта не сработает в любом случае. Фактически, когда Вы выполняете команду
postmap -q new@post.com ldap:/etc/postfix/ldap_virtual_mailbox_maps.cfпроисходит такой запрос в каталог:
ldapsearch -x -H ldap://192.168.*.*:389 -b  ou=People,dc=ldaptest,dc=com '(&(objectClass=inetOrgPerson)(mail=new@post.com))' uidПоскольку записи, в которой есть атрибут mail со значением new@post.com, в каталоге нет, то запрос с таким фильтром ничего не вернёт, соответственно, ничего не вернёт и LDAP-карта.

То есть нужно, чтобы в записи пользователя в каталоге присутствовал его адрес электронной почты в атрибуте mail:
dn: cn=new,ou=People,dc=ldaptest,dc=com
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
uid: new
cn: new
uidNumber: 10003
gidNumber: 10000
sn: new
userPassword:: e1NTSEF9TjBxMUJISlBBY3d1WXRIcjQrT2Z5cUVHWEcxVFZXdzI=
homeDirectory: /home/mail/new
mail: new@post.com

3. В параметре virtual_mailbox_domains LDAP-карта (да и любая друга карта) вообще не нужна. В этом параметре перечисляются домены, при отправке почты на которые будет срабатывать транспорт virtual. Просто укажите:
virtual_mailbox_domains = post.comСоответственно, post.com (и другие домены, на которые должен срабатывать транспорт virtual) НУЖНО УДАЛИТЬ из списка доменов в параметре mydestination (на этот список срабатывает транспорт local). Об этом, кстати, сказано в документации, которую Вы не желаете читать.

4. Если оставить карту ldap_virtual_mailbox_maps.cf как сейчас, то почта для адреса new@post.com будет складываться В ФАЙЛ /home/mail/new , где каталог /home/mail берётся из параметра virtual_mailbox_base, а имя файла new берётся из значения атрибута uid записи пользователя в каталоге. По умолчанию Postfix использует формат почтового ящика mailbox, то есть вся почта складывается в один файл (дописываться в конец этого файла). Я не уверен, что с таким форматом почтового ящика работает протокол IMAP, поэтому всегда  предпочтительнее использовать формат ящика maildir, то есть каталог с подкаталогами, куда письма будут помещаться каждое в отдельный файл. Чтобы postfix работал с таким форматом ящика, нужно в конце пути к этому ящику добавить слеш, то есть чтобы получилось /home/mail/new/. Для этого в моей LDAP-карте (в предыдущем посте) я использовал параметр result_format:
result_format = %s/
5. Я бы ещё поудалял лишнюю ерунду типа home_mailbox и mailbox_command. Если Вы не знаете, что конкретно делают параметры, их лучше не указывать -- замучитесь искать баги.

Егор
« Последнее редактирование: 07 Ноябрь 2018, 03:11:58 от egor »

cosmostools

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #7 : 08 Ноябрь 2018, 10:59:37 »
Все верно это ничего не показывает (заместо * вбил свою подсеть и сеть. )
ldapsearch -x -H ldap://192.168.*.*:389 -b  ou=People,dc=ldaptest,dc=com '(&(objectClass=inetOrgPerson)(mail=new@post.com))' uid

Вернул dovecot pam  авторизацию  в клиенте не удалось подключиться к почте.

А вот текущие настройки postfix :

append_dot_mydomain = no
biff = no
compatibility_level = 2
content_filter = scan:127.0.0.1:10026
inet_interfaces = all
inet_protocols = all
mailbox_size_limit = 0
mydestination =
myhostname = mail.post.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.*.0/24
myorigin = /etc/mailname
readme_directory = no
receive_override_options = no_address_mappings
recipient_delimiter = +
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_sasl_type = dovecot
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
virtual_gid_maps = static:10000
virtual_mailbox_base = /home/mail/
virtual_mailbox_domains = post.com
virtual_mailbox_maps = ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf
virtual_minimum_uid = 10000
virtual_transport = virtual
virtual_uid_maps = static:10003


Файл настроек подключения к ldap ldap_virtual_mailbox_maps.cf:

# адрес LDAP-сервера
server_host = ldap://[ldap-server]:389
# где искать людей
search_base = ou=People,dc=ldaptest,dc=com
# версия протокола
version = 3
# какие записи отфильтровывать
# брать только тех, у кого создан почтовый акаунт
query_filter = (&(objectClass=inetOrgPerson)(mail=%s))
# требуемый атрибут - мы забираем mail и gosaMailForwardingAddress
result_attribute = uid
result_format = %s/

Подключился к клиенту. Пробую отправлять другому пользователю, выскакивает ошибка :

"Ошибка отправления почты. Почтовый сервер ответил: 
5.1.1 <new@post.com>: Recipient address rejected: User unknown in virtual mailbox table.
 Проверьте правильность написания адреса получателя «new@post.com» и попробуйте снова."


egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #8 : 08 Ноябрь 2018, 12:18:27 »
Какую ошибку выдаёт запрос
ldapsearch -xLLL -H ldap://192.168.*.*:389 -b  ou=People,dc=ldaptest,dc=com '(&(objectClass=inetOrgPerson)(mail=new@post.com))' uid
?

Что выдаёт запрос
ldapsearch -xLLL -H ldap://192.168.*.*:389 -b  ou=People,dc=ldaptest,dc=com '(&(objectClass=inetOrgPerson)(uid=new))'?

Покажите, пожалуйста, вывод этих команд.

Егор

cosmostools

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #9 : 08 Ноябрь 2018, 13:37:20 »
 ldapsearch -xLLL -H ldap://192.168.*.*:389 -b  ou=People,dc=ldaptest,dc=com '(&(objectClass=inetOrgPerson)(uid=new))'

dn: cn=new,ou=People,dc=ldaptest,dc=com
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
uid: new
cn: new
uidNumber: 10003
gidNumber: 10000
sn: new
homeDirectory: /home/mail/new

ldapsearch -xLLL -H ldap://192.168.*.*:389 -b  ou=People,dc=ldaptest,dc=com '(&(objectClass=inetOrgPerson)(mail=new@post.com))' uid
ничего не показыает

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #10 : 08 Ноябрь 2018, 13:50:05 »
Как я писал выше, Вам нужно в запись cn=new,ou=People,dc=ldaptest,dc=com добавить атрибут mail со значением new@post.com. Через ldap account manager или сделать такой файл modify_user.ldif:
dn: cn=new,ou=People,dc=ldaptest,dc=com
changetype: modify
add: mail
mail: new@post.com

и применить его из командной строки:
ldapmodify -x -H ldap://192.168.*.*:389 -D "cn=admin,dc=ldaptest,dc=com" -W -f ./modify_user.ldifЕсли не будет ошибок, попробуйте ещё раз выполнить
ldapsearch -xLLL -H ldap://192.168.*.*:389 -b  ou=People,dc=ldaptest,dc=com '(&(objectClass=inetOrgPerson)(mail=new@post.com))'
Егор

cosmostools

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #11 : 08 Ноябрь 2018, 14:31:13 »
Ошибок нет, после ldapsearch выдало

dn: cn=new,ou=People,dc=ldaptest,dc=com
uid: new

cosmostools

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #12 : 08 Ноябрь 2018, 14:32:41 »
Попробовал отправить письмо ошибок тоже не выдало, во входящих ничего, не туда кидает входящие?
попробовал отправить с другого аккаунта (test3@post.com) вышла та же ошибка что и выше
"
Ошибка отправления почты. Почтовый сервер ответил: 
5.1.1 <test3@post.com>: Recipient address rejected: User unknown in virtual mailbox table.
 Проверьте правильность написания адреса получателя «test3@post.com» и попробуйте снова.
"

cosmostools

  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #13 : 08 Ноябрь 2018, 14:42:58 »
вывод не той команды сделал, вот что вывело:
ldapsearch -xLLL -H ldap://192.168.*.*:389 -b  ou=People,dc=ldaptest,dc=com '(&(objectClass=inetOrgPerson)(mail=new@post.com))'

dn: cn=new,ou=People,dc=ldaptest,dc=com
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
uid: new
cn: new
uidNumber: 10003
gidNumber: 10000
sn: new
homeDirectory: /home/mail/new
mail: new@post.com


egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Postfix + ldap
« Ответ #14 : 09 Ноябрь 2018, 06:52:06 »
Ошибок нет, после ldapsearch выдало

dn: cn=new,ou=People,dc=ldaptest,dc=com
uid: new

Хорошо, протестируйте работу LDAP-карты, что выведет команда:
postmap -q new@post.com ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf
Попробовал отправить письмо ошибок тоже не выдало, во входящих ничего, не туда кидает входящие?
Чтобы что-то было во входящих, нужно чтобы dovecot понимал, откуда эти входящие забирать. Вы же пошли по сложному пути, поэтому нужно настраивать отдельно postfix, отдельно dovecot, причём оба они должны использовать одни и те же пути к почтовым ящикам. Пока мы разбирается ТОЛЬКО с postfix. В каталоге /home/mail/ появился каталог new с подкаталогами? Покажите вывод команды
ls -Rl /home/mail

попробовал отправить с другого аккаунта (test3@post.com) вышла та же ошибка что и выше
"
Ошибка отправления почты. Почтовый сервер ответил: 
5.1.1 <test3@post.com>: Recipient address rejected: User unknown in virtual mailbox table.
 Проверьте правильность написания адреса получателя «test3@post.com» и попробуйте снова.
"
У Вас в каталоге есть запись, в которой атрибут mail имеет значение test3@post.com ? Если нет, то, конечно, получатель письма будет не опознан, об это вам и говорит ошибка User unknown in virtual mailbox table. Здесь нет никакой уличной магии: происходит запрос в каталог согласно настройкам Вашей LDAP-карты, в каталоге ищутся все записи, лежащие внутри подкаталога ou=People,dc=ldaptest,dc=com и удовлетворяющие условию фильтра, в котором шаблон %s заменяется на адрес электронной почты ПОЛУЧАТЕЛЯ сообщения, в данном случае test3@post.com. В результате такой подстановки фильтр принимает вид (&(objectClass=inetOrgPerson)(mail=test3@post.com)). В этом фильтра два условия отбора (во внутренних скобках) объединены логическим И (знак &), то есть должны быть выполнены оба условия сразу. В первом условии требуется, чтобы в записи был объектный класс inetOrgPerson, во втором -- чтобы в этой же записи был атрибут mail со значением test3@post.com. Если оба этих условия выполняются, то запись в каталоге будет найдена, LDAP-карта вернёт значение и postfix будет считать, что виртуальный получатель сообщения существует и попробует доставить ему почту. Если запись в каталоге, удовлетворяющая условиям фильтра, найдена не будет, то postfix будет считать, что виртуального получателя сообщения не существует и выдаст ошибку. Вывод: для КАЖДОГО получателя нужно заводить отдельную запись в каталоге с разными значениями атрибутов mail и uid. Для получателя test3@post.comдолжна быть примерно такая запись:
dn: cn=test3,ou=People,dc=ldaptest,dc=com
objectClass: inetOrgPerson
cn: test3
sn: test3
mail: test3@post.com
uid: test3

Егор