首先,我目前正在使用 OpenLDAP:Fedora 版本 19(薛定谔的猫)上的 slapd 2.4.36。
我刚刚使用 yum 安装了 openldap,我的配置如下:
##### OpenLDAP Default configuration #####
#
##### OpenLDAP CORE CONFIGURATION #####
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
pidfile /var/lib/ldap/slapd.pid
loglevel trace
##### Default Schema #####
database mdb
directory /var/lib/ldap/
maxsize 1073741824
suffix "dc=domain,dc=tld"
rootdn "cn=root,dc=domain,dc=tld"
rootpw {SSHA}SECRETP@SSWORD
##### Default ACL #####
access to attrs=userpassword
by self write
by group.exact="cn=administrators,ou=builtin,ou=groups,dc=domain,dc=tld" write
by anonymous auth
by * none
我使用以下方式启动我的 OpenLDAP 服务:
/usr/sbin/slapd -u ldap -h ldapi:/// ldap:/// -f /etc/openldap/slapd.conf
如您所见,这是一个非常简单的 ACL,旨在允许特定组以只读方式访问 userPassword 属性,然后允许所有者以需要身份验证的方式进行读写,并拒绝其他所有人的访问。
问题是:即使使用具有正确密码的有效用户,我的 ldapsearch 也最终无法从目录中检索到任何信息,而且我在结果行上得到了奇怪的响应。
# search result
search: 2
result: 32 No such object
# numResponses: 1
这是 ldapsearch 请求:
ldapsearch -H ldap.domain.tld -W -b dc=domain,dc=tld -s sub -D cn=user,ou=service,ou=employees,ou=users,dc=domain,dc=tld
我没有指定任何过滤器,因为我想检查 ldapsearch 是否正确打印仅允许的属性。
@SvW 这是我根据您的示例和 OpenLDAP 文档在 slapd.conf 上添加的内容:
我使用以下 ACL 规则编辑了我的 slapd.conf,消除了 group.exact 以便于调试:
access to *
by self read
by anonymous auth
by * none
access to attrs=userpassword
by self write
by anonymous auth
by * none
但我又一次面临
32 没有这样的对象错误
当我尝试以下 ldapsearches 时:
ldapsearch -W -s sub -D cn=user,ou=service,ou=employees,ou=users,dc=domain,dc=tld -b dc=domain,dc=tld userpassword=*
或不带过滤器:
ldapsearch -W -s sub -D cn=user,ou=service,ou=employees,ou=users,dc=domain,dc=tld -b dc=domain,dc=tld
答案1
为了测试,尝试添加
access to * by * read
后第一个 ACL 条目。
这仍然应该限制,userpassword
但明确允许您读取所有其他字段(我相信 OpenLDAP 隐式添加了其他内容to * by * none
,请参阅文档)。
编辑:
它是否限制了密码字段?从您的评论中看,这一点不是很清楚。如果没有,请记住@Janne的回答并检查拼写是否userPassword
正确。如果它有效,您必须从那里开始添加限制。以下内容未经测试,但应该有效(尽管它可能过于严格)。
access to *
by self read
by group.exact="cn=administrators,ou=builtin,ou=groups,dc=domain,dc=tld" write
by * none
答案2
尝试
access to attrs=userPassword
而不是你以前的
access to attrs=userpassword