LINUX.ORG.RU
ФорумAdmin

Интеграция OPENLDAP и AD

 , ,


0

1

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

Есть контроллер домена (Windows 2008, dc1.dom.lan, 192.168.0.1) и почтовый сервер (FreeBSD+mysql+postfix+dovecot, 192.168.0.10). Адресную книгу часть почтовых клиентов получают из AD (LDAP). У другой части клиентов контроллер домена недоступен и они не могут подключиться к адресной книге. Необходимо на почтовом сервере настроить openldap-server как прокси к AD, чтобы почтовые клиенты, у которых нет прямого доступа к контроллеру домена, при настройке адресной книги указывали адрес почтового сервера и получали список контактов через него. Других функций openldap-server не несет.

Все пользователи AD хранятся в OU (Organizational Unit) = Users-LAN

Для доступа openldap-server к AD в Active Directory создана учетная запись readldap с минимальными правами (cn=Users)

Попытка реализации основана на статье (большое спасибо zgen!):
http://windowsitpro.com/networking/integrate-active-directory-and-openldap

Содержимое slapd.conf

include	/usr/local/etc/openldap/schema/core.schema
include	/usr/local/etc/openldap/schema/cosine.schema
include	/usr/local/etc/openldap/schema/inetorgperson.schema
include	/usr/local/etc/openldap/schema/nis.schema

pidfile		/var/run/openldap/slapd.pid
argsfile	/var/run/openldap/slapd.args

modulepath	/usr/local/libexec/openldap
moduleload	back_ldap
moduleload	back_bdb

database	ldap
suffix		"ou=Users-LAN,dc=dom,dc=lan"
subordinate
rebind-as-user
uri		"ldap://dc1.dom.lan/"
chase-referrals	yes

database	bdb
suffix		"dc=dom,dc=lan"
rootdn		"cn=readldap,cn=Users,dc=dom,dc=lan"
rootpw		"passldap"
directory	/var/db/openldap-data
index	objectClass	eq,pres
index	ou,cn,mail,surname,givenName	eq,pres,sub
index	uid		eq,pres,sub
Openldap-server запускается. В почтовом клиенте в адресной книге LDAP указываю адрес почтового сервера (ip 192.168.0.10, порт 389), почтовый клиент не ругается, но контакты из AD не отображает.

Укажите, пожалуйста, где ошибка или как ее найти. К сожалению, пока ldapsearch свободно не владею. Спасибо!



Последнее исправление: citmen (всего исправлений: 1)

Переписал slapd.conf таким образом:

database	ldap
readonly        on
suffix		"ou=Users-LAN,dc=dom,dc=lan"
uri		"ldap://dc1.dom.lan/"
idassert-bind   bindmethod=simple binddn="cn=readldap,cn=Users,dc=dom,dc=lan" credentials="passldap" "mode=none"
idassert-authzFrom "dn:*"
subordinate
rebind-as-user
chase-referrals	yes

database	bdb
suffix		"dc=dom,dc=lan"
rootdn		"cn=readldap,cn=Users,dc=dom,dc=lan"
rootpw		"passldap"
directory	/var/db/openldap-data
index	objectClass	eq,pres
index	ou,cn,mail,surname,givenName	eq,pres,sub
index	uid		eq,pres,sub
Если сделать такой запрос с консоли сервера:
ldapsearch -h localhost -x "mail=adm*" mail
то произойдет выборка всех учетных записей из AD, у которых заполненное поле mail начинается на adm

Ура! Работает! НО!!!

В почтовом клиенте в адресной книге LDAP прописываю ip-адрес openldap-server (192.168.0.10) и порт 389.

Открываю адресную книгу, ругни нет, контактов тоже нет. Смотрю в журнал сервера:
ACCEPT from IP=192.168.0.50:2747 (IP=192.168.0.10:389)
BIND dn="" method=128
RESULT tag=97 err=0 text=
SRCH base="" scope=0 deref=0 filter="(objectClass=*)"
SRCH attr=objectClass defaultNamingContext
SEARCH RESULT tag=101 err=0 nentries=1 text=
UNBIND
closed
База поиска пуста, сервер не знает где производить поиск. Но вот почему? Где ошибка? Помогите найти, пожалуйста! Спасибо!

