LINUX.ORG.RU
ФорумAdmin

Openldap AD Proxy ?

 , , ,


0

2

Прошу помочь понять схему работы Openldap.

Хочу настроить Openfire сервер для обслуживания двух доменов. Начитался про Openldap, говорят это то, что нужно. Но вот настроить никак не получается.

Есть Ubuntu Server 14.04.3 LTS, на нем Openfire 3.10.0 и установил slapd, ldap-utils. Две корпоративные сети соединены по VPN.

Хочется, чтобы пользователи двух доменов, могли авторизоваться на этом сервере Openfire. То есть нужно настроить Openldap, чтобы он запрашивал информацию у контролеров домена.

Пока пытаюсь настроить, чтобы Openldap видел хотя бы один домен.

Сейчас конфиг выглядит вот так:

cat /etc/ldap/ldap.conf
BASE    cn=users,cn=office,dc=company,dc=ru
URI     ldap://srv1.company.ru

cat /etc/ldap/slapd.conf
include     /etc/ldap/schema/core.schema
include     /etc/ldap/schema/cosine.schema
include     /etc/ldap/schema/inetorgperson.schema
include     /etc/ldap/schema/nis.schema
include     /etc/ldap/schema/samba.schema

modulepath              /var/lib/ldap
moduleload              back_ldap

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

defaultsearchbase "OU=users,OU=office,DC=company,DC=ru"

idletimeout 60

access to * by * read

### Proxy to AD company.ru ####################
database                ldap
suffix                  "OU=users,OU=office,DC=company,DC=ru"
readonly                yes
protocol-version        3
uri                     "ldap://srv1.company.ru"
rebind-as-user
idassert-bind bindmethod=simple
binddn= "CN=openfire,CN=Managed Service Accounts,DC=company,DC=ru"
rootpw {SSHA}ViOcMGF7U8VV+/NV7F4sQwM78
credentials=open
mode=none
idassert-authzFrom “*”

loglevel                0

Делаю рестарт сервера

sudo service slapd restart
 * Stopping OpenLDAP slapd                                                                                                                             [ OK ]
 * Starting OpenLDAP slapd                                                                                                                             [ OK ]

netstat -al
Активные соединения с интернетом (servers and established)
tcp        0      0 *:ldap                  *:*                     LISTEN
tcp6       0      0 [::]:ldap               [::]:*                  LISTEN

И вот тут я не могу понять работу сервера. Команда ldapsearch не выдает никаких результатов, хотя, как я понимаю, должна выдать все учетки в AD.

ldapsearch -h localhost -x
# extended LDIF
#
# LDAPv3
# base <cn=users,cn=office,dc=company,dc=ru> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1

Я решал точно такую же проблему. Совет - не мучай себя скрещиванием openldap с ad. Поставь adam (ad application manager или как оно там) на виртуалку, там же нарезай на группы для openfire чтоб основную директорию не загадить

upcFrost ★★★★★
()

Мой конфиг такой, всё работает.

dn: olcDatabase={3}ldap,cn=config
objectClass: olcDatabaseConfig
objectClass: olcLDAPConfig
olcDatabase: {3}ldap
olcSuffix: dc=ad,dc=local
olcDbURI: "ldaps://dc.ad.local:636"
olcDbRebindAsUser: TRUE
olcDbChaseReferrals: FALSE
olcDbNoRefs: TRUE

dn: olcOverlay=rwm,olcDatabase={3}ldap,cn=config
objectClass: olcOverlayConfig
objectClass: olcRwmConfig
olcOverlay: {0}rwm
olcRwmMap: attribute    uid                 samaccountname
olcRwmMap: attribute    x-local-edu-axcode  userprincipalname

В твоём непонятно, зачем binddn, если есть rebind-as-user.

Так же у тебя binddn и rootpw - это бред. Хочешь цепляться к ad под пользователем openfire, убери rebind-as-user, и замени rootpw на bindpw в не шифрованном виде. Хочешь цепляться к бд, как пользователь, убери binddn и bindpw. Они, имхо, не нужны.

Выкрути loglevel побольше и смотри, что пишет сервер, у него хорошие годные логи.

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

Оказывается в новых версия Openldap, вся настройка производится с помощью cn=config, а slapd.conf больше не используется. Причем, при изменении cn=config изменения применяются автоматически, без перезагрузки slapd.

Поправил конфиг /etc/ldap/slapd.d/cn=config.ldif

dn: olcDatabase={3}ldap,cn=config
objectClass: olcDatabaseConfig
objectClass: olcLDAPConfig
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: -1
olcPidFile: /var/run/slapd/slapd.pid
olcToolThreads: 1
structuralObjectClass: olcGlobal
olcDatabase: {3}ldap
olcSuffix: dc=company,dc=ru
olcDbURI: "ldap://srv1.company.ru"
olcDbRebindAsUser: TRUE
olcDbChaseReferrals: FALSE
olcDbNoRefs: TRUE

