Форум проекта Pro-LDAP.ru

Общие вопросы по LDAP => Общий раздел => Тема начата: marawu от 03 Ноябрь 2017, 11:38:16

Название: Использование динамических групп
Отправлено: marawu от 03 Ноябрь 2017, 11:38:16
Добрый день, подскажите пожалуйста по динамическим группам.


Задача: есть сервис mediawiki. Нужно сделать группу в которую будут входить все группы. Я подключил модуль для динамических групп, сделал оверлей, создал группу с нужным мне фильтром:



dn: olcOverlay={3}dynlist,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcDynamicList
olcOverlay: {3}dynlist
olcDlAttrSet: {0}groupOfURLs memberURL member



dn: cn=users,ou=wiki,ou=Service,ou=Groups,dc=domain,dc=ru
objectClass: groupOfURLs
cn: users
memberURL: ldaps:///ou=People,dc=domain,dc=ru??one?(&(objectClass=inetOrgPerson)(!(memberof=cn=namegroup,ou=Groups,dc=domain,dc=ru)))


Но wiki отправляет запрос такого формата:



Nov  3 15:34:31 ldap01 slapd[6634]: conn=13908 fd=19 ACCEPT from IP=192.168.250.31:52026 (IP=0.0.0.0:636)
Nov  3 15:34:31 ldap01 slapd[6634]: conn=13908 fd=19 TLS established tls_ssf=256 ssf=256
Nov  3 15:34:31 ldap01 slapd[6634]: conn=13908 op=0 BIND dn="uid=wiki,ou=sUsers,dc=domain,dc=ru" method=128
Nov  3 15:34:31 ldap01 slapd[6634]: conn=13908 op=0 BIND dn="uid=wiki,ou=sUsers,dc=domain,dc=ru" mech=SIMPLE ssf=0
Nov  3 15:34:31 ldap01 slapd[6634]: conn=13908 op=0 RESULT tag=97 err=0 text=
Nov  3 15:34:31 ldap01 slapd[6634]: conn=13908 op=1 SRCH base="ou=wiki,ou=Service,ou=Groups,dc=domain,dc=ru" scope=2 deref=0 filter="(&(member=uid=user.name,ou=people,dc=domain,dc=ru)(objectClass=groupOfURLs))"
Nov  3 15:34:31 ldap01 slapd[6634]: conn=13908 op=1 SEARCH RESULT tag=101 err=0 nentries=0 text=
Nov  3 15:34:31 ldap01 slapd[6634]: conn=13908 op=2 UNBIND
Nov  3 15:34:31 ldap01 slapd[6634]: conn=13908 fd=19 closed