citmen
() автор топика
Ответ на: комментарий от citmen
cat /etc/openldap/ldap.conf
ldapsearch -h localhost -x "objectclass=*" mail

А вообще смотри настройки почтовика на предмет basedn и фильтра.

Also, я бы убрал rebind-as-user, если у readldap достаточно привилегий, и поменял rootdn чтобы не перекрывался с проксированной учёткой. А если сервер только прокся, то вообще убрать нафиг bdb.

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

ldap.conf

BASE  ou=Users-LAN,dc=dom,dc=lan
URI   ldap://dc1.dom.lan
Я согласен, что BDB мне не нужен, но если я закомментирую этот блок в slapd.conf, то openldap-server вообще не стартует. В /var/log/debug.log так:
slapd[95341]: glue: no superior found for sub ou=Users-LAN,dc=dom,dc=lan
slapd[95341]: subordinate config error
Если раздел database bdb раскомментирован, то сам сервер с консоли отрабатывает любые запросы к AD правильно. Однако, запросы почтовых клиентов не отрабатывает, т.к. не подставляется (или не передается) база поиска, об этом я писал выше.

А настройки почтовика тут вообще ни при чем.

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

т.к. не подставляется (или не передается) база поиска

А настройки почтовика тут вообще ни при чем.

/0 Базу поиска передаёт клиент при поиске.

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

Я в клиенте прописывал базу поиска:

ou=Users-LAN,dc=dom,dc=lan
В журнале на сервере все равно так:
BIND dn="" method=128
SRCH base="" scope=0 deref=0 filter="(objectClass=*)"

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

А когда клиент напрямую к AD подключается, база поиска передаётся? Может там задействованы какие-то AD специфичные штуки. У AD есть лог, в котором видно что-нибудь похожее?

Если ldapsearch работает, то проблема, скорее всего не в сервере.

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

Если клиент подключается напрямую к AD, настройка базы поиска установлена «По умолчанию». Т.е. дополнительно ничего не прописывается. Сейчас у меня проблема в том, что сам openldap-server тянет инфу с AD ldap-запросами, а делать то же самое для почтовых клиентов не хочет. В чем проблема? Получается, что как прокси openldap-server не работает!

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

Работает. Почтовый клиент не передаёт базу поиска. Без этого openldap не знает где искать. AD, судя по всему знает. Быстрый гугл подкинул следующее:

dn: olcDatabase={-1}frontend,cn=config
changetype: modify
add: olcDefaultSearchBase
olcDefaultSearchBase: ou=users-lan,dc=dom,dc=lan

Это в olc. Как в slapd.conf перевести не знаю, я его не трогал. Попробуй, может быть поможет.

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

Для меня это было бы решение самое то! У меня единственная база поиска. Но как только добавляю в slapd.conf

defaultsearchbase ou=Users-LAN,dc=dom,dc=lan
openldap-server не стартует: failed to start slapd
Мне непонятны следующие моменты:
1. Если я в клиенте пишу путь к базе поиска, почему сервер не знает где искать?
2. Если я локально с сервера делаю запрос без указания базы поиска, он ищет там где надо!
3. Что означает директива subordinate? При ее наличии сервер не запускается. Ошибка выше.
Теперь надо понять, почему не приживается defaultsearchbase.

citmen
() автор топика
Ответ на: комментарий от Ivan_qrt

Я видимо ошибся с определением места размещения. Переместил в начало slapd.conf

defaultsearchbase "ou=Users-LAN,dc=dom,dc=lan"
и сервер запустился. Однако, почтовому клиенту список контактов так и не выдал.

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

добавляю в slapd.conf
defaultsearchbase ou=Users-LAN,dc=dom,dc=lan

Его надо добавлять к базе frontend.

Если я в клиенте пишу путь к базе поиска, почему сервер не знает где искать?

