Автор Тема: Использование динамических групп  (Прочитано 9283 раз)

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Добрый день, подскажите пожалуйста по динамическим группам.


Задача: есть сервис 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


На выходе ничего нет, потому-что, насколько я понимаю, члены группы в явном виде неуказанны. Возможно есть какие-то другие механизмы, которые помогут мне содержать группу в актуальном состоянии без постоянного вмешательства? Либо я что-то не так понял?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Использование динамических групп
« Ответ #1 : 03 Ноябрь 2017, 13:39:03 »
Здравствуйте, Никита! К сожалению, это действительно проблема =( . Суть в том, наполнение группы динамическими членами происходит уже после того, как отработан отбор записей по фильтру. То есть, на момент работы фильтра динамических членов ещё нет в записи группы.

Попробуйте наложение autogroup (в Ubuntu оно идёт в стандартном deb-пакете), см. пример здесь. Оно поддерживает "настоящих" членов в группе при добавлении/модификации/удалении записей пользователей, то есть атрибуты member добавляются/удаляются непосредственно в записи группы, и по таким членам фильтр работать будет.

Второй вариант -- сделать некий прокси, например на slapd-relay, и по полученным записям (в которых уже будут динамические члены в группах) выполнять поиск с фильтром (member=uid=...).

Егор

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Re: Использование динамических групп
« Ответ #2 : 03 Ноябрь 2017, 22:22:04 »
Попробуйте наложение autogroup (в Ubuntu оно идёт в стандартном deb-пакете), см. пример здесь. Оно поддерживает "настоящих" членов в группе при добавлении/модификации/удалении записей пользователей, то есть атрибуты member добавляются/удаляются непосредственно в записи группы, и по таким членам фильтр работать будет.
Егор

Сегодня кстати натыкался на эту ветку. В понедельник попробую, правда я использую centos, но не думаю, что найти модуль будет проблемой:) Спасибо за наводку, попробую - отпишусь

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Re: Использование динамических групп
« Ответ #3 : 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, но там никого нет:(
« Последнее редактирование: 07 Ноябрь 2017, 10:44:41 от marawu »

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Re: Использование динамических групп
« Ответ #4 : 07 Ноябрь 2017, 11:08:41 »
Егор, добрый день. Не могу настроить я autogroup :(

Перезапустил slapd и содержимое группы появилось, только какое-то странное, там просто перечислены все атрибуты пользователей. Я подредатировал поиск только по uid, но ведь у меня по факту должны быть атрибуты member, так ведь?
« Последнее редактирование: 07 Ноябрь 2017, 11:24:37 от marawu »

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Использование динамических групп
« Ответ #5 : 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

Всё работает так, как Вы хотели.
Егор

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Re: Использование динамических групп
« Ответ #6 : 24 Ноябрь 2017, 09:37:08 »
Егор, спасибо за проделанную работу. Буду у себя тестировать и проверять. Но я так понимаю, чтобы это заработало, нужно минимум версию 2.4.45?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Использование динамических групп
« Ответ #7 : 24 Ноябрь 2017, 12:51:20 »
Но я так понимаю, чтобы это заработало, нужно минимум версию 2.4.45?

Судя по этой ветке, проблемы исправлены в июле 2014 года, то есть первая "исправная" версия наложения попала в OpenLDAP-2.4.40.

Егор

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Re: Использование динамических групп
« Ответ #8 : 29 Ноябрь 2017, 15:58:21 »
Егор, добрый день. Извините, но ещё вопрос остался.


overlay autogroup
autogroup-attrset       groupOfURLs memberURL member

Я так же бы хотел использовать dyngroup для некоторых случаев, и там я тоже использую атрибуты groupOfURLs memberURL member. Я так понимаю и там и там их использовать нельзя, иначе они будут "перекрывать" друг друга. Или я не прав?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: Использование динамических групп
« Ответ #9 : 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=...)

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

Егор

marawu

  • Пользователь
  • **
  • Сообщений: 76
  • !
    • Просмотр профиля
Re: Использование динамических групп
« Ответ #10 : 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=...)

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

Егор


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