如何正確地將一組 olcAccess 屬性插入到 OpenLDAP 數據庫的配置中?
我需要為我的數據庫添加一堆 ACL,但很難為它編寫正確的 LDIF。不幸的是,
ldapmodify
它的無用錯誤消息不是很有幫助:modifying entry "olcDatabase={1}mdb,cn=config" ldap_modify: Other (e.g., implementation specific) error (80) additional info: <olcAccess> handler exited with 1
我目前有以下非常基本的 MDB 數據庫配置(它是由 Debian 包配置器為
slapd
包創建的,版本 2.4.40):# {1}mdb, config dn: olcDatabase={1}mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: {1}mdb olcDbDirectory: /var/lib/ldap olcSuffix: dc=domain,dc=lan olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by * none olcAccess: {1}to dn.base="" by * read olcAccess: {2}to * by * read # ... and more
由於我將數據庫設置為用作 SAMBA 的身份驗證後端,因此數據庫架構已更新為包含特定於 SAMBA 的類型和屬性,現在我想相應地收緊數據庫上的 ACL。
我想要完成的事情可以這樣表述:
sambaLMPassword
和sambaNTPassword
SAMBA 特定的屬性(在類的條目上可用)posixAccount
只能由它們各自的所有者(self
即)讀取/修改。dn=sambaAdmin,dc=domain,dc=lan
已創建一個特殊使用者,並指定由 SAMBA 本身使用並smbldap-tools
管理數據庫中特定於 SAMBA 的使用者。它應該被授予對 DIT 中一組特定於 SAMBA 的 OU 的完全訪問權限。我希望在規則之間
{0}
和{1}
目前配置中插入我的 ACL 條目。為了實現上面概述的內容,我準備了以下 LDIF 文件,我正在嘗試使用該文件
ldapmodify
並收到上面顯示的錯誤。# {1}mdb, config dn: olcDatabase={1}mdb,cn=config changetype: modify add: olcAccess olcAccess: {1}to dn.subtree="ou=Users,dc=domain,dc=lan" attrs=sambaLMPassword,sambaNTPassword by self write by dn=sambaAdmin,dc=domain,dc=lan write by anonymous auth by * none olcAccess: {2}to dn.subtree="ou=Computers,dc=domain,dc=lan" attrs=sambaLMPassword,sambaNTPassword by self write by dn=sambaAdmin,dc=domain,dc=lan write by anonymous auth by * none olcAccess: {3}to dn.subtree="ou=Users,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan write olcAccess: {4}to dn.subtree="ou=Groups,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan write olcAccess: {5}to dn.subtree="ou=Computers,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan write olcAccess: {6}to dn.subtree="ou=Idmap,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan write olcAccess: {7}to dn=sambaDomainName=MYSERVER,dc=domain,dc=lan by dn=sambaAdmin,dc=domain,dc=lan write
不幸的是,LDIF 通過了語法檢查(
ldapmodify -n -v <path/to/file.ldif
),錯誤消息真的沒有幫助。無論如何,請幫我修復我的 LDIF 以被接受
slapd
嗎?或者向我解釋一種配置它的方法(或者ldapmodify
可能是?)更詳細地說明這個錯誤的真正原因?
ldapmodify 對您的文件的有效性撒謊。如果您使用您創建的 LDIF 文件並執行
ldapmodify -v -n -f <path/to/file.ldif>
輸出如下所示:
add olcAccess: {1}to dn.subtree="ou=Users,dc=domain,dc=lan" attrs=sambaLMPassword,sambaNTPassword by self write by dn=sambaAdmin,dc=domain,dc=lan write by anonymous auth by * none {2}to dn.subtree="ou=Computers,dc=domain,dc=lan" attrs=sambaLMPassword,sambaNTPassword by self write by dn=sambaAdmin,dc=domain,dc=lan write by anonymous auth by * noneolcAccess: {3}to dn.subtree="ou=Users,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan writeolcAccess: {4}to dn.subtree="ou=Groups,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan writeolcAccess: {5}to dn.subtree="ou=Computers,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan writeolcAccess: {6}to dn.subtree="ou=Idmap,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan writeolcAccess: {7}to dn=sambaDomainName=MYSERVER,dc=domain,dc=lan by dn=sambaAdmin,dc=domain,dc=lan write !modifying entry "olcDatabase={1}mdb,cn=config"
注意到所有 ACL 是如何擠在一起的嗎?這是因為每個條目之間沒有“-”。出於某種原因,ldapmodify 在您使用“-n”開關在試執行模式下執行它時會傳遞此文件,但在您實際嘗試實現它時會失敗。您應該將 LDIF 文件更改為如下所示:
dn: olcDatabase={1}mdb,cn=config add: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by * none - add: olcAccess olcAccess: {1}to dn.subtree="ou=Users,dc=domain,dc=lan" attrs=sambaLMPassword,sambaNTPassword by self write by dn="cn=sambaAdmin,dc=domain,dc=lan" write by anonymous auth by * none - add: olcAccess olcAccess: {2}to dn.subtree="ou=Computers,dc=domain,dc=lan" attrs=sambaLMPassword,sambaNTPassword by self write by dn=sambaAdmin,dc=domain,dc=lan write by anonymous auth by * none - add: olcAccess olcAccess: {3}to dn.subtree="ou=Users,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan write - add: olcAccess olcAccess: {4}to dn.subtree="ou=Groups,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan write - add: olcAccess olcAccess: {5}to dn.subtree="ou=Computers,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan write - add: olcAccess olcAccess: {6}to dn.subtree="ou=Idmap,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan write - add: olcAccess olcAccess: {7}to dn=sambaDomainName=MYSERVER,dc=domain,dc=lan by dn=sambaAdmin,dc=domain,dc=lan write - add: olcAccess olcAccess: {8}to dn.base="" by * read -
程式碼格式具有欺騙性,但您希望將每個 ACL 定義放在從第 0 列開始的單行上,您希望用“-”分隔每個條目,並且您希望確保 ACL 定義沒有末尾的空格或 ldapmodify 將加密字元串。
如果您使用 vi/vim 進行編輯,請使用 :set list 命令顯示標點符號(如輸入)並將其刪除,並確保行尾沒有任何空格。完成此操作後,輸出
ldapmodify -v -n -f <path/to/file.ldif>
看起來像這樣:
add olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by * none add olcAccess: {1}to dn.subtree="ou=Users,dc=domain,dc=lan" attrs=sambaLMPassword,sambaNTPassword by self write by dn="cn=sambaAdmin,dc=domain,dc=lan" write by anonymous auth by * none add olcAccess: {2}to dn.subtree="ou=Computers,dc=domain,dc=lan" attrs=sambaLMPassword,sambaNTPassword by self write by dn=sambaAdmin,dc=domain,dc=lan write by anonymous auth by * none add olcAccess: {3}to dn.subtree="ou=Users,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan write add olcAccess: {4}to dn.subtree="ou=Groups,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan write add olcAccess: {5}to dn.subtree="ou=Computers,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan write add olcAccess: {6}to dn.subtree="ou=Idmap,dc=domain,dc=lan" by dn=sambaAdmin,dc=domain,dc=lan write add olcAccess: {7}to dn=sambaDomainName=MYSERVER,dc=domain,dc=lan by dn=sambaAdmin,dc=domain,dc=lan write add olcAccess: {8}to dn.base="" by * read !modifying entry "olcDatabase={1}mdb,cn=config"
我注意到的另一個問題是您使用了“修改”關鍵字,如果您要向 LDAP 模式添加新條目或刪除不需要使用修改的條目,那麼僅在修改現有條目時才使用修改。我發現像這樣修改一組 ACL 的最簡單方法是在我的 LDAP 伺服器上打開幾個視窗,準備我的新 ACL,使用 -n 開關使用 ldapmodify 測試它們,然後在每個視窗中 su 到 root ,刪除現有的 ACL,然後添加新的 ACL。您可以使用如下所示的 LDIF 文件刪除所有現有 ACL:
# {1}mdb, config dn: olcDatabase={1}mdb,cn=config delete: olcAccess
然後執行 ldapmodify
ldapmodify -Y EXTERNAL -H ldapi:/// -f <path/to/acl_delete_file.ldif>
刪除它們。執行 ldapmodify 後執行
slapcat -n 0
驗證 ACL 是否已被刪除,然後執行
ldapmodify -Y EXTERNAL -H ldapi:/// -f <path/to/new_acl_file.ldif>
添加新的 ACL,然後執行
slapcat -n 0
再次驗證它們是否就位。