Как настроить обслуживание обратного членства в группах на сервере openldap? (член)

18

В настоящее время я работаю над интеграцией аутентификации LDAP в систему, и я хотел бы ограничить доступ на основе группы LDAP. Единственный способ сделать это - через поисковый фильтр, и поэтому я считаю, что мой единственный вариант - использование атрибута "memberOf" в моем поисковом фильтре. Насколько я понимаю, атрибут «memberOf» - это операционный атрибут, который может быть создан сервером для меня в любое время, когда для любой записи «groupOfNames» на сервере создается новый атрибут «member». Моя главная цель - иметь возможность добавить атрибут «member» к существующей записи «groupOfNames» и добавить соответствующий атрибут «memberOf» в DN, который я предоставляю.

Чего мне удалось достичь до сих пор:

Я все еще довольно новичок в администрировании LDAP, но, основываясь на том, что я нашел в руководстве администратора openldap, похоже, что обратное обслуживание членства в группе, называемое "memberof overlay", достигнет именно того эффекта, который я ищу.

Мой сервер в настоящее время выполняет установку пакета (slapd на Ubuntu) openldap 2.4.15, который использует конфигурацию времени исполнения в стиле «cn = config». Большинство примеров, которые я нашел, все еще ссылаются на более старый метод "slapd.conf" статической конфигурации, и я старался изо всех сил адаптировать конфигурации к новой модели на основе каталогов.

Я добавил следующие записи, чтобы включить оверлейный модуль memberof:

Включить модуль с помощью olcModuleLoad

cn=config/cn\=module\{0\}.ldif

dn: cn=module{0}
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_hdb
olcModuleLoad: {1}memberof.la
structuralObjectClass: olcModuleList
entryUUID: a410ce98-3fdf-102e-82cf-59ccb6b4d60d
creatorsName: cn=config
createTimestamp: 20090927183056Z
entryCSN: 20091009174548.503911Z#000000#000#000000
modifiersName: cn=admin,cn=config
modifyTimestamp: 20091009174548Z

Включил оверлей для базы данных и позволил ей использовать настройки по умолчанию (groupOfNames, member, memberOf и т. Д.)

cn=config/olcDatabase={1}hdb/olcOverlay\=\{0\}memberof

dn: olcOverlay={0}memberof
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: {0}memberof
structuralObjectClass: olcMemberOf
entryUUID: 6d599084-490c-102e-80f6-f1a5d50be388
creatorsName: cn=admin,cn=config
createTimestamp: 20091009104412Z
olcMemberOfRefInt: TRUE
entryCSN: 20091009173500.139380Z#000000#000#000000
modifiersName: cn=admin,cn=config
modifyTimestamp: 20091009173500Z

Мой текущий результат:

Используя вышеупомянутую конфигурацию, я могу добавить НОВЫЙ «groupOfNames» с любым количеством записей «member» и обновить все задействованные DN с помощью атрибута «memberOf». Это часть поведения, которое я ожидаю. Хотя я полагаю, что с оверлеем memberof должно быть выполнено следующее, я все еще не знаю, как сделать следующее, и я с радостью приветствую любые советы:

  1. Добавьте атрибут "member" в СУЩЕСТВУЮЩУЮ группу "groupOfNames" и создайте соответствующий атрибут "memberOf" автоматически.
  2. Удалите атрибут «member» и удалите соответствующий атрибут «memberOf» автоматически.
emills
источник

Ответы:

10

Я боролся с тем же, документация openldap минималистична и вряд ли полезна вообще. Когда они перешли к базе данных конфигурации (в принципе, неплохая идея), все параметры изменились, поэтому, когда люди приводят пример из /etc/ldap/slapd.conf, это бесполезно с современной конфигурацией slapd (такой как Ubuntu).

Я наконец получил это работает. Вот резюме ... первый файл LDIF:

dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib/ldap
olcModuleLoad: memberof

Второй файл LDIF:

dn: olcOverlay=memberof,olcDatabase={1}hdb,cn=config
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf

Добавьте их в базу данных конфигурации, используя ldapadd (так же, как обычные вещи конфигурации).

Он не обновляет автоматически существующие данные в базе данных, поэтому мне нужно было использовать slapcat, чтобы скопировать все во временный файл, посетить каждую группу, удалить группу и снова добавить ту же группу (вынуждает обновлять атрибуты memberOf). правильно). Если вы начинаете с пустой базы данных, она будет корректно обновлять атрибуты при добавлении объектов.