dn: olcOverlay=rwm,olcDatabase={3}ldap,cn=config
objectClass: olcOverlayConfig
objectClass: olcRwmConfig
olcOverlay: {0}rwm
olcRwmMap: attribute    uid                 samaccountname
olcRwmMap: attribute    x-local-edu-axcode  userprincipalname

Теперь другая ошибка.

ldapsearch -h localhost -x
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

Пока разбираюсь.

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

Команда ldapsearch -x -H ldap://srv1.company.ru -D admin -W и соответственно пароль доменного админа, выдает список пользователей домена. Но вот как теперь подружить локальный ldap сервер с AD, чтобы запросы перенаправлялись к нему?

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

А покажи весь файл cn=config.ldif ? Что-то я на нем застрял теперь. Я правильно понимаю, что вручную его нельзя редактировать? А какой командой заносить изменения?

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

Config.ldif у меня разбросан по многим файлам.

olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: -1
olcPidFile: /var/run/slapd/slapd.pid
olcToolThreads: 1
structuralObjectClass: olcGlobal

Убери это из olcDatabase. Перемести в dn: cn=config. Оно к olcdatabase не имеет отношения. Убедись, что у тебя только одна база хочет работать как прокси, остальные убери.

Запусти ldapsearch .... -d 9. Если ad не позволяет анонимный поиск, то задай пользователя (обязательно через dn). Смотри на выхлоп, на каком этапе отваливается.

Проверь телнетом доступность 389 порта telnet localhost 389.

Что пишет в логе? Соединение сервером принимается или нет? Возможно имеет смысл уменьшить loglevel (хз до какого значения, мне всегда дефолта хватало, olcloglevel вообще не задан), а то замучаешься искать нужную информацию.

Редактировать руками можно, но лучше ldapmodify'ем. Правда по-моему опыту, openldap любит падать на кривых ldif'ах, применяемых из-под rootdn, так что не удивляйся.

Ivan_qrt ★★★★★
()

Поправил конфиг, теперь выглядит вот так:

cat /etc/ldap/slapd.d/cn\=config.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
dn: cn=config
objectClass: olcGlobal
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: -1
olcPidFile: /var/run/slapd/slapd.pid
olcToolThreads: 1
structuralObjectClass: olcGlobal
entryUUID: c7d7eb78-2236-1035-990f-df20bb194192
creatorsName: cn=config
createTimestamp: 20151118115351Z
entryCSN: 20151118115351.705929Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20151118115351Z
olcAllows: bind_v2

dn: olcDatabase={3}ldap,cn=config
objectClass: olcDatabaseConfig
objectClass: olcLDAPConfig
olcDatabase: {3}ldap
olcSuffix: dc=company,dc=ru
olcDbURI: "ldaps://srv1.company.ru"
olcDbRebindAsUser: TRUE
olcDbChaseReferrals: FALSE
olcDbNoRefs: TRUE

dn: olcOverlay=rwm,olcDatabase={3}ldap,cn=config
objectClass: olcOverlayConfig
objectClass: olcRwmConfig
olcOverlay: {0}rwm
olcRwmMap: attribute    uid                 samaccountname
olcRwmMap: attribute    x-local-edu-axcode  userprincipalname
Сервер запустился без ошибок.

Телнет работает

telnet localhost 389
Trying ::1...
Connected to localhost.
Escape character is '^]'.

Но не смог подключиться, видимо неправильно строчку коннекта задаю