На выходе ничего нет, потому-что, насколько я понимаю, члены группы в явном виде неуказанны. Возможно есть какие-то другие механизмы, которые помогут мне содержать группу в актуальном состоянии без постоянного вмешательства? Либо я что-то не так понял?
Название: Re: Использование динамических групп
Отправлено: egor от 03 Ноябрь 2017, 13:39:03
Здравствуйте, Никита! К сожалению, это действительно проблема =( . Суть в том, наполнение группы динамическими членами происходит уже после того, как отработан отбор записей по фильтру. То есть, на момент работы фильтра динамических членов ещё нет в записи группы.

Попробуйте наложение autogroup (в Ubuntu оно идёт в стандартном deb-пакете), см. пример здесь (https://stackoverflow.com/questions/24762149/openldap-dynamic-groups-not-searching-by-member). Оно поддерживает "настоящих" членов в группе при добавлении/модификации/удалении записей пользователей, то есть атрибуты member добавляются/удаляются непосредственно в записи группы, и по таким членам фильтр работать будет.

Второй вариант -- сделать некий прокси, например на slapd-relay (https://pro-ldap.ru/tr/man/slapd-relay.5.html), и по полученным записям (в которых уже будут динамические члены в группах) выполнять поиск с фильтром (member=uid=...).

Егор
Название: Re: Использование динамических групп
Отправлено: marawu от 03 Ноябрь 2017, 22:22:04
Попробуйте наложение autogroup (в Ubuntu оно идёт в стандартном deb-пакете), см. пример здесь (https://stackoverflow.com/questions/24762149/openldap-dynamic-groups-not-searching-by-member). Оно поддерживает "настоящих" членов в группе при добавлении/модификации/удалении записей пользователей, то есть атрибуты member добавляются/удаляются непосредственно в записи группы, и по таким членам фильтр работать будет.
Егор

Сегодня кстати натыкался на эту ветку. В понедельник попробую, правда я использую centos, но не думаю, что найти модуль будет проблемой:) Спасибо за наводку, попробую - отпишусь
Название: Re: Использование динамических групп
Отправлено: marawu от 07 Ноябрь 2017, 10:38:33
Егор, добрый день. Не могу настроить я autogroup :( В общем удалил я у dynlist лишнее (правда сделал это после того, как добавил autogroup):



dn: olcOverlay={3}dynlist,olcDatabase={1}mdb,cn=config
changetype: modify
delete: olcDlAttrSet


Скопировал с debian 9 модуль autogroup.la (поскольку только там версии либ были такие же как у меня centOS) и сделал симлинки:



[root@ldap01 ldap]# ls -l /usr/lib64/openldap/autogroup.*
-rwxr-xr-x 1 root root   954 Nov  7 12:53 /usr/lib64/openldap/autogroup.la
lrwxrwxrwx 1 root root    18 Nov  7 12:57 /usr/lib64/openldap/autogroup.so -> autogroup.so.0.0.0
lrwxrwxrwx 1 root root    18 Nov  7 12:57 /usr/lib64/openldap/autogroup.so.0 -> autogroup.so.0.0.0
-rwxr-xr-x 1 root root 39096 Nov  7 12:53 /usr/lib64/openldap/autogroup.so.0.0.0


Добавил в конфигурацию:



dn: olcOverlay=autogroup,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcAutomaticGroups
olcOverlay: autogroup
olcAGattrSet: groupOfURLs memberURL member
olcAGmemberOfAd: memberOf


Удалил группу и добавил её  же по новой:



dn: cn=users,ou=wiki,ou=Service,ou=Groups,dc=domain,dc=ru
objectClass: groupOfURLs
cn: users
memberURL: ldaps:///ou=People,dc=domain,dc=ru??one?(&(objectClass=inetOrgPerson)(!(memberof=cn=name.group,ou=Groups,dc=domain,dc=ru)))


Делаю запрос группы через ldapsearch, но там никого нет:(
Название: Re: Использование динамических групп
Отправлено: marawu от 07 Ноябрь 2017, 11:08:41
Егор, добрый день. Не могу настроить я autogroup :(

Перезапустил slapd и содержимое группы появилось, только какое-то странное, там просто перечислены все атрибуты пользователей. Я подредатировал поиск только по uid, но ведь у меня по факту должны быть атрибуты member, так ведь?
Название: Re: Использование динамических групп
Отправлено: egor от 23 Ноябрь 2017, 06:57:15
Здравствуйте, Никита!
Поэкспериментировал с autogroup. Несколько выводов:
1. В старых версиях OpenLDAP (до 2.4.40) это наложение работает очень плохо, чуть что сразу вываливается и вешает slapd. У меня дома на ubuntu 14.04 (openldap-2.4.31) всё работало ужасно, собрал из исходников  версию 2.4.45 -- стало гораздо лучше.
2. Если автогруппа добавлена, когда в каталоге уже есть учётки пользователей, то эти существующие учётки не попадут в неё в качестве member. Чтобы что-то произошло с автогруппой, нужно выполнить операцию с учётной записью пользователя (add, delete, modify, modrdn). Вывод: либо добавлять учётки пользователей после добавления автогруппы, либо сделать какую-нибудь фиктивную модификацию уже имеющихся учёток.

Ну а так Вашу задачу мне удалось успешно реализовать. slapd.conf:
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema
include         /etc/ldap/schema/dyngroup.schema

moduleload      back_mdb.so
moduleload      memberof.so
moduleload      autogroup.so

database        mdb
directory       /data/openldap-experiments/2017-11-21_autogroup_memberof_filter/db/
suffix          dc=mycompany,dc=ru
rootDN          cn=manager,dc=mycompany,dc=ru
rootPW          test

overlay memberof
memberof-group-oc       groupOfNames
memberof-member-ad      member
memberof-memberof-ad    memberOf

overlay autogroup
autogroup-attrset       groupOfURLs memberURL member

Первоначальное наполнение каталога 01-init.ldif:
dn: dc=mycompany,dc=ru
objectClass: organization
objectClass: dcObject
dc: mycompany
o: My Company

dn: ou=People,dc=mycompany,dc=ru
objectClass: organizationalUnit
ou: People

dn: ou=Groups,dc=mycompany,dc=ru
objectClass: organizationalUnit
ou: People
ou: Groups

dn: cn=StatGroup,ou=Groups,dc=mycompany,dc=ru
objectClass: groupOfNames
objectClass: extensibleObject
cn: StatGroup
gidNumber: 11001
member: cn=dummy

dn: cn=AutoGroup,ou=Groups,dc=mycompany,dc=ru
objectClass: groupOfURLs
objectClass: extensibleObject
cn: AutoGroup
gidNumber: 11002
memberURL: ldap:///ou=People,dc=mycompany,dc=ru??sub?(&(objectClass=inetOrgPerson)(!(memberOf=cn=StatGroup,ou=Groups,dc=mycompany,dc=ru)))

Добавляем пользователей (02-add_users.ldif):
dn: uid=ivanov,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
objectClass: posixAccount
uid: ivanov
cn: Ivan Ivanov
sn: Ivanov
userPassword: 123
uidNumber: 11001
gidNumber: 11001
homeDirectory: /home/ivanov
loginShell: /bin/bash

dn: uid=petrov,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
objectClass: posixAccount
uid: petrov
cn: Petr Petrov
sn: Petrov
userPassword: 123
uidNumber: 11002
gidNumber: 11001
homeDirectory: /home/petrov
loginShell: /bin/bash

dn: uid=sidorov,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
objectClass: posixAccount
uid: sidorov
cn: Sidor Sidorov
sn: Sidorov
userPassword: 123
uidNumber: 11003
gidNumber: 11001
homeDirectory: /home/sidorov
loginShell: /bin/bash

Что в каталоге:
$ ldapsearch -xLLL -H ldap://127.1:9000 -b dc=mycompany,dc=ru '(|(memberOf=*)(member=*))' memberOf member
dn: cn=StatGroup,ou=Groups,dc=mycompany,dc=ru
member: cn=dummy

dn: cn=AutoGroup,ou=Groups,dc=mycompany,dc=ru
member: uid=ivanov,ou=People,dc=mycompany,dc=ru
member: uid=petrov,ou=People,dc=mycompany,dc=ru
member: uid=sidorov,ou=People,dc=mycompany,dc=ru

Добавим члена в статическую группу (03-add_member.ldif):
dn: cn=StatGroup,ou=Groups,dc=mycompany,dc=ru
changetype: modify
add: member
member: uid=petrov,ou=People,dc=mycompany,dc=ru

Что в каталоге:
$ ldapsearch -xLLL -H ldap://127.1:9000 -b dc=mycompany,dc=ru '(|(memberOf=*)(member=*))' memberOf member
dn: cn=StatGroup,ou=Groups,dc=mycompany,dc=ru
member: cn=dummy
member: uid=petrov,ou=People,dc=mycompany,dc=ru

dn: cn=AutoGroup,ou=Groups,dc=mycompany,dc=ru
member: uid=ivanov,ou=People,dc=mycompany,dc=ru
member: uid=sidorov,ou=People,dc=mycompany,dc=ru

dn: uid=petrov,ou=People,dc=mycompany,dc=ru
memberOf: cn=StatGroup,ou=Groups,dc=mycompany,dc=ru

Удалим члена из статической группы (04-del_member.ldif):
dn: cn=StatGroup,ou=Groups,dc=mycompany,dc=ru
changetype: modify
delete: member
member: uid=petrov,ou=People,dc=mycompany,dc=ru

Что в каталоге:
$ ldapsearch -xLLL -H ldap://127.1:9000 -b dc=mycompany,dc=ru '(|(memberOf=*)(member=*))' memberOf member
dn: cn=StatGroup,ou=Groups,dc=mycompany,dc=ru
member: cn=dummy

dn: cn=AutoGroup,ou=Groups,dc=mycompany,dc=ru
member: uid=ivanov,ou=People,dc=mycompany,dc=ru
member: uid=petrov,ou=People,dc=mycompany,dc=ru
member: uid=sidorov,ou=People,dc=mycompany,dc=ru

Всё работает так, как Вы хотели.
Егор
Название: Re: Использование динамических групп
Отправлено: marawu от 24 Ноябрь 2017, 09:37:08
Егор, спасибо за проделанную работу. Буду у себя тестировать и проверять. Но я так понимаю, чтобы это заработало, нужно минимум версию 2.4.45?
Название: Re: Использование динамических групп
Отправлено: egor от 24 Ноябрь 2017, 12:51:20
Но я так понимаю, чтобы это заработало, нужно минимум версию 2.4.45?

Судя по этой ветке (https://www.openldap.org/lists/openldap-bugs/201407/msg00047.html), проблемы исправлены в июле 2014 года, то есть первая "исправная" версия наложения попала в OpenLDAP-2.4.40.

Егор
Название: Re: Использование динамических групп
Отправлено: marawu от 29 Ноябрь 2017, 15:58:21
Егор, добрый день. Извините, но ещё вопрос остался.


overlay autogroup
autogroup-attrset       groupOfURLs memberURL member

Я так же бы хотел использовать dyngroup для некоторых случаев, и там я тоже использую атрибуты groupOfURLs memberURL member. Я так понимаю и там и там их использовать нельзя, иначе они будут "перекрывать" друг друга. Или я не прав?
Название: Re: Использование динамических групп
Отправлено: egor от 30 Ноябрь 2017, 07:49:38
Я так же бы хотел использовать dyngroup для некоторых случаев, и там я тоже использую атрибуты groupOfURLs memberURL member. Я так понимаю и там и там их использовать нельзя, иначе они будут "перекрывать" друг друга. Или я не прав?

Если оставить в настройках обоих наложений одни и те же объектный класс и атрибут с URL, то перекрытие, конечно же, будет. Не пробовал, но предположу, что в итоге у Вас будет двойной набор атрибутов member: реальные и динамические члены, что, конечно, неправильно, да и вряд ли это то, что Вам нужно.

Но выкрутиться, как всегда, можно. Просто определите разные настройки для разных наложений:
overlay autogroup
autogroup-attrset       groupOfURLs memberURL member

overlay dynlist
dynlist-attrset       groupOfUniqueNames labeledURI member

А для динамической группы такой объект в каталоге:
dn: cn=DynGroup,ou=Groups,dc=mycompany,dc=ru
objectClass: groupOfUniqueNames
objectClass: extensibleObject
cn: DynGroup
uniqueMember: cn=dummy
gidNumber: 11003
labeledURI: ldap:///ou=People,dc=mycompany,dc=ru??sub?(objectClass=...)

Тогда динамические и автогруппы будут строиться по разному.

Егор
Название: Re: Использование динамических групп
Отправлено: marawu от 02 Декабрь 2017, 04:54:52

Если оставить в настройках обоих наложений одни и те же объектный класс и атрибут с URL, то перекрытие, конечно же, будет. Не пробовал, но предположу, что в итоге у Вас будет двойной набор атрибутов member: реальные и динамические члены, что, конечно, неправильно, да и вряд ли это то, что Вам нужно.

Но выкрутиться, как всегда, можно. Просто определите разные настройки для разных наложений:
overlay autogroup
autogroup-attrset       groupOfURLs memberURL member

overlay dynlist
dynlist-attrset       groupOfUniqueNames labeledURI member

А для динамической группы такой объект в каталоге:
dn: cn=DynGroup,ou=Groups,dc=mycompany,dc=ru
objectClass: groupOfUniqueNames
objectClass: extensibleObject
cn: DynGroup
uniqueMember: cn=dummy
gidNumber: 11003
labeledURI: ldap:///ou=People,dc=mycompany,dc=ru??sub?(objectClass=...)

Тогда динамические и автогруппы будут строиться по разному.

Егор


Я так и предпологал! Егор, огромное вам спасибо за то, что продолжайте отвечать!