LDAP入門
LDAP簡介
LDAP是輕量目錄訪問協(xié)議,全稱是Lightweight Directory Access Protocol,一般都簡稱為LDAP。它是基于X.500標準的,但是簡單多了并且可以根據(jù)需要定制。與X.500不同,LDAP支持TCP/IP或其他面向連接的轉(zhuǎn)移服務,這對訪問Internet是必須的。LDAP的細節(jié)在RFC2251 “輕量級目錄訪問協(xié)議(v3)”和包含技術(shù)規(guī)范RFC3377的其他文檔中定義。
LDAP信息模型基于條目(entries)。條目是具有全局唯一性的屬性集合專有名稱(DN,Distinguished Name)。DN用于明確指向條目。每個條目的屬性都有一個類型(type )和一個或多個值(values)。這些類型通常是助記符字符串,例如“ cn ”,common name,表示公用名,或“ mail ”表示電子郵件地址。值的語法取決于屬性類型,例如,cn屬性可能包含值Babs Jensen,一個郵件屬性可能包含值“ babs@example.com ”,jpegPhoto屬性將包含以JPEG(二進制)格式的照片。
在LDAP中,目錄條目以分層樹狀結(jié)構(gòu)排列。傳統(tǒng)上,這種結(jié)構(gòu)反映了地理和/或組織邊界。表示國家/地區(qū)的條目顯示在樹的頂部。下面是代表各州和國家組織的條目。它們下面可能是表示組織單位,人員,打印機,文檔或您可以想到的任何其他內(nèi)容的條目。左圖顯示了使用傳統(tǒng)命名的示例LDAP目錄樹。
還可以基于因特網(wǎng)域名來安排樹。這種命名方法正變得越來越流行,因為它允許使用DNS定位目錄服務。右圖顯示了使用基于域的命名的LDAP目錄樹示例。


