如何在 openldap 服务器上配置反向组成员身份维护?(memberOf)

如何在 openldap 服务器上配置反向组成员身份维护?(memberOf)

我目前正在将 LDAP 身份验证集成到系统中,我想根据 LDAP 组限制访问。唯一的方法是通过搜索过滤器,因此我相信我唯一的选择是在搜索过滤器中使用“memberOf”属性。据我了解,“memberOf”属性是一个操作属性,只要为服务器上的任何“groupOfNames”条目创建新的“member”属性,服务器就可以为我创建该属性。我的主要目标是能够将“member”属性添加到现有的“groupOfNames”条目,并将匹配的“memberOf”属性添加到我提供的 DN。

我目前已取得的成就:

我对 LDAP 管理还很陌生,但根据我在 openldap 管理员指南中找到的内容,它看起来像反向组成员身份维护又名“memberof overlay”将实现我想要的效果。

我的服务器目前正在运行 openldap 2.4.15 的软件包安装(ubuntu 上的 slapd),它使用“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”,并使用“memberOf”属性更新所有相关 DN。这是我所期望的行为的一部分。虽然我相信以下内容应该可以通过 memberof 覆盖来完成,但我仍然不知道如何执行以下操作,我很乐意欢迎任何建议:

  1. 向现有的“groupOfNames”添加“member”属性,并自动创建相应的“memberOf”属性。
  2. 删除“member”属性并自动删除相应的“memberOf”属性。

答案1

我也遇到过同样的问题,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”非常典型,但不能保证与您的设置相匹配。请务必检查一下。

答案2

我最近在我的博客 www.jordaneunson.com 上写了这篇文章,我复制并粘贴了相关部分。

我要做的是停止 LDAP 服务器上的“slapd”服务并编辑我的 slapd.conf 文件并添加以下两行。

moduleload memberof.la
overlay memberof

我已经有一个名为 vpn 的 groupOfNames,因此我必须创建一个包含以下内容的 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 服务,从那时起就取得了很大的成功。对于新的 GUI 管理工具,我使用 phpLDAPAdmin,在为用户分配和取消分配 memberOf 属性时没有遇到任何问题。

最后要注意的是,“memberOf”属性不是基本 LDAP v3 架构的一部分,因此除非特别查询,否则执行 ldapsearch 不会显示此属性。这就是为什么在我上面的示例中,它在 ldapsearch 参数的末尾声明。

希望这可以帮助。

编辑:我刚刚用 Apache Directory Studio 测试了您的问题:只要我输入上面提到的整个属性成员值,它就可以正常工作。但是 memberOf 属性不会显示在用户条目中。这是因为 memberOf 属性不是 LDAPv3 架构的一部分。要验证它是否存在,请使用命令行工具 ldapsearch:

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

相关内容