无法将该对象添加到ldap服务器_LDAP 基础知识
LDAP 基礎知識
目錄
簡介
協議概覽
目錄結構
架構(Schema)
對象類(objectClass)
屬性(Attribute)
條目(Entry)
LDAP 中的數據
常用命令
啟動和關閉: start-ds / stop-ds
檢查 LDAP 服務器狀態: status
搜尋條目: ldapsearch
修改密碼: ldappasswordmodify
列出 backends: list-backends
導出 LDIF 文件: export-ldif
導入 LDIF 文件: import-ldif
管理賬戶: manage-account
性能
LDAP 瀏覽器
參考文獻
簡介
LDAP 是 Lightweight Directory Access Protocol 的縮寫,即 輕量目錄訪問協議。它基于 X.500 標準下更簡單的子集標準開發,因此有時 LDAP 也被稱之為 X.500-lite,即輕量級 x.500。
目錄服務在發展內部網絡和因特網應用方面扮演著重要角色,它可以通過互聯網分享用戶、系統、網絡、服務以及應用信息。
目錄服務可以提供任何系統化的數據集,并以等級結構(hiearchical structure)呈現結果。比如,公司的郵件目錄,或者包含地址和電話號碼的電話目錄。
LDAP 的一個常用功能是提供用戶名和密碼的集中存儲。不同的應用和服務可以用其來認證用戶。
協議概覽
客戶端發起 LDAP 會話連接到 LDAP 服務器。默認連接端口是 389(LDAP),或者 636(LDAPS)。客戶端發起操作請求到服務器,服務器返回響應結果。客戶端無需等待服務器響應即可發送下一個請求。服務器則會依次返回響應結果。
客戶端可以發送如下操作請求:
? StartTLS - 使用 LDAPv3 TLS 擴展來請求安全連接
? Bind - 認證并指定 LDAP 協議版本
? Search - 搜索目錄條目
? Compare - 測試命名條目是否包含指定的屬性值
? Add a new entry - 添加一個條目
? Delete an entry - 刪除一個條目
? Modify an entry - 修改一個條目
? Modify DN - 修改唯一識別名
? Extended Operation - 用于定義其他操作的通用操作
? Unbind - 關閉連接(注意,并非指 Bind 的逆向操作)
目錄結構
在 LDAP 里, 一切都是等級化的,或者稱之為層級化(hiearchical)。
一棵樹有樹干,樹枝和樹葉;樹葉長在樹枝上,樹枝依附于樹干。這就是一個簡單的層級結構。LDAP 的結構同一棵樹類似。假設 LDAP 里存儲的是公司的信息,那么可以把公司(company)本身理解為樹干,公司里面的各個部門,比如組(group),理解為樹干,把用戶(user)理解為樹葉。這樣的結構稱之為目錄信息樹(DIrectory Information Tree,DIT)。
我們在目錄信息樹里創建一個條目(entry)時,條目的信息存儲在屬性(attribute)里,屬性又被組合成對象類(objectClass),對象類進一步組成了架構(schema)。
下滿我們來解釋一下這幾個重要的概念。
架構(Schema)
? Schema 就是一個集合。所有的 objectClass 和 attribute 都定義在 Schema 里。
? 每一個 attribute 和 objectClass,包括其父級 attribute 和 objectClass 都必須定義在一個 Schema 里,且該 Schema 必須能夠被 LDAP 服務器識別。
? 定義在一個 Schema 里的 attribute 可以被另一個 Schema 里的 objectClass 使用。
對象類(objectClass)
? objectClass 是 attribute 的集合。
? objectClass 定義在 Shema 里。
? objectClass 可以是下面的類型:
– STRUCTURAL - 可以用于創建條目,即數據對象
– AUXILIARY - 可以添加到任何條目
– ABSTRACT - 不存在,抽象的。最常見的 ABSTRACT objectClass 是 top,表示每個 objectClass 層級的最高形式,用來結束一個層級。
? objectClass 可以以層級的形式呈現,這里它可以繼承來自父級的屬性。也就是說,objectClass 可以是一個層級的一部分,這種情況下,objectClass 必須和它的父級 objectClass 保持同樣的類型,即 STRUCTURAL 或者 AUXILIARY 類型。當父級是 top ABSTRACT 時無需遵守此規則,因為 top ABSTRACT 用結束任何層級結構。
? 一個 objectClass 可以有一個或多個父級的 objectClass。
? objectClass 是用來包含屬性的方式。
? objectClass 定義一個 attribute 是否是必須的(MUST)或者是可選的(MAY)。
? objectClass 遵守 ASN.1 注釋標準。
示例:下面是一個簡單的 objectClass 定義
objectclass ( 2.5.6.2 NAME 'country' DESC 'RFC2256: a country'SUP top STRUCTURALMUST cMAY ( searchGuide $ description ) )解釋:
? objectClass 是關鍵字,指明這是一個 objectClass 的定義
? 2.5.6.2 NAME 'country' 定義 objectClass 的全局唯一識別名。它由兩部分組成:
– NAME 'country' 為 objectClass 定義一個好理解的名字 country
– 2.5.6.2 定義全局唯一識別名,這種形式稱之為 OID(ObjectIdentifier)。由哪個組織分配這個號碼并不重要,但是必須是全局唯一的。通常推薦向 IANA申請一個 PEN (Private Enterprise Number)作為 OID 使用。
? SUP 'top' 表示該 objectClass 有一個父級的 objectClass,也就是說它是一個層級的一部分。一個 objectClass 可以有一個或多個父級的 objectClass。
? STRUCTURAL 表示該 objectClass 包含屬性且可以形成目錄信息樹(DIT)里的條目(entry)。一個條目里只能包含一個 STRUCTURAL objectClass。objectClass 也可以是 AUXILIARY,這說明它包含 attributes,可以和任何 STRUCTURAL objectClass一起使用構成一個條目,但是不可以單獨構成一個條目。
? DESC 'a country' 為可選值,用來描述 objectClass。
? MUST c 表示 c 屬性是必須的。這里的屬性 c (c 或者 countryName)必須存在,否則 objectClass 實例無法創建成功。如果要指明多個屬性是必須的,寫法是 ( attr1 $ attr2 $ attrn)。
? MAY ( searchGuide $ description ) 表示 searchGuide 和 description 是可選的,即創建 objectClass 時這兩個屬性不需要一定存在。
屬性(Attribute)
? attribute 定義在 Schema里。
? 一個 attribute 可以包含在一個或多個 objectClass 里。
? 一個 attribute 可以在包含它的 objectClass 里出現一次(SINGLE-VALUE)或多次(MULTI-VALUE)。默認為多次。
? 一個 attribute 可以是一個層級的一部分,此時它繼承所有來自父級的屬性。比如,commonName(cn),givenName(gn) 和 surname(sn)都是 name 屬性的子類。
? attribute 的定義包含它的類型(SYNTAX),比如,通過 matchingRules 定義字符串(string)或者數字(number)比較時是否大小寫敏感。
? attribute 定義遵守 ASN.1 注釋標準
示例 1:下面是一個簡單的 attribute 定義
attributetype ( 2.5.4.3 NAME ( 'cn' 'commonName' ) SUP name )
解釋:
? attributetype 說明這是一個關于 attribute 的定義
? 2.5.4.3 NAME ('cn' 'commonName') 定義一個全局唯一識別名。該識別名由兩部分組成:
– NAME ('cn' 'commonName') 定義一個可理解的名字 commonName 或者短別名 cn。原則上,短別名的個數沒有限制。cn 排在第一位,它被稱為主要名稱(primary name)。這在為搜索優化做條目索引時非常重要。
– 2.5.4.3 定義全局唯一的 OID (ObjectIdentifier)。由哪個組織分配這個號碼并不重要,但是必須是全局唯一的。通常推薦向 IANA申請一個 PEN (Private Enterprise Number)作為 OID 使用。
示例 2:
attributetype ( 2.5.4.41 NAME 'name'EQUALITY caseIgnoreMatchSUBSTR caseIgnoreSubstringsMatchSYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} )解釋:
? attributetype 同上。
? 2.5.4.41 NAME 'name' 同上。
? EQUALITY caseIgnoreMatch 定義了該屬性在搜索過濾(serach filter)中的行為。比如,(name=andy)。這里指定該屬性在搜索中大小寫不敏感。這里的 caseIgnoreSubstringMatch 就是一個 matchingRule。
? SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{32768} 是一個 OID,定義數據類型(data type)和要應用到數據的規則(data validation)。完整的定義可參考 RFC 2252 section 4.3.2。在本例中,OID 定義該屬性為目錄字符串(Directory String)類型(參考 RFC 2252 section 6.10)。 {32768} 定義字符串的最大長度,這是可選的。
條目(Entry)
? 目錄信息樹里 objectClass 的集合
? entry 有且只能有一個 STRUCTURAL objectClass。一個 STRUCTURAL objectClass 可能有一個同為 STRUCTURAL 類型的父級。
? entry 可以包含任意數目的 AUXILIARY objectClass。
? entry 可以有子 entry(child entry),父 entry(parent entry),同級 entry(sibling entry)
? entry 有三種類型:
– object entry - 最常見的一種,包含位于 objectClass 屬性(attributes)里的用戶數據
– alias entry - 帶有單一屬性 aliasedObjectName 的 objectClass 別名
– subentry - 用于存儲與父 entry 相關的管理或者操作數據
下圖是關于 objectClass, attribute 以及 entry 的示意圖:
LDAP 中的數據
LDAP 中的數據以條目(entry)的形式呈現,就像英文字典里單詞的條目。比如下面這個條目。它有很多屬性,例如:uid:bjensen,mail:bjensen@example.com。查找條目時,只需要指定一個或者多個屬性即可。
同時,該條目有一個唯一識別名稱:dn: uid=bjensen,ou=People,dc=example,dc=com。DN 是 Distinguished Name 的縮合。在目錄里沒有兩條相同的唯一識別名稱。
dn: uid=bjensen,ou=People,dc=example,dc=com uid: bjensen cn: Babs Jensen cn: Barbara Jensen facsimileTelephoneNumber: +1 408 555 1992 gidNumber: 1000 givenName: Barbara homeDirectory: /home/bjensen l: San Francisco mail: bjensen@example.com objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: person objectClass: posixAccount objectClass: top ou: People ou: Product Development roomNumber: 0209 sn: Jensen telephoneNumber: +1 408 555 1862 uidNumber: 1076常用命令
鑒于大多數的 LDAP 軟件大同小異,這里的內容就以OpenDS/OpenDJ 為例。
啟動和關閉: start-ds / stop-ds
? 語法: start-ds / stop-ds
? Windows:
– 打開命令窗口
– 瀏覽到到 bat
– 運行:
? 啟動: start-ds
? 關閉: stop-ds
? *nix:
– 打開命令窗口
– 瀏覽到到 /bin
– 運行:
? 啟動: ./start-ds
– 關閉: ./stop-ds
檢查 LDAP 服務器狀態: status
? 語法: status
? Windows:
– 打開命令窗口
– 瀏覽到到 bat
– 運行: status
? *nix:
– 打開命令窗口
– 瀏覽到到 /bin
? 運行: ./status
搜尋條目: ldapsearch
? 語法: ldapsearch ,其中: 為選項, 為過濾條件, 為顯示的屬性
? 示例: ldapsearch -p 389 -h 192.168.93.128 -D cn=Manager -w ts -b o=ptc uid=demo ,其中:
– :-p 389 -h 192.168.93.128 -D cn=Manager -w ts -b o=ptc
– : uid=demo
dn: uid=demo,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc objectClass: organizationalPerson objectClass: top objectClass: person objectClass: inetOrgPerson uid: demo mail: demouser preferredLanguage: en-US description: demo sn: Demo cn: Demo, Usero: Demo OrganizationuserPassword: {SSHA}IDSc3KN4Q1b2YSGfCBQiU4CXgBySg+AQsWkpEA==? 我們可以使用更復雜的條件,比如 "(|(uid=demo)(mail=demouser))": ldapsearch -p 389 -h 192.168.93.128 -D cn=Manager -w ts -b o=ptc "(|(uid=demo)(mail=demouser))"
修改密碼: ldappasswordmodify
? 語法: ldappasswordmodify
? 示例: ldappasswordmodify -p 389 -h 192.168.93.128 -D cn=Manager -w ts -a uid=demo,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc -n tsts ,其中:
– : -p 389 -h 192.168.93.128 -D cn=Manager -w ts -a uid=demo,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc -n tsts
? 如果修改成功,則會輸出: The LDAP password modify operation was successful
列出 backends: list-backends
? 語法: list-backends ,其中:
– -b, --baseDN {baseDN}
– -n, --backendID {backendName}
? 示例:list-backends
Backend ID : Base DN ---------------:------------------ adminRoot : cn=admin data ads-truststore : cn=ads-truststore backup : cn=backups config : cn=config monitor : cn=monitor schema : cn=schema tasks : cn=tasks userRoot : o=ptc導出 LDIF 文件: export-ldif
? 語法: export-ldif
? 示例:
– 即刻導出文件: export-ldif --ldifFile /root/config.ldif --backendID config --hostName localhost --port 4444 --bindDN cn=Manager --bindPassword ts --trustAll
– 定時導出文件,比如,在 2017/03/09 11:25:00 導出文件: export-ldif --ldifFile "/root/20170309112500.ldif" --backendID userRoot --hostName "http://en2k8-wnc-x24.ptcts.com" --port 4444 --bindDN "cn=Manager" --bindPassword ts --trustAll --start "20170309112500"
– 定期導出文件,比如,每月的第一天,12:50 分導出文件: export-ldif --ldifFile "/root/50121.ldif" --backendID userRoot --hostName "http://en2k8-wnc-x24.ptcts.com" --port 4444 --bindDN "cn=Manager" --bindPassword ts --trustAll --recurringTask "50 12 1 * *"
導入 LDIF 文件: import-ldif
? 語法: import-ldif
? 示例: import-ldif --ldifFile "/root/export.ldif" --backendID "userRoot" --overwrite --hostName "http://en2k8-wnc-x24.ptcts.com" --port "4444" --bindDN "cn=Manager" "--bindPassword" ts --trustAll
管理賬戶: manage-account
? 顯示賬戶的信息: manage-account -D "cn=manager" -w ts get-all --targetDN "uid=wcadmin,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc"
Password Policy DN: cn=Default Password Policy,cn=Password Policies,cn=config Account Is Disabled: false Account Expiration Time: Seconds Until Account Expiration: Password Changed Time: 20190607070745.945Z Password Expiration Warned Time: Seconds Until Password Expiration: Seconds Until Password Expiration Warning: Authentication Failure Times: Seconds Until Authentication Failure Unlock: Remaining Authentication Failure Count: 5 Last Login Time: Seconds Until Idle Account Lockout: Password Is Reset: false Seconds Until Password Reset Lockout: Grace Login Use Times: Remaining Grace Login Count: 0 Password Changed by Required Time: Seconds Until Required Change Time: Password History:? 顯示用戶狀態信息: manage-account -D "cn=manager" -w ts get-account-is-disabled --targetDN "uid=wcadmin,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc"
Account Is Disabled: false
? 禁用/啟用賬戶
– 禁用賬戶:manage-account -h localhost -p 4444 -D "cn=Manager" -w ts -X set-account-is-disabled --operationValue true --targetDN "uid=kongwusun,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc"
– 啟用賬戶:manage-account -h localhost -p 4444 -D "cn=Manager" -w ts clear-account-is-disabled --targetDN "uid=kongwushun,ou=people,cn=AdministrativeLdap,cn=Windchill_10.0,o=ptc"
性能
可以快速查看 /logs:
BIND RES conn=5 op=2 msgID=23 result=0 authDN="uid=wcadmin,ou=people,cn=AdministrativeLdap,cn=Windchill_11.2,o=ptc" etime=0其中,etime 的值默認以毫秒(milliseconds)為單位,表示服務器處理請求的時間。過大的 etime 通常暗示服務器存在性能問題。
如果需要調整 LDAP 的 JVM運行參數,可以編輯 /config/java.properties, 然后使用 dsjavaproperties 命令使設置生效。具體示例可參考這里。
其他需要考慮的性能調優因素可以參考官方文檔。
LDAP 瀏覽器
LDAP 瀏覽器可以連接到 LDAP 服務器,讓我們可以方便的查看、搜索、編輯 LDAP 內容。JXplorer 就是這樣一款免費的開源瀏覽器。當然,有很多其他的 LDAP 瀏覽器,大家可以自行下載嘗試。
參考文獻
1.
LDAP_百度百科?baike.baidu.com2.
https://en.wikipedia.org/wiki/LightweightDirectoryAccess_Protocol?en.wikipedia.org3.
LDAP for Rocket Scientists?www.zytrax.com4.
OpenDJ 3.5 > Administration Guide?backstage.forgerock.com 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的无法将该对象添加到ldap服务器_LDAP 基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中的demo_python中
- 下一篇: IOC操作Bean管理XML方式(bea