ldapsearch .... -d  9 dn=admin
ldap_create
ldap_pvt_sasl_getmech
ldap_search
put_filter: "(objectclass=*)"
put_filter: simple
put_simple_filter: "objectclass=*"
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP 127.0.0.1:389
ldap_new_socket: 3
ldap_prepare_socket: 3
ldap_connect_to_host: Trying 127.0.0.1:389
ldap_pvt_connect: fd: 3 tm: -1 async: 0
ldap_open_defconn: successful
ldap_send_server_request
ber_scanf fmt ({it) ber:
ber_scanf fmt ({) ber:
ber_flush2: 64 bytes to sd 3
ldap_result ld 0x7f37e2d9c100 msgid 1
wait4msg ld 0x7f37e2d9c100 msgid 1 (infinite timeout)
wait4msg continue ld 0x7f37e2d9c100 msgid 1 all 1
** ld 0x7f37e2d9c100 Connections:
* host: 127.0.0.1  port: 389  (default)
  refcnt: 2  status: Connected
  last used: Thu Nov 19 09:20:00 2015


** ld 0x7f37e2d9c100 Outstanding Requests:
 * msgid 1,  origid 1, status InProgress
   outstanding referrals 0, parent count 0
  ld 0x7f37e2d9c100 request count 1 (abandoned 0)
** ld 0x7f37e2d9c100 Response Queue:
   Empty
  ld 0x7f37e2d9c100 response count 0
ldap_chkResponseList ld 0x7f37e2d9c100 msgid 1 all 1
ldap_chkResponseList returns ld 0x7f37e2d9c100 NULL
ldap_int_select
read1msg: ld 0x7f37e2d9c100 msgid 1 all 1
ber_get_next
ber_get_next: tag 0x30 len 66 contents:
read1msg: ld 0x7f37e2d9c100 msgid 1 message type search-entry
wait4msg continue ld 0x7f37e2d9c100 msgid 1 all 1
** ld 0x7f37e2d9c100 Connections:
* host: 127.0.0.1  port: 389  (default)
  refcnt: 2  status: Connected
  last used: Thu Nov 19 09:20:00 2015


** ld 0x7f37e2d9c100 Outstanding Requests:
 * msgid 1,  origid 1, status InProgress
   outstanding referrals 0, parent count 0
  ld 0x7f37e2d9c100 request count 1 (abandoned 0)
** ld 0x7f37e2d9c100 Response Queue:
 * msgid 1,  type 100
  ld 0x7f37e2d9c100 response count 1
ldap_chkResponseList ld 0x7f37e2d9c100 msgid 1 all 1
ldap_chkResponseList returns ld 0x7f37e2d9c100 NULL
ldap_int_select
read1msg: ld 0x7f37e2d9c100 msgid 1 all 1
ber_get_next
ber_get_next: tag 0x30 len 12 contents:
read1msg: ld 0x7f37e2d9c100 msgid 1 message type search-result
ber_scanf fmt ({eAA) ber:
read1msg: ld 0x7f37e2d9c100 0 new referrals
read1msg:  mark request completed, ld 0x7f37e2d9c100 msgid 1
request done: ld 0x7f37e2d9c100 msgid 1
res_errno: 0, res_error: <>, res_matched: <>
ldap_free_request (origid 1, msgid 1)
adding response ld 0x7f37e2d9c100 msgid 1 type 101:
ldap_parse_result
ber_scanf fmt ({iAA) ber:
ber_scanf fmt (}) ber:
ldap_get_values
ber_scanf fmt ({x{{a) ber:
ber_scanf fmt ([v]) ber:
ldap_msgfree
ldap_sasl_interactive_bind: server supports: DIGEST-MD5 NTLM CRAM-MD5
ldap_int_sasl_bind: DIGEST-MD5 NTLM CRAM-MD5
ldap_int_sasl_open: host=openfire
SASL/DIGEST-MD5 authentication started
ldap_sasl_bind
ldap_send_initial_request
ldap_send_server_request
ber_scanf fmt ({it) ber:
ber_scanf fmt ({i) ber:
ber_flush2: 26 bytes to sd 3
ldap_msgfree
ldap_result ld 0x7f37e2d9c100 msgid 2
wait4msg ld 0x7f37e2d9c100 msgid 2 (infinite timeout)
wait4msg continue ld 0x7f37e2d9c100 msgid 2 all 1
** ld 0x7f37e2d9c100 Connections:
* host: 127.0.0.1  port: 389  (default)
  refcnt: 2  status: Connected
  last used: Thu Nov 19 09:20:00 2015


** ld 0x7f37e2d9c100 Outstanding Requests:
 * msgid 2,  origid 2, status InProgress
   outstanding referrals 0, parent count 0
  ld 0x7f37e2d9c100 request count 1 (abandoned 0)
** ld 0x7f37e2d9c100 Response Queue:
   Empty
  ld 0x7f37e2d9c100 response count 0
ldap_chkResponseList ld 0x7f37e2d9c100 msgid 2 all 1
ldap_chkResponseList returns ld 0x7f37e2d9c100 NULL
ldap_int_select
read1msg: ld 0x7f37e2d9c100 msgid 2 all 1
ber_get_next
ber_get_next: tag 0x30 len 261 contents:
read1msg: ld 0x7f37e2d9c100 msgid 2 message type bind
ber_scanf fmt ({eAA) ber:
read1msg: ld 0x7f37e2d9c100 0 new referrals
read1msg:  mark request completed, ld 0x7f37e2d9c100 msgid 2
request done: ld 0x7f37e2d9c100 msgid 2
res_errno: 14, res_error: <SASL(0): successful result: security flags do not match required>, res_matched: <>
ldap_free_request (origid 2, msgid 2)
ldap_int_sasl_bind: <null>
ldap_parse_sasl_bind_result
ber_scanf fmt ({eAA) ber:
ber_scanf fmt (O) ber:
ldap_parse_result
ber_scanf fmt ({iAA) ber:
ber_scanf fmt (x) ber:
ber_scanf fmt (}) ber:
sasl_client_step: 2
Please enter your password:
sasl_client_step: 1
ldap_sasl_bind
ldap_send_initial_request
ldap_send_server_request
ber_scanf fmt ({it) ber:
ber_scanf fmt ({i) ber:
ber_flush2: 298 bytes to sd 3
ldap_msgfree
ldap_result ld 0x7f37e2d9c100 msgid 3
wait4msg ld 0x7f37e2d9c100 msgid 3 (infinite timeout)
wait4msg continue ld 0x7f37e2d9c100 msgid 3 all 1
** ld 0x7f37e2d9c100 Connections:
* host: 127.0.0.1  port: 389  (default)
  refcnt: 2  status: Connected
  last used: Thu Nov 19 09:20:04 2015


** ld 0x7f37e2d9c100 Outstanding Requests:
 * msgid 3,  origid 3, status InProgress
   outstanding referrals 0, parent count 0
  ld 0x7f37e2d9c100 request count 1 (abandoned 0)
** ld 0x7f37e2d9c100 Response Queue:
   Empty
  ld 0x7f37e2d9c100 response count 0
ldap_chkResponseList ld 0x7f37e2d9c100 msgid 3 all 1
ldap_chkResponseList returns ld 0x7f37e2d9c100 NULL
ldap_int_select
read1msg: ld 0x7f37e2d9c100 msgid 3 all 1
ber_get_next
ber_get_next: tag 0x30 len 60 contents:
read1msg: ld 0x7f37e2d9c100 msgid 3 message type bind
ber_scanf fmt ({eAA) ber:
read1msg: ld 0x7f37e2d9c100 0 new referrals
read1msg:  mark request completed, ld 0x7f37e2d9c100 msgid 3
request done: ld 0x7f37e2d9c100 msgid 3
res_errno: 49, res_error: <SASL(-13): user not found: no secret in database>, res_matched: <>
ldap_free_request (origid 3, msgid 3)
ldap_int_sasl_bind: <null>
ldap_parse_sasl_bind_result
ber_scanf fmt ({eAA) ber:
ldap_parse_result
ber_scanf fmt ({iAA) ber:
ber_scanf fmt (}) ber:
ldap_msgfree
ldap_err2string
ldap_sasl_interactive_bind_s: Invalid credentials (49)
        additional info: SASL(-13): user not found: no secret in database
ldap_free_connection 1 1
ldap_send_unbind
ber_flush2: 7 bytes to sd 3
ldap_free_connection: actually freed

Что-то тег CUT не срабатывает

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

Во-первых, почитай howto к ldapsearch, разберись в его опциях.

Во-вторых, надо определить dn твоего администратора в ad.

ldapsearch -xWD "admin" -H "ldap:///srv1.company.ru" -b "dc=company,dc=ru" dn

После этого:

ldapsearch -xWD "Тот dn, который ты получил в предыдущем поиске" -H "ldap://localhost" -b "dc=company,dc=ru"

Если последняя команда не работает, то запускаешь с -d 9, изучаешь выхлоп; смотришь лог сервера, изучаешь.

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

Команда, только с двумя слэшами заработала.

ldapsearch -xWD "admin" -H "ldap://srv1.company.ru" -b "dc=company,dc=ru" dn
Выдала все учетки из AD, среди них нашел встроенного админа:

# admin, Users, company.ru
dn: CN=admin,CN=Users,DC=company,DC=ru

Подставляю в команду:

ldapsearch -xWD "CN=admin,CN=Users,DC=company,DC=ru" -H "ldap://localhost" -b "dc=company,dc=ru"
Выдал ошибку
ldap_bind: Invalid credentials (49)

В дебаге -d9 нет никаких полезных подробностей

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

А что должно быть в /etc/ldap/ldap.conf ? Или он не читается, а все берется из cn=config.ldif ? Объясните, пожалуйста.

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

ldap.conf - это дефолты, которые используются клиентами, если они не указаны явно.

BASE            dc=example,dc=local
URI             ldaps://ldap0.example.local:636/
SIZELIMIT       unlimited
TIMELIMIT       unlimited
TLS_CACERT      /etc/pki/tls/certs/ca.crt
SASL_NOCANON    on

только с двумя слэшами заработала

Да, опечатка, а ещё я фильтр «samaccountname=admin» забыл. Но не суть, dn админа найден.

ldap_bind: Invalid credentials (49)

В логе сервера что?

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

Не осилил openldap. В итоге применил другое решение с добавлением пользователей.

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