Похоже он его почему-то не передаёт.

Если я локально с сервера делаю запрос без указания базы поиска, он ищет там где надо!

Он берёт basedn из /etc/openldap/ldap.conf. Пропиши там бурду и всё сломается без указания базы (ldapsearch ... -b «ou=srch_base»).

Что означает директива subordinate? При ее наличии сервер не запускается. Ошибка выше.

То, что твоя база вложена в другую базу. Можешь её смело убрать и оставить только database ldap.

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

Спасибо за комментарии! В голове становится яснее! На данный момент slapd.conf имеет такой вид:

include		/usr/local/etc/openldap/schema/core.schema
include		/usr/local/etc/openldap/schema/cosine.schema
include		/usr/local/etc/openldap/schema/inetorgperson.schema
include		/usr/local/etc/openldap/schema/nis.schema
include		/usr/local/etc/openldap/schema/openldap.schema

allow bind_v2
pidfile		/var/run/openldap/slapd.pid
argsfile	/var/run/openldap/slapd.args

modulepath	/usr/local/libexec/openldap
moduleload	back_ldap

defaultsearchbase	"ou=Users-LAN,dc=dom,dc=lan"

database		ldap
suffix			"ou=Users-LAN,dc=dom,dc=lan"
uri			"ldap://dc1.dom.lan/"
idassert-bind		bindmethod=simple binddn="cn=readldap,ou=Users-LAN,dc=dom,dc=lan" credentials="passldap" "mode=none"
idassert-authzFrom	"dn:*"
chase-referrals		yes
access to * by * read
Почтовому клиенту список контактов не отображается. В журнале на сервере:
slapd[97278]: conn=1010 fd=9 ACCEPT from IP=192.168.0.50:1061 (IP=192.168.0.10:389)
slapd[97278]: conn=1010 op=0 BIND dn="" method=128
slapd[97278]: conn=1010 op=0 RESULT tag=97 err=0 text=
slapd[97278]: conn=1010 op=1 SRCH base="" scope=0 deref=0 filter="(objectClass=*)"
slapd[97278]: conn=1010 op=1 SRCH attr=objectClass defaultNamingContext
slapd[97278]: conn=1010 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
Ну как ему еще сказать, где искать?

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

Я плохо знаю, как должен выглядеть slapd.conf, но попробуй так (явно указать, что defaultsearchbase для frontend.):

include		/usr/local/etc/openldap/schema/core.schema
include		/usr/local/etc/openldap/schema/cosine.schema
include		/usr/local/etc/openldap/schema/inetorgperson.schema
include		/usr/local/etc/openldap/schema/nis.schema
include		/usr/local/etc/openldap/schema/openldap.schema

allow bind_v2
pidfile		/var/run/openldap/slapd.pid
argsfile	/var/run/openldap/slapd.args

modulepath	/usr/local/libexec/openldap
moduleload	back_ldap

database		frontend
defaultsearchbase	"ou=Users-LAN,dc=dom,dc=lan"

database		ldap
suffix			"ou=Users-LAN,dc=dom,dc=lan"
uri			"ldap://dc1.dom.lan/"
idassert-bind		bindmethod=simple binddn="cn=readldap,ou=Users-LAN,dc=dom,dc=lan" credentials="passldap" "mode=none"
idassert-authzFrom	"dn:*"
chase-referrals		yes
access to * by * read
Ivan_qrt ★★★★★
()
Ответ на: комментарий от Ivan_qrt

Если так:

database		frontend
defaultsearchbase	"ou=Users-LAN,dc=dom,dc=lan"
то сервер запускается, но почтовый клиент без контактов. В журнале тоже без изменений. Гуглю дальше на эту тему.

citmen
() автор топика
Ответ на: комментарий от Ivan_qrt

Наметился некоторый прогресс. Сейчас у меня в почтовом клиенте (Microsoft Outlook) поиск работает в разделе "Расширенный поиск". При этом доступен только пункт "Другие столбцы". А пункт "Только имя" недоступен (затенен серым цветом), поэтому полный список контактов не отображается. Поиск через строку поиска (кнопка НАЙТИ) также не работает. Кто-нибудь может сказать, с чем это связано? Мой slapd.conf на данный момент:

