OpenLDAP:使用 sockname 和 DN 的 ACL?
在 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)是:
olcAccess: to attrs=userPassword by dn.base="uid=pwreset,ou=service,dc=example,dc=edu" sockname.exact="PATH=/var/run/openldap/ldapi" write
感謝openldap-technical 列表中的 Quanah Gibson-Mount 指出解決方案。