Openldap

LDIF 添加/替換語法?

  • November 14, 2020

(slapd 2.4.47+dfsg-3+deb10u3 - 來自 Debian 10)

我已經搜尋了有關此問題的先前答案,但是儘管遵循了建議(使用changetype: modify),但我仍然遇到問題。

問題是需要能夠編寫一個混合了新元素和需要修改的現有元素的 LDIF 文件。

但是,以下兩種方法都不起作用。

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: foo
-
add: olcTLSCertificateFile
olcTLSCertificateFile: foo
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: foo
-
add: olcTLSCipherSuite
olcTLSCipherSuite: foo
-
add: olcTLSVerifyClient
olcTLSVerifyClient: foo

執行時ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/myconfigs/ldifs/certs.ldif"會出現以下錯誤:

         SASL/EXTERNAL authentication started                                                                                                                                      
         SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth                                                                                                    
         SASL SSF: 0                                                                                                                                                               
         ldap_modify: Inappropriate matching (18)                                                                                                                                  
               additional info: modify/add: olcTLSCACertificateFile: no equality matching rule  

如果我再適應一種replace風格:

dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: foo
-
replace: olcTLSCertificateFile
olcTLSCertificateFile: foo
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: foo
-
replace: olcTLSCipherSuite
olcTLSCipherSuite: foo
-
replace: olcTLSVerifyClient
olcTLSVerifyClient: foo

錯誤變為:

SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
ldap_modify: Other (e.g., implementation specific) error (80)

*“如果不存在則添加,如果存在則替換”*的正確語法是什麼?

替換實際上“如果不存在則添加,如果存在則替換”。

RFC2849狀態

“修改目錄的 LDAP 操作(添加、刪除、修改和 modrdn)與下面描述的更改記錄類型(“添加”、“刪除”、“修改”和“ modrdn”或“moddn”)。這種對應是有意的,並且允許從 LDIF 更改記錄直接轉換為協議操作。”

好的,讓我們看看這些協議操作應該如何在rfc4511,第 4.6 節中工作。

“替換:用列出的新值替換修改屬性的所有現有值,如果它不存在則創建該屬性。如果沒有值的替換將刪除整個屬性如果它存在,如果屬性不存在則忽略它存在。”

好吧,那就更好了,它是“如果不存在則添加”、“如果存在則替換”甚至是“刪除”。

讓我們試試看。

假設我的目錄中有這個實體。

dn: cn=timor,ou=people,dc=orga,dc=tld
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: posixAccount
objectClass: top
cn: timor
gidNumber: 10001
homeDirectory: /home/timor
sn: None
uid: timor
uidNumber: 10001
displayName: Timor
givenName: Timor
userPassword:: <stripped>

我設置了這個 LDIF,它mail向實體添加了三個值,不是使用“添加”而是“替換”。

dn: cn=timor,ou=people,dc=orga,dc=tld
changetype: modify
replace: mail
mail: first
mail: second
mail: third

只需將其 ldapmodify 到目錄即可。

timor@somehost ~ $ ldapmodify -x -H ldaps://localhost -D "cn=Manager,dc=orga,dc=tld" -w "superSecret" -f /tmp/3mail.ldif 
modifying entry "cn=timor,ou=people,dc=orga,dc=tld"

工作正常。 (我不會粘貼更多的 LDIF,我相信你相信我的價值觀是存在的)

所以這實際上表明,還有一些其他問題。不幸的是,OpenLDAP 的錯誤消息*“ldap_modify: Other (eg, implementation specific) error (80)”*也不是很有幫助。我不止一次地看到它,而且經常出於完全不同的原因,例如模式違規、權限問題等等。

我的建議是堅持您的第二個 ( ) 片段並在發出命令時changetype: modify打開調試。如果這沒有幫助 - 我擔心它不會 - 您可以對自己執行相同的操作,相同的選項,並在發出命令時仔細查看日誌文件。-d -1``ldapmodify``slapd``-d -1``ldapmodify

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