如何在OpenLDAP中赋予用户查询自身所属组的权限?
OpenLDAP权限配置:允许普通用户查询自身所属用户组
问题原因
普通用户tester执行查询返回32 No such object,是因为默认ACL限制了用户读取组条目及自身memberOf属性的权限,需要调整OpenLDAP的访问控制规则(ACL)来开放对应权限。
解决方案步骤
1. 备份当前配置(必做)
先备份cn=config配置目录,避免操作失误:
slapcat -n 0 -l openldap_config_backup.ldif
2. 配置ACL规则(动态配置方式,适用于现代OpenLDAP)
创建ACL更新的LDIF文件acl_update.ldif,添加以下规则:
dn: olcDatabase={1}mdb,cn=config changetype: modify add: olcAccess olcAccess: to dn.subtree="dc=example,dc=com" by dn.exact="cn=admin,dc=example,dc=com" write by self read by * none - add: olcAccess olcAccess: to dn.subtree="dc=example,dc=com" filter="(objectClass=groupOfNames)" attrs=*,entry by dnattr=member read by * none - add: olcAccess olcAccess: to dn.subtree="ou=people,dc=example,dc=com" filter="(objectClass=inetOrgPerson)" attrs=memberOf by self read by * none
执行LDIF文件应用配置:
ldapmodify -D cn=admin,dc=example,dc=com -w ${ADMIN_PW} -f acl_update.ldif
ACL规则说明
- 第一条规则:允许管理员读写所有条目,普通用户仅能读取自身条目,其他用户无权限
- 第二条规则:针对
groupOfNames类型的组条目,允许该组member属性对应的用户读取组的所有属性及条目本身(确保能搜索到组) - 第三条规则:针对用户条目,允许用户自身读取
memberOf属性
3. 确保memberOf反向属性正常工作(可选但必要)
如果用户条目没有自动生成memberOf属性,需要开启memberOf及refint覆盖模块来维护反向关联:
配置memberOf覆盖
创建memberof_overlay.ldif:
dn: cn=module{0},cn=config changetype: modify add: olcModuleLoad olcModuleLoad: memberof.la dn: olcOverlay={0}memberof,olcDatabase={1}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcMemberOfConfig olcOverlay: memberof olcMemberOfDangling: ignore olcMemberOfRefInt: TRUE olcMemberOfGroupOC: groupOfNames olcMemberOfMemberAD: member olcMemberOfMemberOfAD: memberOf
执行配置:
ldapmodify -D cn=admin,dc=example,dc=com -w ${ADMIN_PW} -f memberof_overlay.ldif
配置refint覆盖(保持数据一致性)
创建refint_overlay.ldif:
dn: cn=module{0},cn=config changetype: modify add: olcModuleLoad olcModuleLoad: refint.la dn: olcOverlay={1}refint,olcDatabase={1}mdb,cn=config objectClass: olcOverlayConfig objectClass: olcRefintConfig olcOverlay: refint olcRefintAttribute: member memberOf
执行配置:
ldapmodify -D cn=admin,dc=example,dc=com -w ${ADMIN_PW} -f refint_overlay.ldif
4. 重启OpenLDAP服务(若需)
如果使用静态配置文件slapd.conf(旧版本),修改后需重启服务:
systemctl restart slapd
5. 测试普通用户查询
使用tester用户执行目标查询:
ldapsearch \ -D "uid=tester,ou=people,dc=example,dc=com" \ -w ${USER_PW} \ -b 'dc=example,dc=com' \ "(&(objectClass=groupOfNames)(member=uid=tester,ou=people,dc=example,dc=com))" ldapsearch \ -D "uid=tester,ou=people,dc=example,dc=com" \ -w ${USER_PW} \ -b 'dc=example,dc=com' \ "(&(uid=tester)(objectClass=inetOrgPerson)(memberOf=ou=testingGroup,dc=example,dc=com))"
此时应能返回正确的组条目及用户的memberOf属性结果。
内容的提问来源于stack exchange,提问作者HasQuestionsAndAnswers
相关产品推荐
相关产品推荐

