在 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
短语似乎与第 8.3 节中的生成式相匹配OpenLDAP 访问控制文档,以及 slapd.access(5) 中的注释,字段中的项目<who>
“可以组合指定”。确实没有生成语法警告。我假设组合意味着和而不是或者– 文档中没有明确说明这一点。我在 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 、联系主机名与 domain 、联系 URL 与 sockurl 进行比较pattern
以确定访问权限。
这实际上并没有说明什么。
我是否完全误解了这个访问规范的要点,或者还有其他方法可以做到这一点?
答案1
正确的语法(至少对于此版本的 OpenLDAP)是:
olcAccess: to attrs=userPassword
by dn.base="uid=pwreset,ou=service,dc=example,dc=edu"
sockname.exact="PATH=/var/run/openldap/ldapi"
write
感谢 Quanah Gibson-Mountopenldap 技术列表指出解决方案。