LDAP添加 memberOf 模块

这篇博客介绍了如何通过ldap的成员关系扩展,解决group-user映射的问题。通常,ldap的groupOfNames仅允许通过group查询member,但无法反向查询。为了解决这个问题,文章详细阐述了如何启用reverse group membership maintenance,添加memberOf模块,以及相应的ldap配置步骤,以确保在添加或删除成员时自动维护user的memberOf字段,从而实现通过user获取其所属group的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ldap的group是一种单独的类型objectClass: groupOfNames, 有个字段叫做member, value就是entry的dn。如此,实现了group-user的映射关系。

我们可以通过group来查询member,然而,并不能通过user直接获取到group。这在配置第三方系统的时候,没办法做group认证,比如airflow要求输入group filter, 默认通过memberof的属性值来获取group。gitlab如果要做分组进行登录限制要求输入 memberof 的属性值来获取 group。所以,理论上user应该有个字段叫做memberof,value是group。

大家可能会觉得dn已经很明显的分组了好吧,为啥还要这么复杂。事实上,ldap也提供了Reverse Group Membership Maintenance.由系统来维护二者的映射关系。即

  • group添加member的时候会自动给对应的entry添加memberof字段

  • 当删除entry的时候,也会从group里删除member字段


添加 memberOf 模块

添加 add_module_group.ldif 文件 在不知道memberof.la文件在什么位置时(find / -name memberof.la)

dn: cn=module,cn=config
cn: module
objectClass: olcModuleList
olcModulePath: /usr/lib64/openldap

dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: memberof.la

应用ldap 配置

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f  add_module_group.ldif

添加 add_group_objectClass.ldif 文件,增加 objectClass 支持

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

应用 ldap 配置

ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add_group_objectClass.ldif

新增 groupOfNames类型的组,add_group.ldif

dn: cn=gitlab-users,ou=Groups,dc=magic,dc=com
objectClass: groupOfNames
cn: gitlab-users
member: uid=xxx,ou=Users,dc=magic,dc=com

创建组

ldapmodify -a -H ldap://192.168.1.69:389 -D "cn=manager,dc=magic,dc=com" -w root123 -f addgroup.ldif

查看组

ldapsearch -H ldapi:/// -x -D "cn=manager,dc=magic,dc=com" -w root123 -b "ou=Groups,dc=magic,dc=com"
# gitlab-users, Groups, magic.com
dn: cn=gitlab-users,ou=Groups,dc=magic,dc=com
objectClass: groupOfNames
cn: gitlab-users
member: uid=xxx,ou=Users,dc=magic,dc=com

再来查看entry是否添加了memberof, ldapsearch当不指定字段的时候,默认返回全部强制字段,memberof不属于强制,需要单独指明

ldapsearch -H ldapi:/// -x -D "cn=manager,dc=magic,dc=com" -w root123 -b "ou=Users,dc=magic,dc=com" "(|(cn=xxx)(cn=gitlab*))" memberof

# extended LDIF
#
# LDAPv3
# base <ou=Users,dc=magic,dc=com> with scope subtree
# filter: (|(cn=xxx)(cn=gitlab*))
# requesting: memberof 
#

# xxx, Users, magic.com
dn: uid=xxx,ou=Users,dc=magic,dc=com
memberOf: cn=gitlab-users,ou=Groups,dc=magic,dc=com

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

完成

在使用Python的`ldap3`库进行LDAP操作时,`memberof`是一个扩展属性,它通常用来获取一个用户所属的所有组的DN(Distinguished Name)。要在`ldap3`中增加`memberof`属性,你需要确认LDAP服务器支持这一扩展操作,然后在执行查询时指定这一属性。 以下是一个简单的例子,演示如何在使用`ldap3`时获取`memberof`属性: ```python from ldap3 import Server, Connection, ALL # 定义LDAP服务器和要连接的DN ldap_server = Server('ldap.example.com') ldap_conn = Connection(ldap_server, 'your_username', 'your_password', auto_bind=True) # 定义一个搜索基础DN search_base = 'DC=example,DC=com' # 执行搜索并获取结果,包括memberof属性 search_filter = '(objectClass=user)' ldap_conn.search(search_base, search_filter, attributes=['memberof']) # 输出搜索结果 for entry in ldap_conn.entries: print(f'DN: {entry.entry_dn}') print(f'MemberOf: {entry.memberOf}') ``` 在这个例子中,我们首先创建了一个到LDAP服务器的连接,然后执行了一个搜索操作,这个搜索操作会返回所有对象类为`user`的条目,并且请求`memberof`属性。`ldap3`库会处理与LDAP服务器的通信细节。 需要注意的是,并非所有的LDAP服务器默认都支持`memberof`这个扩展操作。有些LDAP服务器可能需要安装额外的模块或者进行特定配置后才能支持`memberof`扩展。此外,如果服务器不支持,执行上述操作可能会返回错误或空的`memberof`属性。 在实际应用中,你需要查阅你的LDAP服务器的文档来确认是否支持`memberof`扩展,并了解如何配置服务器以启用此功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值