此外,LDAP允許您通過使用名為objectClass的特殊屬性來控制條目中所需和允許的屬性。objectClass屬性的值確定條目必須遵守的模式規(guī)則。
如何引用信息?條目由其DN名稱來引用,該名稱由條目本身的名稱(稱為相對DN或RDN)并連接上其祖先條目名稱來合成。例如,上面互聯(lián)網(wǎng)命名示例中Barbara Jensen的條目的RDN為uid = babs,DN為uid = babs,ou = People,dc = example,dc = com。RFC2253 “輕量級目錄訪問協(xié)議(v3):可分辨名稱的UTF-8字符串表示”中描述了完整的DN格式。
如何獲取信息?LDAP定義了詢問和更新目錄的操作。提供操作以添加和刪除目錄中的條目,更改現(xiàn)有條目以及更改條目的名稱。但是,大多數(shù)情況下,LDAP用于搜索目錄中的信息。LDAP搜索操作允許搜索目錄的某些部分以查找與搜索過濾器指定的某些條件匹配的條目。可以從符合條件的每個條目請求信息。例如,您可能希望在整個dc = example,dc = com目錄子樹下搜索名為Barbara Jensen的人員,檢索找到的每個條目的電子郵件地址。LDAP可讓您輕松完成此操作。或者,您可能希望搜索st = California,c = US條目下方的條目,以查找名稱中包含字符串Acme且具有傳真號碼的組織。LDAP也可以讓你這樣做。
如何保護信息免受未經(jīng)授權(quán)的訪問?某些目錄服務不提供保護,允許任何人查看信息。LDAP為客戶端提供了一種機制,用于對目錄服務器進行身份驗證或證明其身份,為豐富的訪問控制鋪平了道路,以保護服務器包含的信息。LDAP還支持數(shù)據(jù)安全性(完整性和機密性)服務。
LDAP速度非常快,比當今最快的數(shù)據(jù)庫還要快,其實LDAP主要的應用場景是查詢多而修改極少,查詢和修改的比率是10:1 甚至更高, 那就充分發(fā)揮LDAP的優(yōu)勢了,專注于優(yōu)化查詢,又沒有事務處理, 就像一個緩存一樣,那數(shù)據(jù)庫的速度可是比不上。 還有LDAP能存儲海量的數(shù)據(jù),還可以輕松地在各個系統(tǒng)之間復制,可用性超高。
LDAP如何工作?
LDAP目錄服務基于客戶端 - 服務器模型。一個或多個LDAP服務器包含組成目錄信息樹(DIT)的數(shù)據(jù)。客戶端連接到服務器并詢問它。服務器響應搜索的答案 和/或 指向可以獲取其他客戶端位置的指針(通常是另一個LDAP服務器)。無論客戶端連接到哪個LDAP服務器,它都會看到相同的目錄視圖; 提供給一個LDAP服務器的名稱引用在另一個LDAP服務器上是相同條目。這是全局目錄服務的重要功能,如LDAP。
X.500怎么樣?
從技術(shù)上講, LDAP 是一個X.500 目錄服務的目錄訪問協(xié)議 , OSI目錄服務。最初,LDAP客戶端訪問X.500目錄服務的網(wǎng)關(guān)。該網(wǎng)關(guān)運行客戶端和網(wǎng)關(guān)之間LDAP以及網(wǎng)關(guān)與X500服務器之間的X500DAP。DAP是一種重量級協(xié)議,可在完整的OSI協(xié)議棧上運行,并且需要大量的計算資源。LDAP旨在運行TCP/IP 并以更低的成本提供DAP的大部分功能。
雖然LDAP仍然用于通過網(wǎng)關(guān)訪問X.500目錄服務,但現(xiàn)在更常見的是在X.500服務器中直接實現(xiàn)LDAP。
可以將獨立LDAP守護程序或slapd(8)視為輕量級 X.500目錄服務器。也就是說,它沒有實現(xiàn)X.500的DAP,也不支持完整的X.500型號。
LDAPv2和LDAPv3有什么區(qū)別?
LDAPv3是在1990年代后期開發(fā)的,用于取代LDAPv2。LDAPv3將以下功能添加到LDAP:
- 強大的身份驗證和數(shù)據(jù)安全服務 SASL
- 證書認證和數(shù)據(jù)安全服務 TLS (SSL)
- 通過使用Unicode實現(xiàn)國際化
- 推薦和延續(xù)
- 架構(gòu)發(fā)現(xiàn)
- 可擴展性(控件,擴展操作等)
LDAPv2具有歷史意義(RFC3494)。由于大多數(shù)所謂的 LDAPv2實現(xiàn)(包括slapd(8))不符合LDAPv2技術(shù)規(guī)范,因此聲稱LDAPv2支持的實現(xiàn)之間的互操作性是有限的。由于LDAPv2與LDAPv3顯著不同,因此同時部署LDAPv2和LDAPv3是非常有問題的。應避免使用LDAPv2。默認情況下禁用LDAPv2。
LDAP服務
LDAP目錄服務器的守護程序稱為slapd和獨立的LDAP更新復制守護進程slurpd。
slapd
slapd(8)是一個在許多不同平臺上運行的LDAP目錄服務器。可以使用它來提供自己的目錄服務。目錄可以包含想要放入的任何內(nèi)容。可以將其連接到全局LDAP目錄服務,也可以自己運行所有服務。slapd的一些更有趣的特性和功能包括:
LDAPv3:slapd實現(xiàn)版本3輕量級目錄訪問協(xié)議。slapd支持IPv4和IPv6以及Unix IPC上的LDAP。
簡單的身份驗證和安全層:slapd通過使用SASL支持強身份驗證和數(shù)據(jù)安全性(完整性和機密性)服務。 slapd的SASL實現(xiàn)使用Cyrus SASL軟件,該軟件支持多種機制,包括DIGEST-MD5,EXTERNAL和GSSAPI。
傳輸層安全性:slapd通過使用TLS(或SSL)支持基于證書的身份驗證和數(shù)據(jù)安全性(完整性和機密性)服務。 slapd的TLS實現(xiàn)使用OpenSSL軟件。
拓撲控制:slapd可以配置為根據(jù)網(wǎng)絡拓撲信息限制套接字層的訪問。此功能使用TCP包裝器。
訪問控制:slapd提供了豐富而強大的訪問控制功能,允許您控制對數(shù)據(jù)庫中信息的訪問。您可以根據(jù)LDAP授權(quán)信息控制對條目的訪問,IP地址,域名和其他標準。 slapd支持靜態(tài)和動態(tài)訪問控制信息。
國際化:slapd支持Unicode和語言標簽。
數(shù)據(jù)庫后端的選擇:slapd附帶了各種不同的數(shù)據(jù)庫后端,您可以從中選擇。他們包括BDB,一個高性能的事務數(shù)據(jù)庫后端; HDB,分層的高性能事務后端; LDBM,一個基于DBM的輕量級后端; SHELL,任意shell腳本的后端接口; 和PASSWD,passwd(5)文件的簡單后端接口。BDB和HDB后端使用Sleepycat Berkeley DB。LDBM使用Berkeley DB或GDBM。
多個數(shù)據(jù)庫實例:slapd可以配置為同時為多個數(shù)據(jù)庫提供服務。這意味著單個slapd服務器可以使用相同或不同的數(shù)據(jù)庫后端響應LDAP樹的許多邏輯上不同部分的請求。
通用模塊API:如果您需要更多自定義,slapd可讓您輕松編寫自己的模塊。slapd由兩個不同的部分組成:一個處理與LDAP客戶端協(xié)議通信的前端; 和處理特定任務(如數(shù)據(jù)庫操作)的模塊。因為這兩件通過明確的方式進行溝通C API,您可以編寫自己的自定義模塊,以多種方式擴展slapd。此外,還提供了許多可編程數(shù)據(jù)庫模塊。這些允許您使用流行的編程語言(Perl,shell,SQL和TCL)將外部數(shù)據(jù)源公開給slapd。
線程:slapd具有高性能的線程。單個多線程slapd進程使用線程池處理所有傳入請求。這樣可以在提供高性能的同時減少所需的系統(tǒng)開銷。
復制:slapd可以配置為維護目錄信息的卷影副本。這種單主/多從復制方案在高容量環(huán)境中至關(guān)重要,因為單個slapd不能提供必要的可用性或可靠性。slapd支持兩種復制方法:基于LDAP Sync和基于slurpd(8)的復制。
代理緩存:slapd可以配置為緩存LDAP代理服務。
配置:slapd可通過單個配置文件進行高度配置,允許您更改您想要更改的所有內(nèi)容。配置選項具有合理的默認值,使您的工作更輕松。
slurpd
slurpd(8)是一個守護進程,通過slapd幫助,提供復制服務。它負責將對主slapd數(shù)據(jù)庫所做的更改分發(fā)到各種slapd副本。它讓slapd免于擔心在更改發(fā)生時某些副本可能會關(guān)閉或無法訪問; slurpd自動處理重試失敗的請求。 slapd和slurpd通過一個用于記錄更改的簡單文本文件進行通信。
目錄服務
目錄服務中的目錄是專為讀取,瀏覽和搜索而優(yōu)化的專用分布式數(shù)據(jù)庫。目錄往往包含描述性的,基于屬性的信息,并支持復雜的過濾功能。目錄通常不支持為處理大量復雜更新而設計的數(shù)據(jù)庫管理系統(tǒng)中發(fā)現(xiàn)的復雜事務或回滾方案。如果允許,目錄更新通常是簡單的全有或全無變化。目錄經(jīng)過調(diào)整,可以快速響應高容量查找或搜索操作。他們可能具有廣泛復制信息的能力,以提高可用性和可靠性,同時縮短響應時間。復制目錄信息時,副本之間的臨時不一致可能沒問題,只要它們最終同步即可。
目錄數(shù)據(jù)庫和關(guān)系數(shù)據(jù)庫不同,它有優(yōu)異的讀性能,但寫性能差,并且沒有事務處理、回滾等復雜功能,不適于存儲修改頻繁的數(shù)據(jù)。所以目錄天生是用來查詢的,就好象它的名字一樣。
目錄服務是由目錄數(shù)據(jù)庫和一套訪問協(xié)議組成的系統(tǒng)。大多用于存儲企業(yè)員工信息(用戶統(tǒng)一認證),還有公用證書和安全密鑰、公司的物理設備信息等查詢多更新少的信息。
提供目錄服務有許多不同的方法。不同的方法允許在目錄中存儲不同類型的信息,對如何引用、查詢和更新信息、如何防止未經(jīng)授權(quán)的訪問等提出不同的要求。某些目錄服務是本地的,為受限制的服務提供服務上下文(例如,單個機器上的單個服務)。其他服務是全球性的,為更廣泛的環(huán)境(例如整個互聯(lián)網(wǎng))提供服務。全局服務通常是分布式的,這意味著它們包含的數(shù)據(jù)分布在許多機器上,所有機器都協(xié)作提供目錄服務。通常,全局服務定義統(tǒng)一的命名空間可以提供相同的數(shù)據(jù)視圖,無論在什么地方,只與數(shù)據(jù)本身有關(guān)。互聯(lián)網(wǎng)域名系統(tǒng) (DNS)是全局分布式目錄服務的示例。
與LDAP一樣提供類似的目錄服務軟件還有ApacheDS、Active Directory、Red Hat Directory Service。
基本概念
1、DIT 目錄信息樹 directory information tree,即目錄結(jié)構(gòu)

