Пришлось делать стенд =) . AD на Win2003R2, OpenLDAP 2.4.31 на Ubuntu 16.04
Конфигурация такая:
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.la
moduleload back_ldap.la
moduleload rwm.la
moduleload dynlist.la
attributetype ( 1.2.840.113556.1.4.656 NAME 'userPrincipalName' SUP name )
objectClass ( 1.2.840.113556.1.5.8 NAME 'Group' SUP top STRUCTURAL MUST cn )
database ldap
suffix "dc=SomeDomain,dc=lan"
readonly yes
rebind-as-user yes
uri ldap://192.168.x.x
idassert-bind xxxxxxxxxxxxxxxxxx
idassert-authzFrom "dn:"*
overlay rwm
rwm-rewriteEngine on
rwm-rewriteContext searchFilter
rwm-rewriteRule "RecursiveMemberOf=(.*),dc=lan" "memberof:1.2.840.113556.1.4.1941:=%1,dc=lan" ":"
overlay dynlist
dynlist-attrset Group labeledURI
Добавил фиктивные определения класса Group (так и не разобрался, как в AD сделать запись с posixGroup, поэтому для dynlist использовал Group) и атрибута userPrincipalName (без этого данный атрибут не выводился в итоговом наполнении динамической группы). В остальном всё практически как у Вас.
В AD добавил две группы TestGroup2 с членом egor (пользователь) и TestGroup1 с членами kostya (пользователь) и TestGroup2 (группа), добавил в эти группы labeledURI для составления динамического содержимого:
$ ldapsearch -xLLL -o ldif-wrap=no -H ldap://127.1:9000 -b cn=users,dc=SomeDomain,dc=lan '(cn=TestGroup*)' member labeledURI
dn: cn=TestGroup1,cn=Users,dc=SomeDomain,dc=lan
member: cn=TestGroup2,cn=Users,dc=SomeDomain,dc=lan
member: cn=kostya,cn=Users,dc=SomeDomain,dc=lan
labeledURI: ldap:///cn=Users,dc=SomeDomain,dc=lan?userPrincipalName?one?(RecursiveMemberOf=cn=TestGroup1,cn=users,dc=SomeDomain,dc=lan)
dn: cn=TestGroup2,cn=Users,dc=SomeDomain,dc=lan
member: cn=egor,cn=Users,dc=SomeDomain,dc=lan
labeledURI: ldap:///cn=Users,dc=SomeDomain,dc=lan?userPrincipalName?sub?(memberOf=cn=TestGroup2,cn=Users,dc=SomeDomain,dc=lan)
В группе TestGroup1 рекурсивный поиск членов, в TestGroup2 -- обычный. Если теперь сделать поиск без указания атрибутов, динамическое содержимое возвращается, причём с учётом вложенной группы:
$ ldapsearch -xLLL -o ldif-wrap=no -H ldap://127.1:9000 -b cn=users,dc=SomeDomain,dc=lan '(cn=TestGroup*)'
dn: cn=TestGroup1,cn=Users,dc=SomeDomain,dc=lan
objectClass: top
objectClass: Group
<...>
userPrincipalName: egor@SomeDomain.lan
userPrincipalName: kostya@SomeDomain.lan
dn: cn=TestGroup2,cn=Users,dc=SomeDomain,dc=lan
objectClass: top
objectClass: Group
<...>
userPrincipalName: egor@SomeDomain.lan
Если при поиске указать атрибуты, то динамическое содержимое не возвращается:
$ ldapsearch -xLLL -o ldif-wrap=no -H ldap://127.1:9000 -b cn=users,dc=SomeDomain,dc=lan '(cn=TestGroup*)' userPrincipalName
dn: cn=TestGroup1,cn=Users,dc=SomeDomain,dc=lan
dn: cn=TestGroup2,cn=Users,dc=SomeDomain,dc=lan
Такие результаты. Зависаний никаких замечено не было.
Егор