OpenLDAP ACL 不起作用

OpenLDAP ACL 不起作用

首先,我目前正在使用 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

相关内容