2、Entry,條目,也叫記錄項,是LDAP中最基本的顆粒,就像字典中的詞條,或者是數(shù)據(jù)庫中的記錄。通常對LDAP的添加、刪除、更改、檢索都是以條目為基本對象的。
DN:distinguished Name,每一個條目都有一個唯一的標識名(DN),每個葉子結(jié)點到根的路徑就是DN,如上圖中一個 dn:”uid=andy,ou=people,dc=example,dc=com” 。通過DN的層次型語法結(jié)構(gòu),可以方便地表示出條目在LDAP樹中的位置,通常用于檢索。
RDN:Relative Distinguished Name,葉子結(jié)點本身的名字是RDN,即一般為dn逗號最左邊的部分,如uid=andy。RDN也特指DN中最靠前的一段,而剩余的部分稱為父標識(Parent DN,PDN)。RDN本身也可以由多個值構(gòu)成,比如OU=Tech+CN=doubao,dc=shuyun,dc=com中的RDN為OU=Tech+CN=doubao,由2個值OU=Tech和CN=doubao組成,他們之間由加好隔開。它與RootDN不同,RootDN通常與RootPW同時出現(xiàn),特指管理LDAP中信息的最高權(quán)限用戶。
Base DN: 基準DN,LDAP目錄樹的最頂部就是根,指定LDAP search的起始DN,也就是所謂的“Base DN”,如”dc=example,dc=com”。
如果DN中含有一些特殊字符,比如:,=+<>;\",他們需要轉(zhuǎn)轉(zhuǎn)義符(\)來幫助表述。
3、Attribute,屬性,每個條目都可以有很多屬性(Attribute),比如常見的人都有姓名、地址、電話等屬性。每個屬性都有名稱及對應的值,屬性值可以有單個、多個。比如你有多個電話。屬性不是隨便定義的,需要符合一定的規(guī)則,而這個規(guī)則可以通過schema制定。
LDAP為人員組織機構(gòu)中常見的對象都設計了屬性(比如commonName,surname)。下面有一些常用的別名:
| 屬性 | 別名 | 語法 | 描述 | 值(舉例) |
|---|---|---|---|---|
| commonName | cn | Directory String | 姓名 | sean |
| surname | sn | Directory String | 姓 | Chow |
| organizationalUnitName | ou | Directory String | 單位(部門)名稱 | IT_SECTION |
| organization | o | Directory String | 組織(公司)名稱 | example |
| telephoneNumber | Telephone Number | 電話號碼 | 110 | |
| objectClass | 內(nèi)置屬性 | organizationalPerson |
4、AttributeType,屬性類型, 每個屬性都有唯一的屬性類型(AttributeType),屬性類型約定屬性值的數(shù)據(jù)格式和語法類型(Syntax)。比如,屬性cellPhone的類型為telephoneNumber,它規(guī)定了電話號碼是由數(shù)字組成的,其中允許插入一些分隔符,如連接符、括號、空格等。 屬性類型也約定了屬性值是否可以有多少個,多值屬性類型也可以使人員信息的組織變得更加靈活并接近現(xiàn)實情況,比如:人員的手機、地址、郵箱等屬性都可以有多個值。這樣,用ldap組織的信息會比簡單的表結(jié)構(gòu)更加理想。類型也規(guī)定了屬性查詢時的匹配規(guī)則、排序順序、大小寫敏感等。
5、ObjectClass,對象類是屬性的集合,LDAP預想了很多人員組織機構(gòu)中常見的對象,并將其封裝成對象類。比如人員(person)含有姓(sn)、名(cn)、電話(telephoneNumber)、密碼(userPassword)等屬性,單位職工(organizationalPerson)是人員(person)的繼承類,除了上述屬性之外還含有職務(title)、郵政編碼(postalCode)、通信地址(postalAddress)等屬性。
通過對象類可以方便的定義條目類型。每個條目可以直接繼承多個對象類,這樣就繼承了各種屬性。如果2個對象類中有相同的屬性,則條目繼承后只會保留1個屬性。對象類同時也規(guī)定了哪些屬性是基本信息,必須含有(Must或Required,必要屬性):哪些屬性是擴展信息,可以含有(May或Optional,可選屬性)。
對象類有三種類型:結(jié)構(gòu)類型(Structural)、抽象類型(Abstract)和輔助類型(Auxiliary)。結(jié)構(gòu)類型是最基本的類型,它規(guī)定了對象實體的基本屬性,每個條目屬于且僅屬于一個結(jié)構(gòu)型對象類。抽象類型可以是結(jié)構(gòu)類型或其他抽象類型父類,它將對象屬性中共性的部分組織在一起,稱為其他類的模板,條目不能直接集成抽象型對象類。輔助類型規(guī)定了對象實體的擴展屬性。雖然每個條目只屬于一個結(jié)構(gòu)型對象類,但可以同時屬于多個輔助型對象類。
對象類本身是可以相互繼承的,所以對象類的根類是top抽象型對象類。以常用的人員類型為例,他們的繼承關(guān)系:

