如何启用 OpenLDAP 的 memberOf 特性

发表于 · 归类于 代码 · 阅读完需 5 分钟 · 报告错误

之前的文章中,我们已经安装部署了 OpenLDAP 服务。所以本文将主要介绍如何启用 OpenLDAP 中非常有用的 memberOf 特性。

很多场景下,我们需要快速的查询某一个用户是属于哪一个或多个组的(member of)。memberOf 正是提供了这样的一个功能:如果某个组中通过 member 属性新增了一个用户,OpenLDAP 便会自动在该用户上创建一个 memberOf 属性,其值为该组的 dn。

遗憾的是,OpenLDAP 默认并不启用这个特性,因此我们需要通过相关的配置开启它。

一、配置 OpenLDAP Backend

为了启用 OpenLDAP 的 memberOf 特性,我们首先需要在 OpenLDAP 服务器上创建如下两个文件:

# backend.memberof.ldif
dn: cn=module,cn=config
cn: module
objectclass: olcModuleList
objectclass: top
olcmoduleload: memberof
olcmodulepath: /usr/lib/ldap

dn: olcOverlay={0}memberof,olcDatabase={2}mdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
# backend.refint.ldif
dn: cn=module,cn=config
cn: module
objectclass: olcModuleList
objectclass: top
olcmoduleload: refint
olcmodulepath: /usr/lib/ldap

dn: olcOverlay={1}refint,olcDatabase={2}mdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: refint

接着使用 ldapadd 命令将其导入:

$ ldapadd -Y EXTERNAL -H ldapi:/// -f ./backend.memberof.ldif
$ ldapadd -Y EXTERNAL -H ldapi:/// -f ./backend.refint.ldif
$ ldapadd -Y EXTERNAL -H ldapi:/// -f ./backend.remote_access.ldif

二、导入用户和组数据

首先我们向 OpenLDAP 导入一个用户:

$ vim add_user.ldif
dn: uid=john,ou=people,dc=xinhua,dc=io
cn: John Doe
givenName: John
sn: Doe
uid: john
uidNumber: 5000
gidNumber: 1000
userPassword: {SHA}M6XDJwA47cNw9gm5kXV1uTQuMoY=
homeDirectory: /home/john
mail: [email protected]
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson

$ ldapadd -x -H ldap://172.16.168.120 -D "cn=admin,dc=xinhua,dc=io" -W -f ./add_user.ldif

然后再导入一个组:

$ vim add_group.ldif
dn: cn=master,ou=group,dc=xinhua,dc=io
objectClass: groupOfNames
cn: master
member: uid=john,ou=people,dc=xinhua,dc=io

$ ldapadd -x -H ldap://172.16.168.120 -D "cn=admin,dc=xinhua,dc=io" -W -f ./add_group.ldif

最后通过 ldapsearch 命令可以查询到,该用户属性中已经增加了 memberOf

$ ldapsearch -x -H ldap://172.16.168.120 -b dc=xinhua,dc=io -D "cn=admin,dc=xinhua,dc=io" -W memberOf
dn: uid=john,ou=people,dc=xinhua,dc=io
memberOf: cn=master,ou=group,dc=xinhua,dc=io

最终,我们在 OpenLDAP 中实现了对 memberOf 的支持。