在 OpenLDAP(2.4.45,在 FreeBSD 上)中,我试图通过仅在通过套接字建立连接时才授予 DN 访问权限来限制 DN 对属性的访问;但没有成功。
我正在尝试的是
olcAccess: to attrs=userPassword
by dn.base="uid=pwreset,ou=service,dc=example,dc=edu"
sockname.exact="/var/run/openldap/ldapi"
write
(想法是pwreset
DN 可以由自动密码重置脚本使用,但只有当脚本与 LDAP 服务器在同一台机器上运行时,该 DN 才具有该访问权限)。
这by
句话似乎与 Sect 中的产生相匹配。OpenLDAP 访问控制文档的第 8.3节,以及 slapd.access(5) 中的备注,即<who>
字段中的项目“可以组合指定”。确实没有生成语法警告。我假设这个组合意味着一个AND而不是一个OR——这在文档中没有明确说明。我在 OpenLDAP 文档或网络上都找不到涉及此内容的示例。
当元素不存在时,此节有效sockname
,表明配置按我预期的方式工作。
当我尝试userPassword
使用此 DN 编写属性时,ldap_modify: Insufficient access (50)
出现错误。
OpenLDAP 文档没有(有点令人惊讶)明确说明这个sockname
元素的效果是什么,并且 slapd.access(5) 页面相当隐晦地说:
语句
peername=<peername>
,sockname=<sockname>
,domain=<domain>
, 和sockurl=<sockurl>
表示连接主机 IP(以IP=<ip>:<port>
IPv4 或IP=[<ipv6>]:<port>
IPv6 的形式)或连接主机的命名管道文件名(PATH=<path>
如果通过命名管道连接,则以形式)用于 peername,命名管道文件名对于 sockname,与域的联系主机名和 sockurl 的联系 URL 进行比较pattern
以确定访问。
这实际上并没有说太多。
我是否完全误解了此访问规范的要点,还是有其他方法可以做到这一点?
正确的语法(至少对于这个版本的 OpenLDAP)是:
感谢openldap-technical 列表中的 Quanah Gibson-Mount 指出解决方案。