下面是inetOrgPerson對象類的在schema中的定義,可以清楚的看到它的父類SUB和可選屬性MAY、必要屬性MUST(繼承自organizationalPerson),關(guān)于各屬性的語法則在schema中的attributetype定義。
# inetOrgPerson
# The inetOrgPerson represents people who are associated with an
# organization in some way. It is a structural class and is derived
# from the organizationalPerson which is defined in X.521 [X521].
objectclass ( 2.16.840.1.113730.3.2.2
NAME 'inetOrgPerson'
DESC 'RFC2798: Internet Organizational Person'
SUP organizationalPerson
STRUCTURAL
MAY (
audio $ businessCategory $ carLicense $ departmentNumber $
displayName $ employeeNumber $ employeeType $ givenName $
homePhone $ homePostalAddress $ initials $ jpegPhoto $
labeledURI $ mail $ manager $ mobile $ o $ pager $
photo $ roomNumber $ secretary $ uid $ userCertificate $
x500uniqueIdentifier $ preferredLanguage $
userSMIMECertificate $ userPKCS12 )
)
6、Schema,對象類(ObjectClass)、屬性類型(AttributeType)、語法(Syntax)分別約定了條目、屬性、值,他們之間的關(guān)系如下圖所示。所以這些構(gòu)成了模式(Schema)——對象類的集合。條目數(shù)據(jù)在導入時通常需要接受模式檢查,它確保了目錄中所有的條目數(shù)據(jù)結(jié)構(gòu)都是一致的。有系統(tǒng)schema,用戶也可自定義schema文件。

schema(一般在/etc/ldap/schema/目錄)在導入時要注意前后順序。
7、LDIF
LDIF(LDAP Data Interchange Format,數(shù)據(jù)交換格式)是LDAP數(shù)據(jù)庫信息的一種文本格式,常用來向目錄導入或更改記錄信息,每行都是“屬性: 值”對。
基本格式:AttributeName: value
屬性名 冒號 空格 屬性值
如
dn: dc=zy,dc=net
objectclass: dcObject
objectclass: organization
參考:

浙公網(wǎng)安備 33010602011771號