Форум проекта Pro-LDAP.ru
Общие вопросы по LDAP => Общий раздел => Тема начата: 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
На выходе ничего нет, потому-что, насколько я понимаю, члены группы в явном виде неуказанны. Возможно есть какие-то другие механизмы, которые помогут мне содержать группу в актуальном состоянии без постоянного вмешательства? Либо я что-то не так понял?
-
Здравствуйте, Никита! К сожалению, это действительно проблема =( . Суть в том, наполнение группы динамическими членами происходит уже после того, как отработан отбор записей по фильтру. То есть, на момент работы фильтра динамических членов ещё нет в записи группы.
Попробуйте наложение 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=...).
Егор
-
Попробуйте наложение autogroup (в Ubuntu оно идёт в стандартном deb-пакете), см. пример здесь (https://stackoverflow.com/questions/24762149/openldap-dynamic-groups-not-searching-by-member). Оно поддерживает "настоящих" членов в группе при добавлении/модификации/удалении записей пользователей, то есть атрибуты member добавляются/удаляются непосредственно в записи группы, и по таким членам фильтр работать будет.
Егор
Сегодня кстати натыкался на эту ветку. В понедельник попробую, правда я использую centos, но не думаю, что найти модуль будет проблемой:) Спасибо за наводку, попробую - отпишусь
-
Егор, добрый день. Не могу настроить я 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, но там никого нет:(
-
Егор, добрый день. Не могу настроить я autogroup :(
Перезапустил slapd и содержимое группы появилось, только какое-то странное, там просто перечислены все атрибуты пользователей. Я подредатировал поиск только по uid, но ведь у меня по факту должны быть атрибуты member, так ведь?
-
Здравствуйте, Никита!
Поэкспериментировал с 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
Всё работает так, как Вы хотели.
Егор
-
Егор, спасибо за проделанную работу. Буду у себя тестировать и проверять. Но я так понимаю, чтобы это заработало, нужно минимум версию 2.4.45?
-
Но я так понимаю, чтобы это заработало, нужно минимум версию 2.4.45?
Судя по этой ветке (https://www.openldap.org/lists/openldap-bugs/201407/msg00047.html), проблемы исправлены в июле 2014 года, то есть первая "исправная" версия наложения попала в OpenLDAP-2.4.40.
Егор
-
Егор, добрый день. Извините, но ещё вопрос остался.
overlay autogroup
autogroup-attrset groupOfURLs memberURL member
Я так же бы хотел использовать dyngroup для некоторых случаев, и там я тоже использую атрибуты groupOfURLs memberURL member. Я так понимаю и там и там их использовать нельзя, иначе они будут "перекрывать" друг друга. Или я не прав?
-
Я так же бы хотел использовать 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=...)
Тогда динамические и автогруппы будут строиться по разному.
Егор
-
Если оставить в настройках обоих наложений одни и те же объектный класс и атрибут с 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=...)
Тогда динамические и автогруппы будут строиться по разному.
Егор
Я так и предпологал! Егор, огромное вам спасибо за то, что продолжайте отвечать!