include		/usr/local/etc/openldap/schema/core.schema
include		/usr/local/etc/openldap/schema/cosine.schema
include		/usr/local/etc/openldap/schema/inetorgperson.schema
include		/usr/local/etc/openldap/schema/nis.schema
include		/usr/local/etc/openldap/schema/openldap.schema

allow bind_v2
pidfile		/var/run/openldap/slapd.pid
argsfile	/var/run/openldap/slapd.args

modulepath	/usr/local/libexec/openldap
moduleload back_ldap
moduleload rwm

defaultsearchbase "ou=Users-LAN,dc=dom,dc=lan"

idletimeout 60

access to * by * read

database ldap
readonly yes
rootdn "ou=Users-LAN,dc=dom,dc=lan"
suffix "ou=Users-LAN,dc=dom,dc=lan"
uri ldap://dc1.dom.lan
chase-referrals yes
idassert-bind bindmethod=simple binddn="cn=readldap,ou=Users-LAN,dc=dom,dc=lan" credentials="passldap" mode=none
idassert-authzFrom "dn:*"

overlay rwm
rwm-map objectclass account user
rwm-map attribute uid sAMAccountName
rwm-map attribute cn displayName
rwm-map attribute sn sn
rwm-map attribute mail mail

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

Плюсую анонимуса, rootdn надо убрать.

Ну и, думаю, rwm тебе не нужен. Тебе нужны атрибуты в том же виде, как и в AD, так что мапить их не надо.

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

Спасибо, коллеги, за помощь!

Действительно, в клиенте расширенный поиск работает и без rwm. Но весь список контактов не отображался.

Решение нашел на этой странице (спасибо автору!):
http://victor-sudakov.livejournal.com/124269.html
Для отображения контактов необходимо подключить и включить sssvlv. Текущее состояние slapd.conf:

include		/usr/local/etc/openldap/schema/core.schema
include		/usr/local/etc/openldap/schema/cosine.schema
include		/usr/local/etc/openldap/schema/inetorgperson.schema
include		/usr/local/etc/openldap/schema/nis.schema
include		/usr/local/etc/openldap/schema/openldap.schema

allow bind_v2
pidfile		/var/run/openldap/slapd.pid
argsfile	/var/run/openldap/slapd.args

modulepath	/usr/local/libexec/openldap
moduleload back_ldap
moduleload sssvlv

defaultsearchbase "ou=Users-LAN,dc=dom,dc=lan"

idletimeout 60

access to * by * read

database ldap
readonly yes
suffix "ou=Users-LAN,dc=dom,dc=lan"
overlay sssvlv
uri ldap://dc1.dom.lan
chase-referrals yes
idassert-bind bindmethod=simple binddn="cn=readldap,ou=Users-LAN,dc=dom,dc=lan" credentials="passldap" mode=none
idassert-authzFrom "dn:*"
Не устраивает то, КАК отображается список контактов. Если настроить адресную книгу напрямую на контроллер домена, то когда в Microsoft Outlook нажимаю кнопку КОМУ, то полный список контактов открывается сразу, причем в шапке отображаются названия столбцов (Имя, Адрес эл.почты, Служебный телефон, Размещение, Должность, Организация). Эти поля заполнены в AD.

Если же настроить адресную книгу на openldap-server, то при нажатии кнопки КОМУ в Microsoft Outlook список контактов не отображается, при этом переключатель установлен в значение «Только имя». И вот если теперь в поле «Найти» ввести какую-нибудь букву (или просто нажать пробел), то появляется полный список контактов в виде: Фамилия Имя Отчество (поле displayName в AD). При этом нет названия столбца. Другие столбцы не отображаются совсем.

Результат работы переключателя «Другие столбцы» точно такой же, как при прямой работе с адресной книгой AD.

Как сделать так, чтобы поведение общего списка контактов было такое же, как при прямом подключении к AD? Спасибо!

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