Также обратите внимание, что «olcDatabase = {1} hdb» очень типично, но не обязательно соответствует вашей настройке. Не забудьте проверить это.

Телфорд Тендис
источник
1
Разве slapadd(на остановленную базу данных) не правильный способ сделать это?
mad_vs
11

Недавно я написал об этом в своем блоге, www.jordaneunson.com, в который скопировал и вставил соответствующие части.

Мне нужно было остановить службу «slapd» на моем сервере LDAP, отредактировать файл slapd.conf и добавить следующие две строки.

moduleload memberof.la
overlay memberof

У меня уже был groupOfNames с именем vpn, поэтому мне пришлось создать файл LDIF со следующим содержимым:

dn: cn=vpn,ou=Groups,dc=shop,dc=lan
objectclass: groupofnames
cn: vpn
description: Users allowed to connect on VPN
member: uid=jordan,ou=People,dc=shop,dc=lan

И добавил это в мою базу данных ldap

slapadd -f file.ldif

После этого я запустил сервер ldap в отладке, чтобы проверить ошибки

slapd -d 99 -f /etc/ldap/slapd.conf 

и проверил, чтобы членство в моей группе «vpn» было указано в моей записи пользователя.

ldapsearch -h ldap -x -b "dc=shop,dc=lan" '(uid=jordan)' memberOf 

и бац! Успех!

jordan, People, shop.lan
dn: uid=jordan,ou=People,dc=shop,dc=lan
memberOf: cn=vpn,ou=Groups,dc=shop,dc=lan

Поэтому я снова запустил сервис slapd и с тех пор добился большого успеха. Для нового инструмента управления графическим интерфейсом я использую phpLDAPAdmin, и у меня нет проблем с назначением и отменой назначения атрибута memberOf моим пользователям.

Последнее, на что следует обратить внимание, это то, что атрибут memberOf не является частью базовой схемы LDAP v3, и, следовательно, выполнение ldapsearch не покажет этот атрибут, если не будет запрошен конкретный запрос. Вот почему в моем примере выше он объявлен в конце параметров ldapsearch.

Надеюсь это поможет.

Изменить: Я только что проверил вашу проблему с Apache Directory Studio: до тех пор, пока я ввожу значение члена атрибута в целом, как упомянуто выше, он работает A-OK. Однако атрибут memberOf не отображается в пользовательской записи. Это связано с тем, что атрибут memberOf не является частью схемы LDAPv3. Чтобы убедиться в этом, используйте инструмент командной строки ldapsearch:

ldapsearch -h ldap -x -b "dc=shop,dc=lan" '(uid=jordan)' memberOf 
Джордан Юнсон
источник
1
Загрузка модуля и добавление оверлея это именно то, что я сделал, к сожалению. Как я уже говорил, проблема не в том, что атрибуты "memberOf" не добавляются для новых записей groupOfNames, а в том, что они не добавляются, когда я просто добавляю атрибут "member" в существующую группу. В настоящее время я использую Apache Directory Studio для просмотра и настройки моего LDAP, чтобы он отображал записи memberOf при просмотре. Дело не в том, что они скрыты.
Emills
1
Как вы создаете атрибут участника в groupOfNames? Это использует весь DN? например: "uid = user, ou = People, dc = corp, dc = org" или вы просто вводите их имя пользователя? Чтобы обратное отображение работало, вам нужно использовать весь DN, чтобы memberOf знал, где разместить обратную карту.
Джордан Юнсон
1
Изменить: Я только что проверил вашу проблему с Apache Directory Studio, пока я вписываю значение члена атрибута в целом, как упомянуто выше, он работает нормально. Однако атрибут memberOf не отображается в пользовательской записи. Это связано с тем, что атрибут memberOf не является частью схемы LDAPv3. Чтобы проверить это, используйте инструмент командной строки ldapsearch. <code> ldapsearch -h ldap -x -b "dc = shop, dc = lan" '(uid = jordan)' memberOf </ code>
Джордан Юнсон,
1
Я использую DN в записи участника. Дело не в том, чтобы не видеть его, как я уже говорил, они добавляются (и, следовательно, видны) только при добавлении свежей groupOfNames, а не когда я добавляю атрибут участника в существующую группу.
Emills
1
<quote> они только добавляются (и, следовательно, видны) </ quote> Извините, но это утверждение неверно. Атрибут memberOf не виден, если вы специально не запросите его. Не могли бы вы опубликовать вывод команды ldapsearch, указанной выше? Измените пользователя на того, кто должен иметь атрибут memberOf, но не имеет.
Джордан Юнсон