Openldap

如何正確地將一組 olcAccess 屬性插入到 OpenLDAP 數據庫的配置中?

  • November 7, 2018

我需要為我的數據庫添加一堆 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。

我想要完成的事情可以這樣表述:

  • sambaLMPasswordsambaNTPasswordSAMBA 特定的屬性(在類的條目上可用)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

再次驗證它們是否就位。

引用自:https://serverfault.com/questions/681259