我目前正在将 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 覆盖来完成,但我仍然不知道如何执行以下操作,我很乐意欢迎任何建议:
- 向现有的“groupOfNames”添加“member”属性,并自动创建相应的“memberOf”属性。
- 删除“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