Форум проекта Pro-LDAP.ru
Общие вопросы по LDAP => Общий раздел => Тема начата: cosmostools от 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
и все в таком роде... есть умельцы, кто может подсказать по связке!?
-
Здравствуйте! Короткого ответа у меня нет, и вот почему.
Существует несколько способов настройки почтовой системы, в частности, связки Postfix+dovecot, так чтобы они получали информацию о пользователях (адресах)/паролях в каталаге LDAP. Так, Postfix (реализует SMTP) может как требовать аутентификацию пользователя перед отправкой почты, так и не требовать её, заниматься локальной доставкой почты (то есть складывать письма непосредственно в почтовые ящики пользователей) либо самостоятельно, либо делегировать локальную доставку стороннему процессу, например, одному из модулей dovecot. dovecot, в свою очередь, кроме прямых функций (реализация POP3 и IMAP), может выступать транспортом доставки почты, источником проверки аутентификации для других процессов (того же Postfix). Плюс к тому, важнейшую роль играет то, отображаются ли LDAP-учётки в локальные учётки пользователей (https://pro-ldap.ru/forum/index.php?topic=55.0), либо это только "виртуальные" записи для функционирования почтовой системы. В общем, этап проектирования, как и всегда, имеет важнейшее значение, но документации по 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
В общих чертах так. Надеюсь, это наведёт Вас на правильное решение.
Егор
-
Все это хорошо и здорово, но мне как раз нужна настройка схемы 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
В принципе все построено по одинаковым схемам и должно работать.
Прошу натолкнуть на решение проблемы или указать явные ошибки, спасибо!
-
Кстати забыл указать что ко всем вышеуказанным файлам нужно применить postmap что бы появились сходные файлы с раширением db
-
Здравствуйте! Надеюсь, Вы внимательно прочитали мой предыдущий пост и сознательно выбираете сложный путь, то есть хотите настроить полноценную доставку почты средствами postfix и подстроить под неё dovecot. Шурупы можно забивать и молотком, но шуруповёртом, IMHO, всё же сподручнее. Тем не менее, можно сделать и по-сложному.
И ещё пара замечаний, прежде чем мы приступим к настройкам.
1. Не сочтите за занудство, но без понимания того, как работают программы, то есть без чтения документации к ним, настроить их грамотно не получится. А судя по той каше в настройках, которые Вы приводите, понимания нет. Применительно к postfix и нашему случаю, нужно, как минимум, разобраться с работой виртуального транспорта (http://www.postfix.org/VIRTUAL_README.html), картами postfix вообще (http://www.postfix.org/DATABASE_README.html) и LDAP-картами (http://www.postfix.org/LDAP_README.html), а о конкретных параметрах настройки почитать в соответствующих man-страницах postconf(5) (http://www.postfix.org/postconf.5.html) и ldap_table(5) (http://www.postfix.org/ldap_table.5.html). Поверьте мне, даже если удастся что-то по быстрому запустить по какому-нибудь 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.
Егор.
-
вот мой конфиг 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
Что делать?
-
Ладно, начнём по порядку.
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). Об этом, кстати, сказано в документации (http://www.postfix.org/VIRTUAL_README.html), которую Вы не желаете читать.
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-карте (в предыдущем посте (https://pro-ldap.ru/forum/index.php?topic=928.msg1901#msg1901)) я использовал параметр result_format:
result_format = %s/
5. Я бы ещё поудалял лишнюю ерунду типа home_mailbox и mailbox_command. Если Вы не знаете, что конкретно делают параметры, их лучше не указывать -- замучитесь искать баги.
Егор
-
Все верно это ничего не показывает (заместо * вбил свою подсеть и сеть. )
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» и попробуйте снова."
-
Какую ошибку выдаёт запрос
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))'
?
Покажите, пожалуйста, вывод этих команд.
Егор
-
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
ничего не показыает
-
Как я писал выше (https://pro-ldap.ru/forum/index.php?topic=928.msg1903#msg1903), Вам нужно в запись 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))'
Егор
-
Ошибок нет, после ldapsearch выдало
dn: cn=new,ou=People,dc=ldaptest,dc=com
uid: new
-
Попробовал отправить письмо ошибок тоже не выдало, во входящих ничего, не туда кидает входящие?
попробовал отправить с другого аккаунта (test3@post.com) вышла та же ошибка что и выше
"
Ошибка отправления почты. Почтовый сервер ответил:
5.1.1 <test3@post.com>: Recipient address rejected: User unknown in virtual mailbox table.
Проверьте правильность написания адреса получателя «test3@post.com» и попробуйте снова.
"
-
вывод не той команды сделал, вот что вывело:
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
-
Ошибок нет, после 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
Егор
-
postmap -q test3@post.com ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf
test3/
postmap -q new@post.com ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf
new/
.:
итого 8
drwx------ 3 10003 10000 4096 ноя 9 07:35 new
drwx------ 3 10002 10000 4096 ноя 9 07:36 test3
./new:
итого 4
drwx------ 6 10003 10000 4096 ноя 9 10:07 Maildir
./new/Maildir:
итого 36
drwx------ 2 10003 10000 4096 ноя 9 07:35 cur
-rw------- 1 10003 10000 392 ноя 9 07:36 dovecot.index.log
-rw------- 1 10003 10000 24 ноя 9 10:07 dovecot.mailbox.log
-rw------- 1 10003 10000 51 ноя 9 07:36 dovecot-uidlist
-rw------- 1 10003 10000 8 ноя 9 10:07 dovecot-uidvalidity
-r--r--r-- 1 10003 10000 0 ноя 9 07:35 dovecot-uidvalidity.5be50eae
drwx------ 2 10003 10000 4096 ноя 9 07:35 new
drwx------ 5 10003 10000 4096 ноя 9 10:08 Sent
-rw------- 1 10003 10000 5 ноя 9 10:07 subscriptions
drwx------ 2 10003 10000 4096 ноя 9 07:35 tmp
./new/Maildir/cur:
итого 0
./new/Maildir/new:
итого 0
./new/Maildir/Sent:
итого 24
drwx------ 2 10003 10000 4096 ноя 9 10:07 cur
-rw------- 1 10003 10000 1440 ноя 9 10:08 dovecot.index.cache
-rw------- 1 10003 10000 680 ноя 9 10:08 dovecot.index.log
-rw------- 1 10003 10000 96 ноя 9 10:07 dovecot-uidlist
drwx------ 2 10003 10000 4096 ноя 9 10:07 new
drwx------ 2 10003 10000 4096 ноя 9 10:07 tmp
./new/Maildir/Sent/cur:
итого 4
-rw------- 1 10003 10000 377 ноя 9 10:07 1541747269.M997263P21816.mail,S=377,W=391:2,S
./new/Maildir/Sent/new:
итого 0
./new/Maildir/Sent/tmp:
итого 0
./new/Maildir/tmp:
итого 0
./test3:
итого 4
drwx------ 6 10002 10000 4096 ноя 9 07:38 Maildir
./test3/Maildir:
итого 36
drwx------ 2 10002 10000 4096 ноя 9 07:36 cur
-rw------- 1 10002 10000 392 ноя 9 07:38 dovecot.index.log
-rw------- 1 10002 10000 24 ноя 9 07:36 dovecot.mailbox.log
-rw------- 1 10002 10000 51 ноя 9 07:38 dovecot-uidlist
-rw------- 1 10002 10000 8 ноя 9 07:36 dovecot-uidvalidity
-r--r--r-- 1 10002 10000 0 ноя 9 07:36 dovecot-uidvalidity.5be50ecf
drwx------ 2 10002 10000 4096 ноя 9 07:36 new
drwx------ 5 10002 10000 4096 ноя 9 10:08 Sent
-rw------- 1 10002 10000 5 ноя 9 07:36 subscriptions
drwx------ 2 10002 10000 4096 ноя 9 07:36 tmp
./test3/Maildir/cur:
итого 0
./test3/Maildir/new:
итого 0
./test3/Maildir/Sent:
итого 24
drwx------ 2 10002 10000 4096 ноя 9 10:07 cur
-rw------- 1 10002 10000 1844 ноя 9 10:07 dovecot.index.cache
-rw------- 1 10002 10000 976 ноя 9 10:08 dovecot.index.log
-rw------- 1 10002 10000 141 ноя 9 10:07 dovecot-uidlist
drwx------ 2 10002 10000 4096 ноя 9 07:36 new
drwx------ 2 10002 10000 4096 ноя 9 10:07 tmp
./test3/Maildir/Sent/cur:
итого 8
-rw------- 1 10002 10000 380 ноя 9 07:36 1541738210.M598020P20493.mail,S=380,W=393:2,S
-rw------- 1 10002 10000 378 ноя 9 10:07 1541747276.M750096P20563.mail,S=378,W=392:2,S
./test3/Maildir/Sent/new:
итого 0
./test3/Maildir/Sent/tmp:
итого 0
./test3/Maildir/tmp:
итого 0
-
в общем с такими настройками:
virtual_uid_maps = static:10003
virtual_gid_maps = static:10000
virtual_minimum_uid = 10000
только на new приходят письма
как сделать, например, что бы от new на test3 приходило?
-
Параметр virtual_uid_maps содержит идентификатор пользователя, от имени которого мы будем записывать сообщения, virtual_gid_maps делает тоже самое, но для группы. Если их несколько можно перечислить их через запятую.
Пробовал делать так:
virtual_uid_maps = static:10001, static:1002, static:1003
virtual_gid_maps = static:10001, static:1002, static:1003
virtual_minimum_uid = 10000
Все равно будет приходить только одному, кто первый казан по uid
-
Наконец-то дошли руки до Вашей проблемы. С правами пользователей как раз всё очевидно. Электронная почта -- это не только правильная маршрутизация сообщений между серверами, но и вполне конкретные директории и файлы в файловой системе сервера. И если у postfix или dovecot нет прав на чтение/запись этих директорий и файлов, то никакой почты рассылаться/доставляться не будет просто потому, что программа не сможет поместить сообщение в файл в почтовой директории. postfix и dovecot -- очень гибкие в плане настроек программы и, в принципе, можно добиться, чтобы каждая из них по отдельности корректно соблюдала права каждого почтового пользователя, но зачем? Обычно поступают одним из двух путей: либо всю работу с файловой системой (доставкой почты в почтовые ящики и последующую работу с этими ящиками) перекладывают на плечи dovecot, а точнее, его сервиса lmtp (о чём я пытался сказать в своём самом первом посте (https://pro-ldap.ru/forum/index.php?topic=928.msg1897#msg1897) в этой теме), либо всю работу с файловой системой осуществляют от имени одного и того же пользователя, мне в этом отношении нравится системный пользователь mail (uid -- 8, gid -- 8 ), но подойдёт и совершенно любой пользователь с правами на запись в корневую почтовую директорию. Второй путь -- стандартный для публичных почтовых сервисов, типа mail.ru: не будут же, честное слово, для каждого из миллионов почтовых ящиков заводить учётку с отдельными правами.
Ладно, перейдём к делу. Я собрал связку postfix и dovecot на своём ноутбуке с минимальными настройками (без tls и аутентификации SMTP), и с привязкой к каталогу по Вашему образцу:
dn: dc=ldaptest,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: ldaptest.com
dc: ldaptest
# 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: newPassword
homeDirectory: /home/mail/new
mail: new@post.com
dn: cn=test3,ou=People,dc=ldaptest,dc=com
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
loginShell: /bin/bash
uid: test3
cn: test3
uidNumber: 10002
gidNumber: 10000
sn: test3
userPassword: test3Password
homeDirectory: /home/mail/test3
mail: test3@post.com
Для работы с почтовыми директориями и файлами я специально завёл фиктивного пользователя virtual-mail (uid -- 999, gid -- 999). Директория /home/mail принадлежит этому пользователю.
Настройки postfix: минимальный файл /etc/postfix/main.cf:
mynetworks = 127.0.0.0/8
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
virtual_mailbox_domains = post.com
virtual_transport = virtual
virtual_mailbox_base = /home/mail/
virtual_mailbox_maps = ldap:/etc/postfix/ldap_virtual_mailbox_maps.cf
virtual_uid_maps = static:999
virtual_gid_maps = static:999
virtual_minimum_uid = 999
Файл /etc/postfix/ldap_virtual_mailbox_maps.cf:
server_host = ldap://127.0.0.1:389
search_base = ou=People,dc=ldaptest,dc=com
version = 3
query_filter = (&(objectClass=inetOrgPerson)(mail=%s))
result_attribute = uid
result_format = %s/
Настройки dovecot: чуть более развёрнутый (для дебага) файл /etc/dovecot/dovecot.conf:
log_path = /var/log/dovecot.log
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_debug = yes
auth_debug = yes
auth_verbose = yes
ssl = no
protocols = imap
namespace inbox {
inbox = yes
location =
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Junk {
auto = no
special_use = \Junk
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox "Sent Messages" {
auto = no
special_use = \Sent
}
mailbox Trash {
auto = subscribe
special_use = \Trash
}
prefix =
}
mail_uid = 999
first_valid_uid = 999
last_valid_uid = 999
mail_gid = 999
first_valid_gid = 999
last_valid_gid = 999
passdb {
driver = ldap
args = /etc/dovecot/dovecot-ldap-bind-auth.conf
}
userdb {
driver = static
args = uid=999 gid=999 home=/home/mail/%n mail=maildir:/home/mail/%n
}
Файл с настройками аутентификации через каталог LDAP /etc/dovecot/dovecot-ldap-bind-auth.conf:
hosts = 127.0.0.1:389
ldap_version = 3
base = ou=People,dc=ldaptest,dc=com
auth_bind = yes
pass_attrs = uid=user
pass_filter = (&(objectClass=inetOrgPerson)(uid=%n))
С такими настройками thunderbird принимает и отправляет почту для пользователей new@post.com и test3@post.com, проходит аутентификацию по протоколу IMAP с паролем из каталога и без проблем работает с файловой системой. Правда, капризничает при первоначальной настройке, если не созданы каталоги /home/mail/new и /home/mail/test3, но это решается путём отправки первого тестового письма этим пользователям.
На этот минимальный костяк уже можно наращивать дополнительные навороты по своему вкусу.
Егор
-
Еще раз спасибо за развернутый ответ.
Но у меня снова проблемы.
Старался все делать как вы изложили. Ранее проходила авторизация в thunderbird по логину и паролю, сейчас и этого нет((
cat /var/log/dovecot.log
auth: Fatal: ldap uid=10000 gid=10000 home=/home/mail/%n mail=maildir:/home/mail/%n: Can't open configuration file uid=10000 gid=10000 home=/home/mail/%n mail=maildir:/home/mail/%n: No such file or directory
папки с пользаками там есть:
ls /home/mail/
new test2 test3
Вывод dovecot-ldap.conf.ext
hosts = 192.168.*.*
ldap_version = 3
base = dc=ldaptest,dc=com
deref = never
scope = subtree
pass_attrs = uid=user,userPassword=password
pass_filter = (&(objectClass=inetOrgPerson)(uid=%u))
Далее делаю
mail_uid = 10000
first_valid_uid = 10000
last_valid_uid = 10010
mail_gid = 10000
first_valid_gid = 10000
last_valid_gid = 10010
и
userdb {
driver = ldap
args = uid=10000 gid=10000 home=/home/mail/%n mail=maildir:/home/mail/%n
}
passdb {
driver = ldap
args = /etc/dovecot/dovecot-ldap.conf.ext
}
В Postfix:
virtual_alias_domains = post.com
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:10000
ldap_virtual_mailbox_maps.cf :
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
result_format = %s/
-
Вместо
userdb {
driver = ldap
args = uid=10000 gid=10000 home=/home/mail/%n mail=maildir:/home/mail/%n
}
Укажите
userdb {
driver = static
args = uid=10000 gid=10000 home=/home/mail/%n mail=maildir:/home/mail/%n
}
Егор
-
Действительно, не внимательно прочитал. Dovecot пропустил
Но...
Вот ошибки от dovecot:
imap(new): Error: opendir(/home/mail/new) failed: Permission denied (euid=10000(<unknown>) egid=10000(<unknown>) missing +r perm: /home/mail/new, dir owned by 0:0 mode=0777
Смотрю в /home/mail/ у mail/ права 777 владелец root группа root, у вложенных файлов, например у new права 755 владелец 10003 группа 10000, у других так же только меняется владелец соответственно.
Пробую менять chmod 755 -R mail/ входящие письма появляются, но ошибка сохраняется:
imap(new): Error: file_dotlock_create(/home/mail/new/dovecot-uidlist) failed: Permission denied (euid=10000(<unknown>) egid=10000(<unknown>) missing +w perm: /home/mail/new, dir owned by 10003:10000 mode=0755)
и снова эта ошибка от postfix:
mail postfix/submission/smtpd[6943]: NOQUEUE: reject: RCPT from unknown[192.168.*.*]: 550 5.1.1 <test3@post.com>: Recipient address rejected: User unknown in virtual alias table; from=<new@post.com> to=<test3@post.com> proto=ESMTP helo=<[192.168.*.*]>
Это есть:
mail new@post.com
-
Наверное, лучше всего просто очистить папку /home/mail (чтобы избавиться от последствий предыдущих экспериментов), поменять ей владельца на 10000:10000
rm -r /home/mail/*
chown 10000:10000 /home/mail
chmod 770 /home/mail
и начать эксперимент заново.
Можно попробовать установить корректные права на уже существующие файлы:
chown -R 10000:10000 /home/mail
chmod -R 770 /home/mail
find /home/mail -type f -exec chmod 660 {} \;
find /home/mail -type d -exec chmod 770 {} \;
Лучше завести пользователя с uid 10000 и gid 10000 -- просто чтобы dovecot не ругался на его отсутствие.
и снова эта ошибка от postfix:
mail postfix/submission/smtpd[6943]: NOQUEUE: reject: RCPT from unknown[192.168.*.*]: 550 5.1.1 <test3@post.com>: Recipient address rejected: User unknown in virtual alias table; from=<new@post.com> to=<test3@post.com> proto=ESMTP helo=<[192.168.*.*]>
В main.cf уберите
virtual_alias_domains = post.com
В записи пользовталя test3 в каталоге есть атрибут mail со значением test3@post.com? Покажите вывод команды
ldapsearch -xLLL -b ou=People,dc=ldaptest,dc=com '(uid=test3)'
Егор
-
Благодаря тебе все получилось !!!
Спасибо за труды и за то что терпел меня)
Теперь буду ковырять как настроить в ldap разные домены и фильтры содержимого в dovecot и postfix ...
Если есть желание помочь буду только рад)
-
Рад, что у Вас всё получилось.
Теперь буду ковырять как настроить в ldap разные домены и фильтры содержимого в dovecot и postfix ...
Если есть желание помочь буду только рад)
Фильтры содержимого настраивать не приходилось. Если такое вообще возможно, попробуем разобраться. Пишите.
Егор
-
А приходилось ли делать несколько доменов на одном серваке?
-
А приходилось ли делать несколько доменов на одном серваке?
Это несложно, нужно указать дополнительные домены в virtual_mailbox_domains файла main.cf:
virtual_mailbox_domains = post.com, mail.org, mycompany.ru
и продумать систему хранения почты в файловой системе сервера. Допустим, в корневой почтовой директории создать директории с доменами:
/home/mail/post.com/
/home/mail/mail.org/
/home/mail/mycompany.ru/
и организовать доставку писем для почтовых ящиков определённого домена в папку этого домена. Например, письмо для new@post.com будет доставляться в папку /home/mail/pots.com/new/, а письмо для адресата ivan@mycompany.ru -- в папку /home/mail/mycompany.ru/ivan/ . Надеюсь, идея понятна.
Для такой системы хранения почтовых сообщений в LDAP-карте postfix указывается такое значение параметра result_format:
result_format = %d/%s/
а в dovecot.conf заменить настройку userdb на:
userdb {
driver = static
args = uid=10000 gid=10000 home=/home/mail/%d/%n mail=maildir:/home/mail/%d/%n
}
Решение, на мой вкус, вполне симпатичное. Само собой, можно настроить под Ваши нужды.
Егор
-
Мне тут пояснили что это должно выглядеть не так...
в ldap есть дерево
DN: dc=ldaptest,dc=com
Далее есть
DN: cn=admin,dc=ldaptest,dc=com
Надо создать как бы поддомен на основе текущего дерева, т.е. есть дерево
Ты говорил с человеком об этом тут https://pro-ldap.ru/forum/index.php?topic=63.0 (https://pro-ldap.ru/forum/index.php?topic=63.0)
Замысел наверное такой
-
Я имел ввиду настройку почтовой системы (postfix+dovecot). Как будут представлены данные в каталоге (так называемая "структура каталога") -- это отдельная тема. Но какая бы не была эта самая структура, настройки программ (тех же postfix и dovecot) можно под неё адаптировать в любом случае.
Егор
-
как же быть с поддоменами в ldap?
-
Вы планируете использовать каталог только для организации почтовой системы, или для чего-то ещё?
-
Пока еще не ясно. Возможно в перспективе будет организовано в виде схемы разделения организации по подразделениям, а так же доступ к данным по samba (где-то эту тему я видел).
Там было организовано по такому принципу https://www.ibm.com/support/knowledgecenter/en/SSDV85_4.1.0/Admin/tasks/installingldap_server_existing.html (https://www.ibm.com/support/knowledgecenter/en/SSDV85_4.1.0/Admin/tasks/installingldap_server_existing.html)
-
В общем сделал так:
dn: uid=Admin,dc=admin,dc=ldaptest,dc=com
objectclass: posixAccount
objectclass: inetOrgPerson
objectclass: organizationalPerson
objectclass: person
gidNumber: 10000
sn: Admin
displayName: Admin
uid: Admin
homeDirectory: /home/mail/admin
cn: Admin
uidNumber: 10010
userPassword: {SSHA}sAN8GSAGDW+GDJcUasjoiQN8tBJmZhQI
loginShell: /bin/shell
Пробую добавить схему:
ldapadd -x -W -D "cn=admin,dc=admin,dc=ldaptest,dc=com" -f sub.ldif
Не прокатывает ((
ldap_bind: Invalid credentials (49)
-
Если Вы хотите, чтобы я Вам помог решить Вашу задачу, придётся сначала её сформулировать. Глупо начинать с выполнения каких-то команд, смысл которых Вы не понимаете -- они заведомо не дадут никакого результата. И читать выдернутые из контекста куски чужих HOWTO-шек тоже бессмысленно -- человек давным-давно решал свою задачу, которая абсолютно не связана с Вашей, пытаться их воспроизвести механически, не вникая в суть, тоже глупо.
Давайте всё-таки разберёмся, что Вы собираетесь хранить в каталоге. Будет ли это одна организация с отделами, или несколько организаций. Как будут называться эти отделы (организации)? Будут ли в каталоге полноценные учётные записи пользователей (чтобы, например, подключаться по ssh к серверу) с разными правами доступа, или достаточно только функционала приёма-отправки электронной почты? Как будут называться Ваши почтовые домены (то, что после "собаки")? Зачем Вам нужна samba (не в плане того, что она делает, это я и сам знаю, а с какой целью Вы собираетесь её использовать)? Без ответа на эти базовые вопросы структуру каталога не спроектировать, а без этого дальше двигаться нет смысла.
Егор
-
в общем у меня ряд задач:
1. Установка dovecot и postfix
2. ssl/tls
3. Антиспам фильтр (spamassasin)
4. Фильтр содержимого (об этом я говорил ранее)
5. Несколько доменов и пересылка между ними
6. Web-интерфейс
7. Антивирус
8. Установка и привязка ldap
-
1. Сделано (без престрастий)
2. Стандартные ssl (pem), пока что так
3. Установлен и настроен blacklist
4. В процессе
5. У меня было реализовано так:
mydestination = $myhostname, post.com, other.com, mail.post.com, mail.other.com, localhost.post.com, localhost
ты мне подал другую мысль но смысл тот же примерно, а надо в ldap реализовать
6. Сделано
7. Сделано (ну почти, установлено, но не настроено)
8. Ты помог сделать
-
Здравствуйте. Посидел сегодня над Вашей задачей, сформулировав её так: на сервере обслуживается два почтовых домена post.com и other.com, настройки почтовых ящиков этих доменов берутся из каталога LDAP. Если письмо приходит на ящик some_user@mail.post.com, оно доставляется в ящик some_user@post.com, если письмо приходит на ящик some_user@mail.other.com, оно доставляется в ящик some_user@other.com. В итоге у меня получилось следующее.
Подготовка почтовой директории:
mkdir /home/mail/post.com
mkdir /home/mail/other.com
chown -R 10000:10000 /home/mail
Содержимое каталога LDAP:
# Корневая запись каталога
dn: dc=ldaptest,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: ldaptest.com
dc: ldaptest
# Контейнер для настроек почтовой системы
dn: ou=Mail,dc=ldaptest,dc=com
objectClass: organizationalUnit
ou: Mail
# Контейнер для почтовых ящиков домена post.com
dn: cn=post.com,ou=Mail,dc=ldaptest,dc=com
objectClass: applicationProcess
cn: post.com
# Контейнер для почтовых ящиков домена other.com
dn: cn=other.com,ou=Mail,dc=ldaptest,dc=com
objectClass: applicationProcess
cn: other.com
# Настройки почтового ящика new@post.com
dn: uid=new,cn=post.com,ou=Mail,dc=ldaptest,dc=com
objectClass: inetOrgPerson
uid: new
cn: new
sn: new
userPassword: newPassword
mail: new@post.com
# Настройки почтового ящика test3@post.com
dn: uid=test3,cn=post.com,ou=Mail,dc=ldaptest,dc=com
objectClass: inetOrgPerson
uid: test3
cn: test3
sn: test3
userPassword: test3Password
mail: test3@post.com
# Настройки почтового ящика user1@other.com
dn: uid=user1,cn=other.com,ou=Mail,dc=ldaptest,dc=com
objectClass: inetOrgPerson
uid: user1
cn: user1
sn: user1
userPassword: user1Password
mail: user1@other.com
# Настройки почтового ящика user2@other.com
dn: uid=user2,cn=other.com,ou=Mail,dc=ldaptest,dc=com
objectClass: inetOrgPerson
uid: user2
cn: user2
sn: user2
userPassword: user2Password
mail: user2@other.com
Настройки postfix. Файл /etc/postfix/main.conf:
mynetworks = 127.0.0.0/8
smtpd_relay_restrictions = permit_mynetworks defer_unauth_destination
virtual_mailbox_domains = post.com other.com
virtual_alias_domains = mail.post.com mail.other.com
virtual_transport = virtual
virtual_mailbox_base = /home/mail/
virtual_mailbox_maps = ldap:/etc/postfix/ldap_virtual_multi_domain_mailbox_maps.cf
virtual_alias_maps = hash:/etc/postfix/virtual_alias_domains_rewrite_map
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
virtual_minimum_uid = 10000
Файл /etc/postfix/ldap_virtual_multi_domain_mailbox_maps.cf:
server_host = ldap://127.0.0.1:389
search_base = ou=Mail,dc=ldaptest,dc=com
version = 3
query_filter = (&(objectClass=inetOrgPerson)(mail=%s))
result_attribute = mail
result_format = %d/%u/
Файл /etc/postfix/virtual_alias_domains_rewrite_map:
@mail.post.com @post.com
@mail.other.com @mail.other.com
Для него нужно сформировать файл virtual_alias_domains_rewrite_map.db:
postmap /etc/postfix/virtual_alias_domains_rewrite_map
Настройки dovecot. Файл /etc/dovecot/dovecot.conf:
log_path = /var/log/dovecot.log
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_debug = yes
auth_debug = yes
auth_verbose = yes
ssl = no
protocols = imap
namespace inbox {
inbox = yes
location =
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Junk {
auto = no
special_use = \Junk
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox "Sent Messages" {
auto = no
special_use = \Sent
}
mailbox Trash {
auto = subscribe
special_use = \Trash
}
prefix =
}
mail_uid = 10000
first_valid_uid = 10000
last_valid_uid = 10000
mail_gid = 10000
first_valid_gid = 10000
last_valid_gid = 10000
passdb {
driver = ldap
args = /etc/dovecot/dovecot-ldap-bind-auth.conf
}
userdb {
driver = static
args = uid=10000 gid=10000 home=/home/mail/%d/%n mail=maildir:/home/mail/%d/%n
}
Файл /etc/dovecot/dovecot-ldap-bind-auth.conf:
hosts = 127.0.0.1:389
ldap_version = 3
base = ou=Mail,dc=ldaptest,dc=com
auth_bind = yes
pass_attrs = mail=user
pass_filter = (&(objectClass=inetOrgPerson)(mail=%u))
Будьте внимательны -- изменения внесены ВО ВСЕ файлы и структуру каталога. При настройках thunderbird в качестве имени пользователя для аутентификации нужно использовать полное название почтового ящика, то есть не new, а new@post.com, во избежание путаницы, которая может возникнуть, когда в разных доменах будут почтовые ящики с одинаковым именем пользователя, например, new@post.com и new@other.com.
Егор
-
Все это здорово, но все же не совсем то что я хотел....
Сказали надо что бы было в ldap схема в виде главного домена дерева
dc=ldaptest,dc=com
и поддоменов
dc=test,dc=ldaptest,dc=com
Главная ветка у нас есть, а как добавить подветку не пойму. При создании выбираем класс объекта
-
Все это здорово, но все же не совсем то что я хотел....
Сказали надо что бы было в ldap схема в виде главного домена дерева
dc=ldaptest,dc=com
и поддоменов
dc=test,dc=ldaptest,dc=com
Я у Вас спрашивал, что Вы хотите от каталога (https://pro-ldap.ru/forum/index.php?topic=928.msg1931#msg1931), Вы мне ничего не ответили. Вы мне сказали, что Вам нужно от почтовой системы (https://pro-ldap.ru/forum/index.php?topic=928.msg1932#msg1932), я сделал, как Вы просили. Если Вы и дальше будете играть в кошки-мышки, то результата не получите. Нужно яснее формулировать свои задачи.
Главная ветка у нас есть, а как добавить подветку не пойму. При создании выбираем класс объекта
Проблема в том, что атрибут dc есть только во вспомогательном объектном классе dcObject, а на вспомогательном классе запись не построить. Нужен какой-нибудь структурный объектный класс, обычно используют объектный класс organization:
dn: dc=test,dc=ldaptest,dc=com
objectClass: organization
objectClass: dcObject
o: test
dc: test
Нужно иметь хотя бы минимальное представление о каталогах LDAP, чтобы с ними работать. Крайне рекомендую почитать хотя бы 2-ю (https://pro-ldap.ru/tr/zytrax/ch2/) и 3-ю (https://pro-ldap.ru/tr/zytrax/ch3/) главы учебника LFRS (https://pro-ldap.ru/tr/zytrax/).
Егор
-
привет, все получилось теперь надо с фильтрами что-то делать, через sieve
-
привет, все получилось теперь надо с фильтрами что-то делать, через sieve
Рад, что у Вас всё получилось. С sieve работать не приходилось, но даже самые первые ссылки в google (https://www.google.ru/search?q=sieve+dovecot) говорят о том, что это не сложно, по крайней мере на базовом уровне. Самому сейчас экспериментировать с этим, к сожалению, времени нет.
Егор
-
Вопрос в догонку: связка postfix+docecot+ldap
При получении письма постфикс смотрит в каталоге AD windows сервера находит учетку, имя пользователя его устраивает - принимаем почту, можно ли к ней привязать несколько виртуальных доменов?
есть: User@mydomain.ru
а хочется чтоб было User@mydomain.ru=User@mydomain1.ru=User@mydomain2.ru=User@mydomainX.ru
-
Вопрос в догонку: связка postfix+docecot+ldap
При получении письма постфикс смотрит в каталоге AD windows сервера находит учетку, имя пользователя его устраивает - принимаем почту, можно ли к ней привязать несколько виртуальных доменов?
есть: User@mydomain.ru
а хочется чтоб было User@mydomain.ru=User@mydomain1.ru=User@mydomain2.ru=User@mydomainX.ru
В теории можно. На практике же многое зависит от того, как у Вас сейчас postfix привязывается к AD. Покажите Ваши настройки, попробуем сделать.
Егор
-
main.cf
virtual_mailbox_maps = ldap:/etc/postfix/ldap/virtual_mailbox_maps.cf
virtual_mailbox_maps.cf
server_host = fdqn имя ближайшего контроллера
search_base = dc=домен, dc=домен, dc=домен
bind = yes
bind_dn = cn=учетка,cn=Users,dc=домен,dc=домен,dc=домен
bind_pw = пароль
domain = домен
start_tls = no
scope = sub
query_filter = (&(objectClass=Person)(sAMAccountName=%u)(!(userAccountControl=66050)))
result_attribute = mail
leaf_result_attribute = mail
cache = no
Все это запущено на debian 9.6, postfix 3.1.8, используемый контроллер домена win2k16, уровень домена 2k3
-
Предлагаю сделать через алиасы, примерно так:
virtual_mailbox_domains = mydomain.ru
virtual_alias_domains = mydomain1.ru mydomain2.ru mydomainX.ru
virtual_mailbox_maps = ldap:/etc/postfix/ldap/virtual_mailbox_maps.cf
virtual_alias_maps = hash:/etc/postfix/virtual_alias_domains_rewrite_map
Файл /etc/postfix/virtual_alias_domains_rewrite_map:
@mydomain1.ru @mydomain.ru
@mydomain2.ru @mydomain.ru
@mydomainX.ru @mydomain.ru
Не забудьте сформировать файл virtual_alias_domains_rewrite_map.db:
postmap /etc/postfix/virtual_alias_domains_rewrite_map
Файл /etc/postfix/ldap/virtual_mailbox_maps.cf остаётся без изменений.
Егор
-
Спасибо за ответ, да еще и по существу, ныне редкость.
-
С postfix на данный момент основные вопросе решены, кроме того что права на логи dovecot пришлось 777 поставить;
А вот с dovecot возникли сложности, биндится к домену нормально, но вот фильтры и атрибуты...
pass_attrs =
pass_filter =
user_attrs =
user_filter =
Перечитал много всего в интернетах, но сколько статей столько и мнений, но вот конкретных описаний что и зачем не нашел, более того, почти все ссылаются на подключение к open ldap серверу, но не каталогу AD на windows. Более того, на сколько мне известно, AD не отдает пароля пользователя, а расположение почты у меня фиксировано /var/mail/mydomain где уже каталоги с пользователями. Что надо указать в этих параметрах в моем случае?
-
Здравствуйте!
Разные параметры связаны с тем, что они настраивают разные разделы конфигурации dovecot: passdb и userdb (посмотрите мой пример настройки dovecot здесь (https://pro-ldap.ru/forum/index.php?topic=928.msg1915#msg1915)). В разделе passdb настраиваются параметры аутентификации пользователей, а в разделе userdb -- параметры работы с файловой системой: расположение почтовых директорий, настроек, права доступа к файловой системе и т.п. Сведения в оба раздела можно брать из LDAP, а приведённые Вами параметры будут применяться к соответствующим разделам.
Часто аутентификацию проводят на основе сведений из какой-то БД, например, каталога LDAP, а почтовые директории настраивают так, чтобы к ним был доступ от имени одной и той же учётки UNIX (именно так сделано в примере, на который я ссылался выше). Тогда для passdb используется механизм соответствующей БД, а для userdb -- механизм static.
Теперь что касается AD.
Dovecot умеет делать просто колоссальное количество вещей и подстраиваться практически под любое окружение, поэтому для его оптимальной настройки желательно хорошо понимать своё окружение =) . Возможно, Вам совершенно необязательно цепляться к LDAP/AD в dovecot, поскольку в Linux уже настроена привязка к LDAP/AD для PAM/NSS, тогда проще и логичнее воспользоваться уже готовой привязкой и настроить аутентификацию dovecot через PAM (https://wiki.dovecot.org/PasswordDatabase/PAM).
Но можно и через LDAP. AD -- такой же каталог, так что особой разницы в настройках между подключением к OpenLDAP и AD нет. Из AD нельзя извлечь пароль, но это и не нужно: аутентификация проверяется методом выполнения операции Bind, то есть привязки к каталогу. Алгоритм такой:
1. Выполняется первое подключение к каталогу от имени учётной записи с правами доступа к AD (в настройках postfix Вы указывали её и её пароль в параметрах bind_dn/bind_pw, для dovecot аналогичные параметры dn/dnpass).
2. В рамках этого подключения ищется запись каталога, соответствующая фильтру pass_filter. В качестве фильтра можно использовать тот, который Вы применяли в query_filter для postfix, только вместо шаблона %u нужно поставить шаблон %n.
3. Если запись пользователя найдена, то предпринимается попытка повторной привязки (та самая операция Bind) к каталогу от имени этой найденной записи с тем паролем, который предоставил почтовый клиент. Если такая привязка (то есть аутентификация в каталоге) прошла без ошибок, то считается, что пользователь предоставил правильный пароль и доступ к почтовым директориям в файловой системе позволяется. Если же повторная привязка к каталогу завершилась ошибкой, то доступ к почтовым директориям не позволяется. Логика простая.
В Вашем случае будет примерно такая картина:
dovecot.conf:
passdb {
driver = ldap
args = /etc/dovecot/dovecot-ad-bind-auth.conf
}
/etc/dovecot/dovecot-ad-bind-auth.conf:
hosts = fdqn имя ближайшего контроллера
ldap_version = 3
dn = cn=учетка,cn=Users,dc=домен,dc=домен,dc=домен
dnpass = пароль
base = dc=домен, dc=домен, dc=домен
auth_bind = yes
pass_attrs = sAMAccountName=user
pass_filter = (&(objectClass=Person)(sAMAccountName=%n)(!(userAccountControl=66050)))
Что касается userdb, то тут нужно смотреть, как у вас устроена директория /var/mail/mydomain (поддиректории, права доступа к ним), но обычно механизма static вполне достаточно.
Егор
-
Еще раз премного благодарен, по вашей наводке нашел ошибку в конфиге, из-за невнимательности в файле auth-ldap.conf.ext дефолтное значение userdb не закоментировал, в итоге дважды определялось из-за чего не туда довекот смотрел.
-
Вопрос не по теме топика, но все же, где можно почитать про общие папки в dovecot, как я понял их называют namespaces, простым языком для новичков, желательно на русском?
-
Вопрос не по теме топика, но все же, где можно почитать про общие папки в dovecot, как я понял их называют namespaces, простым языком для новичков, желательно на русском?
Я давно не занимался dovecot, но когда интересовался этими вопросами, самой толковой статьёй на русском языке мне показалась эта статья на сайте www.lissyara.su (https://www.lissyara.su/?id=2238), найдёте там по поиску "Шаг 9". Общих папок настраивать не доводилось, так что попробуйте разобраться самостоятельно.
Егор
-
у него описано создание общих папок, что я сделал и по документации (https://wiki2.dovecot.org/Namespaces?highlight=%2810-mail.conf%29), но вот ни в документации пока не увидел и так не попадался вопрос, а как собственно на них должна приходить почта/раскладываться письма?
-
Раскладку можно сделать с помощью скриптов sieve
-
при попытке включить авторизацию для dovecot по ldap и mysql одновременно возникла проблема.
Как только просто устанавливаю модуль dovecot-mysql, при перезапуске сервиса ругается что не может загрузить библиотеку ldap:
Общий лог кота:
Dec 28 13:56:58 auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth
Dec 28 13:57:01 auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth
Dec 28 13:57:01 auth: Debug: Module loaded: /usr/lib/dovecot/modules/auth/libdriver_mysql.so
Error.log
Dec 28 13:57:01 auth: Fatal: Couldn't load required plugin /usr/lib/dovecot/modules/auth/libauthdb_ldap.so: dlopen() failed: libnettle.so.6: failed to map segment from shared object
Dec 28 13:57:01 master: Error: service(auth): command startup failed, throttling for 2 secs
При это с postfix никаких проблем не возникло, смотрит ldap и mysql. Что может быть, у меня идеи быстро кончились?
-
Здравствуйте!
У меня на Ubuntu 18.04 после установки dovecot-mysql (dovecot-ldap уже был установлен и настроен) dovecot запустился без ошибок, правда, аутентификацию в mysql я не настраивал.
А зачем вообще это нужно, раз у Вас пользователи в AD?
Егор
-
у меня debian 9.6
Мне это нужно для общих папок, чтоб не создавать пользователя в AD. Например, у меня общая папка info, для внешних пользователей она выглядит как info@mydomain.ru, для postfix чтоб он принял я прописал его как пользователя в mysql и кучу альянсов на него для остальных глобальных общих папок. Postfix отдает его Dovecot, а тот не знает такого пользователя и письмо пошло в bounce, и ответ что нет такого пользователя. Хочу его туда куда и postfix отправить, чтоб если что-то менять то в одном месте, а там еще и mailman планируется он тоже в mysql живет.
Попробовал обновить dovecot до самой последней версии стабильной, ругается на другую библиотеку уже но суть та же; плюс еще заметил когда dovecot перезапускаю, ругань на библиотеки sasl, который нигде не использовался, может ошибка с этим связано, но так же не нашел откуда ноги растут.
дек 28 16:11:27 srvmail auth[19067]: unable to dlopen /usr/lib/x86_64-linux-gnu/sasl2/libdigestmd5.so: libcrypto.so.1.1: failed to map segment from shared object
дек 28 16:11:27 srvmail auth[19067]: unable to dlopen /usr/lib/x86_64-linux-gnu/sasl2/libntlm.so: libcrypto.so.1.1: failed to map segment from shared object
дек 28 16:11:27 srvmail auth[19067]: unable to dlopen /usr/lib/x86_64-linux-gnu/sasl2/libsasldb.so: /usr/lib/x86_64-linux-gnu/sasl2/libsasldb.so: failed to map segment from shared object
Опять же таки сколько не смотрел по ошибкам, у всех всегда есть расшифровка: нет прав доступа, нет самого файла, не хватает памяти и т.д. а тут failed и без расшифровки...
-
Раскладка по namespaces действительно отлично исполняется с помощью sieve скриптов, для этого надо установить пакет dovecot-sieve; Создать ящик куда будет приходить почка и альясы на него для всех желаемых namespaces потом пишется скрипт:
require ["fileinto", "envelope"];
if address :is "to" "внешний e-mail адрес куда сторонние пользователи отправляют письма, проще говоря общий ящик"
{
fileinto "Имя общей папки куда положить письмо";
}
Количество таких условий в этом файле не ограничено.
Так как к этим общим папкам имеют все доступ и кто угодно может удалить письма, возникла необходимость в плагине acl, его подключил и надо теперь создать файлы dovecot-acl, где прописан доступ, которые имеют вид:
<identifier> <ACLs> [:<named ACLs>] , где <identifier> может быть одним из:
group-override=group name
user=user name
owner
group=group name
authenticated
anyone (или anonymous, который является алиасом для anyone)
Вот группу бы очень хотелось бы взять из microsoft AD, где мы уже проверяем авторизацию пользователей. На сколько я понял документацию ответом запроса должно быть acl_groups = список групп через запятую.
Глупый возможно вопрос, но как это воплотить?
dovecot-ldap.conf.ext для авторизации и проверки наличия пользователей использует:
ass_attrs = sAMAccountName=user
pass_filter = (&(objectClass=Person)(sAMAccountName=%n)(!(userAccountControl=66050)))
Что нужно добавить чтоб получить список групп в которых числится этот пользователь?
-
Здравствуйте! Как написано здесь (https://wiki2.dovecot.org/ACL):
Поддержка групп в ACL работает путём возврата из userdb экстра-поля acl_groups, содержащего разделённый запятыми список всег групп, которым принадлежит пользователь. UNIX-группы пользователя не влияют на ACL (вы можете "задействовать" их путём использования специального post-login скрипта).
Взяв за основу пример скрипта отсюда (https://wiki2.dovecot.org/PostLoginScripting#Use_UNIX_groups_for_ACL_authorization), я сделал post-login скрипт, который обращается в AD, берёт названия групп из значения атрибута memberOf учётки пользователя и выдаёт их через запятую:
#!/bin/bash
ACL_GROUPS=`ldapsearch -o ldif-wrap=no -xLLL -H ldap://ads.mycompany.ru -D someUser@mycompany.ru -w somePass -b cn=users,dc=mycompany,dc=ru samaccountname=$USER memberof | \
grep memberOf | \
perl -MMIME::Base64 -wpe 's/^([^:]+):: (.+)$/"$1: " . decode_base64($2)/e' | \
perl -00 -wpe 'chomp; s/memberOf: cn=([^,]+),cn=users,dc=mycompany,dc=ru(\n?)/$1 . ($2 ? "," : "")/gie'`
#echo $ACL_GROUPS
#exit 0
export ACL_GROUPS
export USERDB_KEYS="$USERDB_KEYS acl_groups"
exec "$@"
Первый вызов perl декодирует Base64 там, где в названии группы используются русские буквы. Второй вызов perl отрезает собственно названия групп и "склеивает" их через запятую. Не знаю как там будут обстоять дела с пробелами (если они есть в названиях групп), их, наверное, надо как-то экранировать или брать в кавычки, но мне проверять негде, если что, подправите преобразование во втором perl-вызове самостоятельно.
Надеюсь, поможет.
Егор
-
C перлом вообще никак, заменил на свои параметры, в логах:
imap-postlogin: Error: grep: (standard input): Resource temporarily unavailable
, если просто запустить ldapsearch до него у меня в скрипте полностью путь прописан, ибо так говорит, что не такого, меняю $user на имя например testuser на выходе ничего нет.
-
C перлом вообще никак, заменил на свои параметры, в логах: imap-postlogin: Error: grep: (standard input): Resource temporarily unavailable
, если просто запустить ldapsearch до него у меня в скрипте полностью путь прописан, ибо так говорит, что не такого, меняю $user на имя например testuser на выходе ничего нет.
testuser входит в какие-нибудь группы?
-
Да, более десяти групп
-
Да, более десяти групп
И ldapsearch типа:
ldapsearch -o ldif-wrap=no -xLLL -H ldap://ads.mycompany.ru -D someUser@mycompany.ru -w somePass -b cn=users,dc=mycompany,dc=ru samaccountname=testuser memberof
ничего не возвращает?
-
Беда заключалась в том что "memberof" регистрозависимый и называться он должен "memberOf", буква "О" обязательно большая. Далее вопрос по скрипту dovecot в переменную $user отдает вместе с доменом, как отрезать "@domain.ru"? с перлом как я уже говорил у меня беда полная. Плюс ко всему ldapsearch в debian 9.6 по умолчанию не идет, но находится скрипт для запуска /usr/share/bash-completions/, что меня новичка смутило сначала, что он молча то, доставил пакет ldap-utils и все встало на свои места.
Ну и с вырезанимаем не режет, почему-то, mycompany.ru заменил на свое, да и OU значительно больше, чем Users
perl -00 -wpe 'chomp; s/memberOf: cn=([^,]+),cn=users,dc=mycompany,dc=ru(\n?)/$1 . ($2 ? "," : "")/gie'`
Что выдает скрипт на данный момент отправил в личное сообщение.
-
при попытке включить авторизацию для dovecot по ldap и mysql одновременно возникла проблема.
Как только просто устанавливаю модуль dovecot-mysql, при перезапуске сервиса ругается что не может загрузить библиотеку ldap:
Общий лог кота:
Dec 28 13:56:58 auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth
Dec 28 13:57:01 auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth
Dec 28 13:57:01 auth: Debug: Module loaded: /usr/lib/dovecot/modules/auth/libdriver_mysql.so
Error.log
Dec 28 13:57:01 auth: Fatal: Couldn't load required plugin /usr/lib/dovecot/modules/auth/libauthdb_ldap.so: dlopen() failed: libnettle.so.6: failed to map segment from shared object
Dec 28 13:57:01 master: Error: service(auth): command startup failed, throttling for 2 secs
При это с postfix никаких проблем не возникло, смотрит ldap и mysql. Что может быть, у меня идеи быстро кончились?
По этому вопросу решение пришло позже:
во-первых обновился до актуального стабильного релиза dovecot, ругательства сильно поменялись, но суть осталась.
во-вторых поставил спамассасин, а он хотело каких-то еще криптобиблиотек;
в-третьих в файле довекота 10-master, параметр default_vsz_limit = 64М поменял на 256M как рекомендовалось в новых версиях.
Установил и подключил модуль dovecot-mysql и нет проблем.
-
Егор добрый день, вечер, а также уважаемые Гуру Postfix
вопрос если можно
у меня сейчас такая конструкция, 10 почтовых доменов в разных городах
центральный domain.ru
филиалы dom2.domain.ru, dom3.domain.ru, dom4.domain.ru, … dom10.domain.ru
В центральном офисе корневой Windows домен corp.local и 1 дочерний dom1.corp.local
В Остальных городах dom2.corp.local … dom10.corp.local
Между центральным офисом и филиалами есть ведомственные каналы,
Между всеми LDAP есть репликация.
Есть общая организация MS Exchange, тоесть все контакты компании доступны каждому работнику в global address list, но в каждом филиале свой Exchange сервер где живут ящики своего филиала.
Почта внутри компании ходит по ведомственным каналам не выходя наружу.
В каждом городе свой postfix является релеем для своего MS Exchange,
Почта с наружи принимается на postfix и проверяется на наличие активного ящика в своем LDAP и пересылается в свой MS Exchange согласно транспорту.
MX записи для доменов филиалов dom2.domain.ru, dom3.domain.ru, dom4.domain.ru, … dom10.domain.ru имеют приоритет 10,
для каждого почтового домена филиала есть MX с приоритетом 20 указывающий на сервер postfix в центральном офисе, чтобы принять почту и отправить ее по ведомственному каналу в филиал.
В центральном офисе postfix проверяет наличие ящика в корневом домене corp.local поскольку этот домен содержит копию всех дочерних LDAP, и далее согласно своему транспорту отправляет на сервер Exchange IP которого там указан.
Проблема начала появляться когда люди начали переезжать из филиала в филиал и работать там.
К примеру: у человека родной почтовый домен dom4.domain.ru он уехал в другой филиал на неизвестное время где свой почтовый домен dom3.domain.ru, он хочет продолжать получать почту на свой почтовый домен dom4.domain.ru.
Если это временно со своим ноутбуком проблем нет, входит аунтифицируется и работает все идет через внутренний канал, но если надолго логичнее ему дать пк из местного Windows домена, но приходиться делать костыли такие как: разрешать местному Exchange принимать почту для домена другого филиала, править транспорт родного Postfix указывая его родной email и новый сервер Exchange для пересылки
Вот так
domain.ru smtp:[172.16.194.47]
dom2. domain.ru smtp:[172.16.20.12]
dom3. domain.ru smtp:[172.16.32.12]
dom4. domain.ru smtp:[172.16.40.12]
dom5. domain.ru smtp:[172.16.52.12]
dom6. domain.ru smtp:[172.16.60.12]
dom7. domain.ru smtp:[172.16.72.12]
dom8. domain.ru smtp:[172.16.80.12]
dom9. domain.ru smtp:[172.16.92.12]
dom10. domain.ru smtp:[172.16.100.12]
familia-io@domain.ru smtp:[172.16.72.12]
получается внешняя почта все равно идет через MX родного города и пересылается по внутренним сетям на другой Exchange
от сюда возникает вопрос, можно ли сделать проверку в LDAP не только на наличие ящика но и проверку на предмет где он сейчас находится, в каком LDAP какого домена после чего эту переменную использовать для транспорта чтобы переслать в нужный Exchange того города где он поселился.
И если такое будет возможно можно ли будет отказаться от доменов 3го уровня, выдавая всем domain.ru используя geo-location?
Заранее благодарен за ответ
-
Здравствуйте!
Транспортные карты postfix через LDAP настраивать не приходилось, но попытаться можно. Но первым делом у меня возник вопрос, зачем такие сложности? Если человек из филиала 3 приехал работать в филиал 4, что мешает ему подключаться к своему почтовому серверу в филиале 3 и принимать/отправлять почту через него?
Потому что если пойти по тому пути, что Вы предлагаете, то кроме проблем с транспортом на почтовом сервере филиала 4 должны возникнуть проблемы в доставкой письма в почтовый ящик "неродного" пользователя (хотя, может для Exchange это не проблема, не приходилось с ним сталкиваться, поэтому не знаю).
Мне кажется, Вы чересчур усложните систему, в AD придётся для каждого пользователя вести данные о том, в каком филиале он сейчас находится. Рано или поздно кто-то что-то забудет изменить и почта будет ходить как попало.
На мой взгляд, самые простые решения всегда являются самыми надёжными. Тем не менее, если Вы готовы рискнуть, для начала мне бы хотелось посмотреть на конфигурацию postfix какого-нибудь филиала.
Егор
-
Егор Спасибо что ответ.
Когда я это строил, разделения на почтовые домены по 3му уровню мне казалось самым простым, я не мог предположить передвижения такого рода, это как правило объединение филиалов в одно юридическое лицо, упразднение начальства, и иногда переезд 1го директора в другой город.
Работа в домене 4, человеку из домена 3, возможна, домены друг друга знают через днс, если это на время то нет проблем, особенно если он со своим ПК приехал, пк и пользователь аунтифицируются в своем родном домене, но есть нюансы, все политики на пк и юзера прилетают с того родного домена, такие как агент касперского отчитывается в тот домен и тащит обновления от туда, настройки прокси сервера указывают на свой родной прокси, клиент 1с который лежит в сети того города и домена, и все это человек тащит с другого города по ведомственному каналу, включая почту, это терпимо и можно отключить на время политики для него, для программ типа клиента 1с, можно переписать путь на клиента в местной сети, прокси переписать на местный итд.
Но когда человек приезжает и сам не знает на сколько, это схоже с переводом военного в другую воинскую часть, то логичнее перевести его пк в местный домен, или выдать ему местный пк, завести новую учетку в этом домене и все ярлыки на программы, прокси и тд будут ссылаться и будут привязаны к местной сети, вопрос остается с почтой, его почту знают многие контрагенты и понятно то что он ее хочет оставить за собой,
Поступить можно так, в местном Exchange добавить почтовый домен dom3.domain.ru в дополнение к родному dom4.domain.ru для приема человеку его родной почты, а в его родном постфиксе в транспорте дописать строку с IP адресом Exchange который сейчас его обслуживает, и это будет приоритетом.
dom3. domain.ru smtp:[172.16.32.12]
familia-io@dom3.domain.ru smtp:[172.16.40.12]
и его почта будет приходить к нему через ведомственный канал, в Exchange нового домена с постфикса на который указывает MX, для dom3. domain.ru, так сейчас работает около года один человек.
Иногда получается договориться с человеком, выдать ему новую почту в новом домене, и настроить пересылку всей входящей почты со старого ящика прямо в Exchange, но отправлять он уже будет с новой почты, в надежде что через время все его контакты перейдут на его новый адрес.
В связи с этим в голове вертится мысль об одном почтовом домене domain.ru
В каждом филиале на каждом Exchange делаю этот домен accepted, как родной
осталось научить постфикс определять где находится почтовый адрес в данный момент чтобы переслать именно в тот город в его домен на Exchange в котором живет его ящик.
И продумать как прописать MX ы в каждом городе, не гнать же всю почту через центр.
Хотя сейчас мобильные клиенты идут именно через центральный офис, через https, у Exchange есть понятие проксирование, центральный Exchange авторизует и конектит к своему серверу уже через ведомственные каналы.
Настройки postfix филиала
main.cf
virtual_mailbox_domains =
dom3.domain.ru
virtual_mailbox_maps =
ldap:/usr/local/etc/postfix/ldap_dom3.corp.local.cf
virtual_transport = hash:/usr/local/etc/postfix/transport
transport
dom3.domain.ru smtp:[172.16.32.12]
ldap_dom3.corp.local.cf
server_host =
172.16.32.10,
172.16.32.11
server_port = 3268
timeout = 60
search_base = DC=dom3,DC=corp,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)))
result_format = %s
domain = dom3.domain.ru
result_attribute = cn
scope = sub
bind_dn = CN=postfix,OU=Service_Accounts,OU=DOM3,DC=dom3,DC=corp,DC=local
bind_pw = Passw0rd
version = 3
поскольку рутовый домен corp.local содержит копии всех ldap дочерних доменов, то в центральном офисе postfix делает запрос в ldap контроллера домена corp.local
также существует MX для каждого потового домена филиала с меньшим приоритетом и указывает на IP сервер postfix центрального офиса, то центральный postfix может получить для всех дочерних доменов почту проверить в корневом ldap на предмет наличия и отослать в exchange родного домена,
также Exchange любого филиала может и отослать почту через центральный postfix, в случае проблем со своим, через внутренний MX с меньшим приоритетом, прописанный в локальном DNS
настройки postfix центрального офиса
main.cf
virtual_mailbox_domains =
domain.ru,
dom2.domain.ru,
dom3.domain.ru,
dom4.domain.ru,
dom5.domain.ru,
dom6.domain.ru,
dom7.domain.ru,
dom8.domain.ru,
dom9.domain.ru,
dom10.domain.ru
virtual_mailbox_maps =
ldap:/usr/local/etc/postfix/ldap_corp.local.cf
virtual_transport = hash:/usr/local/etc/postfix/transport
ldap_corp.local.cf
server_host =
172.16.10.10,
172.16.10.11
server_port = 3268
timeout = 60
search_base = DC=corp,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)))
result_format = %s
domain =
domain.ru,
dom2.domain.ru,
dom3.domain.ru,
dom4.domain.ru,
dom5.domain.ru,
dom6.domain.ru,
dom7.domain.ru,
dom8.domain.ru,
dom9.domain.ru,
dom10.domain.ru
result_attribute = cn
scope = sub
bind_dn = CN=postfix,OU=Service_Accounts,OU=CORP,DC=corp,DC=local
bind_pw = Passw0rd
version = 3
transport
domain.ru smtp:[172.16.194.47]
dom2.domain.ru smtp:[172.16.20.12]
dom3.domain.ru smtp:[172.16.32.12]
dom4.domain.ru smtp:[172.16.40.12]
dom5.domain.ru smtp:[172.16.52.12]
dom6.domain.ru smtp:[172.16.60.12]
dom7.domain.ru smtp:[172.16.72.12]
dom8.domain.ru smtp:[172.16.80.12]
dom9.domain.ru smtp:[172.16.92.12]
dom10.domain.ru smtp:[172.16.100.12]
в дополнение
каждый дочерний домен уникальный и у объекта юзер уже есть поля его принадлежности к своему серверу Exchange например запрос поля
homeMTA
выдаст
CN=Microsoft MTA,CN=DOM3-MSG-01,CN=Servers,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=CORP,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=corp,DC=local
CN=DOM3-MSG-01 вот это сервер Exchange в этом филиале
-
Здравствуйте! Не люблю давать гипотетических советов (которые сам не опробовал), но в данном случае придётся так сделать, поскольку связки AD+Exchange у меня нет (атрибуты proxyAddress и homeMTA относятся к Exchanhe), а разворачивать её ради эксперимента слишком долго и накладно.
Postfix позволяет в настройках указывать несколько карт, поэтому в virtual_transport можно указать две карты:
virtual_transport = ldap:/usr/local/etc/postfix/transport/ldap_transport_map.cf, hash:/usr/local/etc/postfix/transport
Понятно, что если LDAP-карта что-то вернёт, то транспорт письма будет осуществляться в соответствии с полученным ответом, если же она ничего не вернёт, то ответ должен быть получен из второй карты (типа, по умолчанию). Причём LDAP-карта должна вернуть ответ, сформированный как описано в разделе "RESULT FORMAT" man-страницы transport(5) (http://www.postfix.org/transport.5.html), то есть:
smtp:[172.16.40.12]
или
smtp:[dom4-msg-01.dom4.domain.ru]
Это исходные данные. Теперь что касается самой LDAP-карты. Тут можно пойти двумя путями. "Простой" путь заключается в том, чтобы назначить в учётке пользователя некий свободный текстовый атрибут, который будет содержать IP-адрес (или DNS-имя) требуемого сервера. Для примера я возьму атрибут postOfficeBox. В записи пользователя с нестандартной маршрутизацией почты он будет заполнен так:
postOfficeBox: 172.16.40.12
или
postOfficeBox: dom4-msg-01.dom4.domain.ru
Тогда LDAP-карта будет выглядеть примерно так:
server_host = 172.16.32.10, 172.16.32.11
server_port = 3268
domain = dom3.domain.ru
timeout = 60
scope = sub
bind_dn = CN=postfix,OU=Service_Accounts,OU=DOM3,DC=dom3,DC=corp,DC=local
bind_pw = Passw0rd
version = 3
search_base = DC=dom3,DC=corp,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)))
result_attribute = postOfficeBox
result_format = smpt:[%s]
Проверить можно так:
postmap -q familia-io@dom3.domain.ru ldap:/usr/local/etc/postfix/transport/ldap_transport_map.cf
Должна вернуться строка:
smtp:[dom4-msg-01.dom4.domain.ru]
Второй, "сложный" способ: попробовать с помощью рекурсивных LDAP-запросов "поймать" DNS-имя Exchange-сервера на основе атрибута homeMTA записи пользователя. Сложность в том, что средствами LDAP-карты мы можем только получить что-то из значения конкретного атрибута записи, удовлетворившей заданным критериям поиска в каталоге, "вырезать" что-то из DN-имени записи не получится. То есть если в записи сервиса, на которую ссылается атрибут homeMTA записи пользователя, есть атрибут, в котором указано DNS-имя (IP-адрес) сервера Exchange, то можно попытаться добыть это значение такой LDAP-картой:
server_host = 172.16.32.10, 172.16.32.11
server_port = 3268
domain = dom3.domain.ru
timeout = 60
scope = sub
bind_dn = CN=postfix,OU=Service_Accounts,OU=DOM3,DC=dom3,DC=corp,DC=local
bind_pw = Passw0rd
version = 3
search_base = DC=dom3,DC=corp,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)))
special_result_attribute = homeMTA
result_attribute = someAttributeWithExchageServerAddress
result_format = smpt:[%s]
Параметр special_result_attribute используется для организации рекурсивного поиска в записи, на которую указывает атрибут homeMTA, а в параметре result_attribute указывается тот атрибут, значением которого является имя Exchange-сервера (в примере я привёл фиктивное имя атрибута, его нужно заменить актуальным). Теоретически, рекурсия может быть многоступенчатой, но чтобы её грамотно организовать, нужно знать, как устроена сервисная запись "Microsoft MTA" (у меня её, повторюсь, нет). Про организацию рекурсивного поиска можно почитать в документации Postfix http://www.postfix.org/LDAP_README.html#example_group, конкретно второй случай с special.cf. О параметрах настройки LDAP-карт в man-странице ldap_table(5) (http://www.postfix.org/ldap_table.5.html).
Надеюсь, мои гипотетические умозаключения наведут вас на правильные мысли и решения =) .
Егор
-
Егор спасибо
у ексченжа есть свободные 15 кастом атрибутов в которые можно писать что хочешь, вписал IP
server_host =
172.16.32.10,
172.16.32.11
server_port = 3268
timeout = 60
search_base = DC=dom3,DC=corp,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(objectClass=user))
result_format = smtp:[%s]
domain = dom3.domain.ru
result_attribute = extensionAttribute1
scope = sub
bind_dn = CN=postfix,OU=Service_Accounts,OU=DOM3,DC=dom3,DC=corp,DC=local
bind_pw = Passw0rd
version = 3
Получил вывод как у вас
root@dom3-gw:/usr/local/etc/postfix # postmap -q john3@dom3.domain.ru ldap:./test.cf
smtp:[172.16.32.12]
но есть вопросы
получается это будет проверять наличие юзера в лдап
virtual_mailbox_maps = ldap:/usr/local/etc/postfix/ldap_corp.local.cf
и это
virtual_transport = ldap:/usr/local/etc/postfix/transport/ldap_transport_map.cf
какова последовательность обработки кто первый virtual_mailbox_maps или virtual_transport
может у virtual_mailbox_maps запрос оставить полный с проверкой на класс обьекта и исключать выключенные.
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user)(objectClass=group)))
а у virtual_transport поменьше
query_filter = proxyAddresses=smtp:%s
и еще
какая цель у транспорта по дефолту, hash:/usr/local/etc/postfix/transport
что там написать? и куда направить? в каком случае он может понадобиться?
попробовал изменить транспорт на ldap
почта идет, далее попробовал на другой адрес у которого нет кастом атрибута, все равно идет, обнаружил следующее
у меня в main.cf 2 параметра транспорта
transport_maps = hash:/usr/local/etc/postfix/transport
и
#virtual_transport = hash:/usr/local/etc/postfix/transport
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
выключил первый
#transport_maps = hash:/usr/local/etc/postfix/transport
в логах
relay=none, delay=0.16, delays=0.16/0/0/0, dsn=4.3.0, status=deferred (mail transport unavailable
вернул второй
virtual_transport = hash:/usr/local/etc/postfix/transport
#virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
relay=none, delay=0.27, delays=0.26/0/0/0.01, dsn=4.3.0, status=deferred (mail transport unavailable)
в обоих стаивить ldap ? или как отказаться от
#transport_maps = hash:/usr/local/etc/postfix/transport
-
Попробую ответить на Ваши вопросы.
Про последовательность обработки virtual_mailbox_maps и virtual_transport. Трудно сказать, это нужно хорошо знать внутреннюю кухню Postfix, подозреваю, что сначала обрабатывается virtual_mailbox_maps, а потом virtual_transport. В принципе, они независимы друг от друга, переживать особенно нечего. По здравому размышлению, от virtual_mailbox_maps в вашей ситуации вообще можно отказаться.
Кстати, я тут подумал на свежую голову: вы же не используете Postfix для доставки почты непосредственно в почтовые ящики, а пересылаете почту для доставки в Exchange. Поэтому вместо демона virtual (доставщика почты в виртуальные ящики), правильнее было бы настраивать демон relay с соответствующими параметрами relay_domains, relay_transport и (при необходимости) relay_recipient_maps.
Про указание двух карт в virtual_transport (через запятую). Они будут обрабатываться последовательно в порядке указания в параметре. Если первая вернёт ответ, вторая обрабатываться не будет (логическое "ИЛИ"). Вторую, дефолтную, я оставил на случай, если администратор забудет назначить в каталоге значение атрибута, который используется в транспортной LDAP-карте. Или можно назначить "нестандартную" транспортировку только тем, кому она действительно нужна, остальным получателям транспортировка будет по дефолту.
Про параметр transport_maps. В документации Postfix (http://www.postfix.org/postconf.5.html#transport_maps) толком не сказано, зачем он нужен. Подозреваю, что это глобальный дефолт для выбора транспорта, если определиться с транспортировкой из других карт (local_transport, virtual_transport, relay_transport) не удалось. Мне кажется, в вашем случае он задействуется потому, что "нестандартный" домен получателя не перечислен в параметре virtual_mailbox_domains, поэтому демон virtual вообще не задействуется для обработки письма и Postfix использует глобальные настройки транспортировки из transport_maps. Если привести в порядок virtual_mailbox_domains, то от transport_maps можно будет отказаться.
Кстати, если вы указываете в настройках LDAP-карты параметр domain, то в нём список доменов тоже должен быть исчерпывающим, иначе могут возникнуть непредвиденные трудности с доставкой. Или вообще откажитесь от использования этого параметра.
Про фильтр в параметре query_filter транспортной LDAP-карты. Я же просто показал вам пример, настраивайте, как считаете правильным для вашей ситуации.
-
в карте
domain = dom3.domain.ru
убрал почта идет
в конфиге
virtual_mailbox_domains = dom3.domain.ru
выключаю virtual_mailbox_domains
он становится virtual_mailbox_domains = $virtual_mailbox_maps
почта не идет
и в карте и в конфиге одно значение dom3.domain.ru
и еще возник вопрос, достаточным будет вывод из ldap для транспорта
smtp:[172.16.32.12]
по идее нужно так
familia-io@dom3.domain.ru smtp:[172.16.32.12]
попробовал и так и с email, сменил транспорт на центральный сервер, получается без дефолтного почта просто не идет а с ним она идет куда там прописано., без участия ldap запроса
выключаю virtual_transport
он становится virtual_transport = virtual
почта идет,
точно пользуется transport_maps
-
и еще возник вопрос, достаточным будет вывод из ldap для транспорта
smtp:[172.16.32.12]
по идее нужно так
familia-io@dom3.domain.ru smtp:[172.16.32.12]
Привильно так:
smtp:[172.16.32.12]
Это можно проверить с помощью статической карты, в которой у вас прописан конкретный адрес:
postmap -q familia-io@dom3.domain.ru hash:/usr/local/etc/postfix/transport
попробовал и так и с email, сменил транспорт на центральный сервер, получается без дефолтного почта просто не идет а с ним она идет куда там прописано., без участия ldap запроса
выключаю virtual_transport
он становится virtual_transport = virtual
почта идет,
точно пользуется transport_maps
Предлагаю не метаться, а добиться, чтобы у вас заработала транспортная LDAP-карта. Отключите transport_maps, а в настройках демона virtual оставьте так:
# transport_maps = ...
...
virtual_mailbox_domains = dom3.domain.ru
virtual_mailbox_maps = ldap:/usr/local/etc/postfix/ldap_dom3.corp.local.cf
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
Почта должна ходить только для тех пользователей, у которых прописан атрибут для транспортной LDAP-карты, для остальных -- нет. После того, как вы этого добьётесь, добавьте дефолтную статическую транспортную карту, чтобы почта ходила для всех остльных пользователей:
virtual_transport = ldap:/usr/local/etc/postfix/transport/ldap_transport_map.cf, hash:/usr/local/etc/postfix/transport
-
Egor добрый день
так и не смог я избавиться от
transport_maps
оставляю
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
лог такой
May 22 16:42:57 dom3-gw postfix/qmgr[36274]: warning: connect to transport private/ldap: No such file or directory
May 22 16:42:57 dom3-gw postfix/error[36282]: 2D2676556231: to=<john3@dom3.domain.ru>, relay=none, delay=0.17, delays=0.16/0/0/0.01, dsn=4.3.0, status=deferred (mail transport unavailable)
оставляю
virtual_transport = hash:/usr/local/etc/postfix/transport
лог такой
May 22 17:12:38 dom3-gw postfix/qmgr[36757]: warning: connect to transport private/hash: No such file or directory
May 22 17:12:38 dom3-gw postfix/error[36759]: 778B76556233: to=<john3@dom3.domain.ru>, relay=none, delay=0.28, delays=0.28/0/0/0, dsn=4.3.0, status=deferred (mail transport unavailable)
судя по private/hash и private/ldap то он видит строку и разницу в ней
убираю обе
transport_maps = hash:/usr/local/etc/postfix/transport
virtual_transport = hash:/usr/local/etc/postfix/transport
вижу такое
May 22 17:21:45 dom3-gw postfix/virtual[36885]: fatal: bad string length 0 < 1: virtual_mailbox_base =
May 22 17:21:46 dom3-gw postfix/master[36876]: warning: process /usr/local/libexec/postfix/virtual pid 36885 exit status 1
May 22 17:21:46 dom3-gw postfix/master[36876]: warning: /usr/local/libexec/postfix/virtual: bad command startup -- throttling
он сразу понимает что нет транспорта совсем
тоесть вот так у меня не работает
# transport_maps = ...
virtual_mailbox_domains = dom3.domain.ru
virtual_mailbox_maps = ldap:/usr/local/etc/postfix/ldap_dom3.corp.local.cf
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
убрал virtual_transport
изменил transport_maps на ldap c result_format = smtp:[%s] с поиском IP ексченжа
#transport_maps = hash:/usr/local/etc/postfix/transport
transport_maps = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
почта пошла в этот ящик с кастом атрибутом
в ящик без атрибута почта не пошла
May 22 19:05:32 dom3-gw postfix/virtual[37605]: fatal: bad string length 0 < 1: virtual_mailbox_base =
May 22 19:05:33 dom3-gw postfix/master[37594]: warning: process /usr/local/libexec/postfix/virtual pid 37605 exit status 1
May 22 19:05:33 dom3-gw postfix/master[37594]: warning: /usr/local/libexec/postfix/virtual: bad command startup -- throttling
подскажите что я упускаю
посмотрел примеры, либо обе строки transport_maps и virtual_transport либо одна transport_maps
сейчас попробую настроить с relay демоном но боюсь, что transport_maps вылезит все равно, он какой-то дефолтовый тут
postfix postfix-3.5.1_1
root@dom3-gw:/usr/local/etc/postfix # postconf -n
command_directory = /usr/local/sbin
compatibility_level = 2
daemon_directory = /usr/local/libexec/postfix
data_directory = /var/db/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
html_directory = /usr/local/share/doc/postfix
inet_interfaces = all
inet_protocols = ipv4
local_recipient_maps =
mail_owner = postfix
mailq_path = /usr/local/bin/mailq
manpage_directory = /usr/local/man
message_size_limit = 41943040
meta_directory = /usr/local/libexec/postfix
milter_default_action = accept
milter_protocol = 2
mydestination = $myhostname, localhost.$mydomain, localhost
mydomain = dom3.domain.ru
myhostname = mail1.dom3.domain.ru
mynetworks = 127.0.0.0/8, 172.16.32.12/32
mynetworks_style = host
myorigin = $mydomain
newaliases_path = /usr/local/bin/newaliases
non_smtpd_milters = inet:localhost:12301
proxy_interfaces =
queue_directory = /var/spool/postfix
readme_directory = /usr/local/share/doc/postfix
relay_domains = $mydestination
relayhost =
sample_directory = /usr/local/etc/postfix
sendmail_path = /usr/local/sbin/sendmail
setgid_group = maildrop
shlib_directory = /usr/local/lib/postfix
smtpd_client_restrictions = permit_mynetworks, check_client_access hash:/usr/local/etc/postfix/sender_access, reject_unauth_pipelining, reject_unknown_client_hostname, reject_rbl_client bl.spamcop.net, reject_rbl_client sbl.spamhaus.org, reject_rbl_client zen.spamhaus.org, reject_rbl_client aspews.ext.sorbs.net, check_reverse_client_hostname_access pcre:/usr/local/etc/postfix/reverse_hostname_access.pcre
smtpd_discard_ehlo_keywords = silent-discard, dsn
smtpd_etrn_restrictions = permit_mynetworks, reject
smtpd_helo_restrictions = permit_mynetworks, check_helo_access hash:/usr/local/etc/postfix/sender_access, reject_invalid_helo_hostname, reject_unknown_helo_hostname, reject_non_fqdn_helo_hostname
smtpd_milters = inet:localhost:12301
smtpd_recipient_restrictions = check_recipient_access hash:/usr/local/etc/postfix/recipient_access, permit_mynetworks, reject_unauth_destination check_policy_service inet:127.0.0.1:10023
smtpd_sender_restrictions = permit_mynetworks, check_sender_access hash:/usr/local/etc/postfix/sender_access, reject_non_fqdn_sender, reject_unverified_sender, reject_unknown_sender_domain
soft_bounce = no
unknown_local_recipient_reject_code = 550
virtual_mailbox_domains = dom3.domain.ru
virtual_mailbox_maps = ldap:/usr/local/etc/postfix/ldap_dom3.corp.local.cf
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
root@dom3-gw:/usr/local/etc/postfix #
root@dom3-gw:/usr/local/etc/postfix # postconf | grep transport
address_verify_default_transport = $default_transport
address_verify_local_transport = $local_transport
address_verify_relay_transport = $relay_transport
address_verify_sender_dependent_default_transport_maps = $sender_dependent_default_transport_maps
address_verify_transport_maps = $transport_maps
address_verify_virtual_transport = $virtual_transport
best_mx_transport =
default_transport = smtp
default_transport_rate_delay = 0s
defer_transports =
empty_address_default_transport_maps_lookup_key = <>
error_transport_rate_delay = $default_transport_rate_delay
fallback_transport =
fallback_transport_maps =
lmtp_transport_rate_delay = $default_transport_rate_delay
local_transport = local:$myhostname
local_transport_rate_delay = $default_transport_rate_delay
mailbox_transport =
mailbox_transport_maps =
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $sender_bcc_maps $recipient_bcc_maps $smtp_generic_maps $lmtp_generic_maps $alias_maps $smtpd_client_restrictions $smtpd_helo_restrictions $smtpd_sender_restrictions $smtpd_relay_restrictions $smtpd_recipient_restrictions $address_verify_sender_dependent_default_transport_maps $address_verify_sender_dependent_relayhost_maps $address_verify_transport_maps $fallback_transport_maps $lmtp_discard_lhlo_keyword_address_maps $lmtp_pix_workaround_maps $lmtp_sasl_password_maps $lmtp_tls_policy_maps $mailbox_command_maps $mailbox_transport_maps $postscreen_discard_ehlo_keyword_address_maps $rbl_reply_maps $sender_dependent_default_transport_maps $sender_dependent_relayhost_maps $smtp_discard_ehlo_keyword_address_maps $smtp_pix_workaround_maps $smtp_sasl_password_maps $smtp_tls_policy_maps $smtpd_discard_ehlo_keyword_address_maps $smtpd_milter_maps $virtual_gid_maps $virtual_uid_maps
relay_transport = relay
relay_transport_rate_delay = $default_transport_rate_delay
retry_transport_rate_delay = $default_transport_rate_delay
sender_dependent_default_transport_maps =
smtp_transport_rate_delay = $default_transport_rate_delay
transport_maps =
transport_retry_time = 60s
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
virtual_transport_rate_delay = $default_transport_rate_delay
root@dom3-gw:/usr/local/etc/postfix #
root@dom3-gw:/usr/local/etc/postfix # postconf | grep virtual
address_verify_virtual_transport = $virtual_transport
propagate_unmatched_extensions = canonical, virtual
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $sender_bcc_maps $recipient_bcc_maps $smtp_generic_maps $lmtp_generic_maps $alias_maps $smtpd_client_restrictions $smtpd_helo_restrictions $smtpd_sender_restrictions $smtpd_relay_restrictions $smtpd_recipient_restrictions $address_verify_sender_dependent_default_transport_maps $address_verify_sender_dependent_relayhost_maps $address_verify_transport_maps $fallback_transport_maps $lmtp_discard_lhlo_keyword_address_maps $lmtp_pix_workaround_maps $lmtp_sasl_password_maps $lmtp_tls_policy_maps $mailbox_command_maps $mailbox_transport_maps $postscreen_discard_ehlo_keyword_address_maps $rbl_reply_maps $sender_dependent_default_transport_maps $sender_dependent_relayhost_maps $smtp_discard_ehlo_keyword_address_maps $smtp_pix_workaround_maps $smtp_sasl_password_maps $smtp_tls_policy_maps $smtpd_discard_ehlo_keyword_address_maps $smtpd_milter_maps $virtual_gid_maps $virtual_uid_maps
unknown_virtual_alias_reject_code = 550
unknown_virtual_mailbox_reject_code = 550
virtual_alias_address_length_limit = 1000
virtual_alias_domains = $virtual_alias_maps
virtual_alias_expansion_limit = 1000
virtual_alias_maps = $virtual_maps
virtual_alias_recursion_limit = 1000
virtual_delivery_slot_cost = $default_delivery_slot_cost
virtual_delivery_slot_discount = $default_delivery_slot_discount
virtual_delivery_slot_loan = $default_delivery_slot_loan
virtual_delivery_status_filter = $default_delivery_status_filter
virtual_destination_concurrency_failed_cohort_limit = $default_destination_concurrency_failed_cohort_limit
virtual_destination_concurrency_limit = $default_destination_concurrency_limit
virtual_destination_concurrency_negative_feedback = $default_destination_concurrency_negative_feedback
virtual_destination_concurrency_positive_feedback = $default_destination_concurrency_positive_feedback
virtual_destination_rate_delay = $default_destination_rate_delay
virtual_destination_recipient_limit = $default_destination_recipient_limit
virtual_extra_recipient_limit = $default_extra_recipient_limit
virtual_gid_maps =
virtual_initial_destination_concurrency = $initial_destination_concurrency
virtual_mailbox_base =
virtual_mailbox_domains = dom3.domain.ru
virtual_mailbox_limit = 51200000
virtual_mailbox_lock = fcntl, dotlock
virtual_mailbox_maps = ldap:/usr/local/etc/postfix/ldap_dom3.corp.local.cf
virtual_minimum_delivery_slots = $default_minimum_delivery_slots
virtual_minimum_uid = 100
virtual_recipient_limit = $default_recipient_limit
virtual_recipient_refill_delay = $default_recipient_refill_delay
virtual_recipient_refill_limit = $default_recipient_refill_limit
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
virtual_transport_rate_delay = $default_transport_rate_delay
virtual_uid_maps =
root@dom3-gw:/usr/local/etc/postfix #
root@dom3-gw:/usr/local/etc/postfix # postconf | grep domain
append_dot_mydomain = ${{$compatibility_level} < {1} ? {yes} : {no}}
default_rbl_reply = $rbl_code Service unavailable; $rbl_class [$rbl_what] blocked using $rbl_domain${rbl_reason?; $rbl_reason}
fast_flush_domains = $relay_domains
maps_rbl_domains =
masquerade_domains =
mydestination = $myhostname, localhost.$mydomain, localhost
mydomain = dom3.domain.ru
myorigin = $mydomain
parent_domain_matches_subdomains = debug_peer_list,fast_flush_domains,mynetworks,permit_mx_backup_networks,qmqpd_authorized_clients,relay_domains,smtpd_access_maps
relay_domains = $mydestination
relay_domains_reject_code = 554
remote_header_rewrite_domain =
resolve_null_domain = no
resolve_numeric_domain = no
smtpd_sasl_local_domain =
smtpd_sender_restrictions = permit_mynetworks, check_sender_access hash:/usr/local/etc/postfix/sender_access, reject_non_fqdn_sender, reject_unverified_sender, reject_unknown_sender_domain
strict_mime_encoding_domain = no
virtual_alias_domains = $virtual_alias_maps
virtual_mailbox_domains = dom3.domain.ru
root@dom3-gw:/usr/local/etc/postfix #
root@dom3-gw:/usr/local/etc/postfix # postconf | grep relay
address_verify_relay_transport = $relay_transport
address_verify_relayhost = $relayhost
address_verify_sender_dependent_relayhost_maps = $sender_dependent_relayhost_maps
empty_address_relayhost_maps_lookup_key = <>
fast_flush_domains = $relay_domains
lmtp_fallback_relay =
luser_relay =
parent_domain_matches_subdomains = debug_peer_list,fast_flush_domains,mynetworks,permit_mx_backup_networks,qmqpd_authorized_clients,relay_domains,smtpd_access_maps
relay_clientcerts =
relay_delivery_slot_cost = $default_delivery_slot_cost
relay_delivery_slot_discount = $default_delivery_slot_discount
relay_delivery_slot_loan = $default_delivery_slot_loan
relay_destination_concurrency_failed_cohort_limit = $default_destination_concurrency_failed_cohort_limit
relay_destination_concurrency_limit = $default_destination_concurrency_limit
relay_destination_concurrency_negative_feedback = $default_destination_concurrency_negative_feedback
relay_destination_concurrency_positive_feedback = $default_destination_concurrency_positive_feedback
relay_destination_rate_delay = $default_destination_rate_delay
relay_destination_recipient_limit = $default_destination_recipient_limit
relay_domains = $mydestination
relay_domains_reject_code = 554
relay_extra_recipient_limit = $default_extra_recipient_limit
relay_initial_destination_concurrency = $initial_destination_concurrency
relay_minimum_delivery_slots = $default_minimum_delivery_slots
relay_recipient_limit = $default_recipient_limit
relay_recipient_maps =
relay_recipient_refill_delay = $default_recipient_refill_delay
relay_recipient_refill_limit = $default_recipient_refill_limit
relay_transport = relay
relay_transport_rate_delay = $default_transport_rate_delay
relayhost =
sender_dependent_relayhost_maps =
smtp_fallback_relay = $fallback_relay
smtpd_relay_restrictions = ${{$compatibility_level} < {1} ? {} : {permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination}}
unknown_relay_recipient_reject_code = 550
root@dom3-gw:/usr/local/etc/postfix #
попробовал с
relay_domains = dom3.domain.ru
relay_recipient_maps = ldap:/usr/local/etc/postfix/ldap_dom3.corp.local.cf
virtual_transport = ldap:/usr/local/etc/postfix/ldap_transport_map.cf
получил
May 22 22:52:48 be3-gw postfix/relay/smtp[39138]: DE1F76556231: to=<john3@dom3.domain.ru>, relay=none, delay=0.18, delays=0.16/0.01/0.02/0, dsn=5.4.6, status=bounced (mail for dom3.domain.ru loops back to myself)
еще подумал я над вторым "сложным вариантом" с рекурсией
обьект john у которого мы ищем ящик лежит тут
CN=john,OU=Users,OU=DOM3,DC=dom3,DC=corp,DC=local
у него есть атрибут homeMTA c DN CN=Microsoft MTA,CN=DOM3-MSG-01,CN=Servers,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=CORP,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=corp,DC=local
у CN=Microsoft MTA есть атрибут mTALocalDesig который имеет значение в чистом виде с именем сервера DOM3-MSG-01
но проблема в том что CN Microsoft MTA находится в другой ветке CN=Configuration,DC=corp,DC=local
поэтому такой запрос не сработает
server_host = ldap://172.16.32.10
search_base = DC=dom3,DC=corp,DC=local
query_filter = (proxyAddresses=smtp:%s)
result_format = smtp:[%s]
special_result_attribute = homeMTA
result_attribute = mTALocalDesig
вывод такой
root@dom3-gw:/usr/local/etc/postfix # postmap -q john3@dom3.domain.ru ldap:/usr/local/etc/postfix/ldap_transport_map.cf
postmap: warning: dict_ldap_get_values[1]: DN CN=Microsoft MTA,CN=DOM3-MSG-01,CN=Servers,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=CORP,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=corp,DC=local not found, skipping
postmap: warning: dict_ldap_lookup: Had some trouble with entries returned by search: No such object
root@dom3-gw:/usr/local/etc/postfix #
делаю так
server_host = ldap://172.16.32.10
search_base = DC=corp,DC=local
query_filter = (proxyAddresses=smtp:%s)
result_format = smtp:[%s]
special_result_attribute = homeMTA
result_attribute = mTALocalDesig
вывод такой
root@dom3-gw:/usr/local/etc/postfix # postmap -q john3@dom3.domain.ru ldap:/usr/local/etc/postfix/ldap_transport_map.cf
postmap: warning: dict_ldap_lookup: Search error 10: Referral
postmap: fatal: table ldap:/usr/local/etc/postfix/ldap_transport_map.cf: query error: No error: 0
root@dom3-gw:/usr/local/etc/postfix #
обращаюсь к центральному серверу с глобальным каталогом
server_host = ldap://172.16.10.10
search_base = DC=corp,DC=local
query_filter = (proxyAddresses=smtp:%s)
result_format = smtp:[%s]
special_result_attribute = homeMTA
result_attribute = mTALocalDesig
вывод пустой
root@dom3-gw:/usr/local/etc/postfix # postmap -q john3@dom3.domain.ru ldap:/usr/local/etc/postfix/ldap_transport_map.cf
root@dom3-gw:/usr/local/etc/postfix #
где я ошибся?
-
Простите, что не сразу отвечаю -- дел очень много, даже в выходные =( .
По поводу virtual_transport я посмотрел в документации postfix (http://www.postfix.org/VIRTUAL_README.html#in_virtual_other) -- всё-таки это не про транспортировку почты, а про раскладку писем в ящики. За транспортировку в чистом виде отвечает как раз transport_maps, так что всё верно. Поэтому предлагаю сделать так:
transport_maps = ldap:/usr/local/etc/postfix/transport/ldap_transport_map.cf, hash:/usr/local/etc/postfix/transport
А virtual_transport закомментировать вообще.
По второму вопросу посмотрю чуть позже.
-
По вопросу с отсылками (referrals). Теоретически, поисковый запрос LDAP можно заставить автоматически следовать по возвращаемым отсылкам и в настройках LDAP-карт (http://www.postfix.org/ldap_table.5.html) Postfix предусмотрена опция chase_referrals:
chase_referrals = yes
Но проблема в том, что переход по отсылкам происходит анонимно (https://www.openldap.org/lists/openldap-software/200707/msg00331.html), а AD требует аутентификации, поэтому фактически в случае с AD переход по отсылкам не выполняется.
То есть напрямую средствами Postfix задачу с такой рекурсией в AD решить не удастся. Можно в качестве обходного пути попытаться поднять прокси-каталог на OpenLDAP с бэкендом slapd-meta, который "склеит" AD-шные служебные каталоги в один, и перенаправить Postfix на него. Но стоит ли в данном случае игра свеч?
Егор
-
Добрый.
Понимаю, что тема старая. Вот что-то отдаленно похожее serverfault.com/questions/624413/postfix-splitting-domain-to-separate-mailstores-using-ldap