LDAP(Lightweight Directory Access Protocol) 是一種基于計算模型的客戶(hù)機/服務(wù)器X.500目錄服務(wù)訪(fǎng)問(wèn)協(xié)議。LDAP是從X.500目錄訪(fǎng)問(wèn)協(xié)議的基礎上發(fā)展過(guò)來(lái)的,它是對X.500的簡(jiǎn)化,它和X.500的主要區別在于:
LDAP是基于TCP/IP的,而X.500是基于OSI網(wǎng)絡(luò )協(xié)議棧,OSI很少有真正的應用 LDAP刪除了X.500中一些繁瑣而不常用的功能 LDAP使用了更簡(jiǎn)潔的字符串來(lái)表示數據,而非比較復雜的結構化語(yǔ)法ASN1 (Abstract Syntax Notation One) LDAP客戶(hù)端和LDAP服務(wù)器端交互的一般過(guò)程 LDAP客戶(hù)端發(fā)起連接請求與LDAP服務(wù)器建立會(huì )話(huà),LDAP的術(shù)語(yǔ)是綁定(binding)。在建立綁定時(shí)客戶(hù)端通常需要指定訪(fǎng)問(wèn)用戶(hù),以便能夠訪(fǎng)問(wèn)服務(wù)器上的目錄信息。 LDAP客戶(hù)端發(fā)出目錄查詢(xún)、新建、更新、刪除、移動(dòng)目錄條目、比較目錄條目等操作 LDAP客戶(hù)端結束與服務(wù)器的會(huì )話(huà),即解除綁定(unbinding) LDAP和RFC文檔 LDAP協(xié)議的版本目前是3.0,它是有一系列RFC組成成的:
RFC2251 Light-weight Directory Access Protocol
主要定義了LDAP的操作、在客戶(hù)端和服務(wù)器之間的交換的消息格式。為了更好地支持國際化,它規定數據用UTF-8表示。此外,相對舊版本RFC2251又添加了referral的功能,并把schema本身存放到目錄中,使得客戶(hù)端可以讀取schema信息
RFC2252 Light-weight Directory Access Protocol -- Attribute Syntax Definition
RFC2253 Light-weight Directory Access Protocol -- UTF-8 String Representation of Distinguished Names
RFC2254 Light-weight Directory Access Protocol -- The String Representation of LDAP Search Filters
RFC2255 Light-weight Directory Access Protocol -- The LDAP URL format
RFC2256 A summary of X.500 user schema for use with LDAP v3
一些常用的objectClass和屬性已經(jīng)由X.500定義,該RFC對這些在LDAP中使用的objectClass作了總結。
LDAP的四層模型 Information model 描述LDAP目錄結構 Naming model 描述目錄條目的唯一標識方法 Functional model 描述LDAP支持的操作 Security 描述目錄信息的訪(fǎng)問(wèn)控制 Information model 目 錄條目是LDAP中最基本的表示信息的單元,每個(gè)目錄條目可以一個(gè)以上的屬性,和編程語(yǔ)言及數據庫類(lèi)型定義中的屬性不同,LDAP中的屬性允許多值。每個(gè) 屬性都屬于一種類(lèi)型,類(lèi)型規定了屬性允許存放的值的約束條件,同時(shí)也規定了該類(lèi)型的數據進(jìn)行比較時(shí)規則,這一點(diǎn)類(lèi)似于關(guān)系數據庫中的字符型數據的 collation。LDAP中是用語(yǔ)法(syntax)這一概念來(lái)表式屬性的取值約束和比較規則的。常用的LDAP Syntax有:
bin 二進(jìn)制信息
ces 大小寫(xiě)敏感比較,也就是所謂的directory string
cis 大小寫(xiě)不敏感比較
tel 電話(huà)號碼,字符串中的空格、減號在比較時(shí)會(huì )被去掉
dn 標識
Generalized Time
Postal Address
屬性定義在LDAP中是全局的,屬性名稱(chēng)通常有簡(jiǎn)寫(xiě)形式,常用的屬性如下:
commonName, cn cis John Smith
surname, sn cis Smith
telephoneNumber tel 021-34354576
organizationalUnitName, ou cis it
owner dn cn=John Smith, o=SUN, c=CN
organization, o cis SUN
jpegPhoto bin
在 屬性的基礎上LDAP還用schema進(jìn)一步約束目錄條目。schema是一種類(lèi)型定義機制,每種類(lèi)型定義又成為objectClass,它規定一個(gè)該類(lèi) 型的目錄條目實(shí)例必須的和可選的屬性等其它約束。和面向對象的編程語(yǔ)言相似,objectClass支持繼承,并且所有的objectClass都是 top的子類(lèi)型,因為top定義了必須的屬性objectClass,所以所有的目錄條目實(shí)例都有objectClass這個(gè)屬性。常見(jiàn)的 objectClass有:
InetOrgPerson, OrganizationalUnit, Organization
extensibleObject允許任何屬性。
Naming model DN是無(wú)歧義標識一個(gè)目錄條目的名字。DN的語(yǔ)法如下:
DistinguishedName = [name]
name = name-component *(, name-component)
name-component = attributeTypeAndValue*("+" attributeTypeAndValue)
attributeTypeAndValue = attributeType "=" attributeValue
attributeType = (ALPHA 1*keychar) / oid
keychar = ALPHA / DIGIT / "-"
oid = 1*DIGIT *("." 1*DIGIT)
attributeValue = string
...
由此可見(jiàn),如果在RDN中有多個(gè)屬性則需將它們用加號"+"連接。比如,cn=John Smith+l=Shanghai,o=SUN,c=CN。此外,屬性也可以用OID來(lái)表示,比如cn=John Smith等價(jià)于2.5.4.2 = John Smith。
以下是常用的屬性名和它代表的意義(在LDAP中屬性名大小寫(xiě)不敏感):
CN 常用名稱(chēng),常常是DN的一部分
L 地名,通常是城市的名稱(chēng)
ST 州或省的名稱(chēng)
O 組織名稱(chēng)
OU 組織單位
C 國家名稱(chēng)
STREET 街道地址
DC 域名成分
UID 用戶(hù)標識
后綴(suffix)是目錄信息樹(shù)中頂層節點(diǎn)的DN,一個(gè)LDAP服務(wù)器可以存放多個(gè)后綴。
引 用(referral)是一種將分布在不同LDAP服務(wù)器中目錄信息子樹(shù)連接成邏輯上的一棵完整樹(shù)的機制。創(chuàng )建referral將目錄條目增加一個(gè)值為 "referral"的objectClass,并將屬性ref設成引用的目錄樹(shù)的LDAP URL。引用過(guò)程的大致步驟是:
LDAP客戶(hù)端發(fā)出查詢(xún)請求
LDAP服務(wù)器發(fā)現該請求目錄信息不在該服務(wù)器上,但服務(wù)器保存了這些信息的引用,服務(wù)器就返回一個(gè)引用,用LDAP URL告訴客戶(hù)端真正的信息源的位置
LDAP客戶(hù)端接受到引用后,決定是否根據引用向真正的目錄信息源發(fā)請求
與referral相對應的是chaining,它和referral的區別在于referral要求客戶(hù)端解析引用,而chaining是由服務(wù)器來(lái)完成的。chaining過(guò)程的大致步驟是:
LDAP客戶(hù)端發(fā)出查詢(xún)請求
LDAP服務(wù)器發(fā)現該請求目錄信息不在該服務(wù)器上,但服務(wù)器保存了這些信息的引用,服務(wù)器就信息源發(fā)出請求,取得信息并返回給客戶(hù)端
LDAP客戶(hù)端響應
referral是LDAP v3定義的,但chaining并不屬于LDAP v3的范疇。
LDAP v3規定了LDAP服務(wù)器必須將自己的信息存放在一個(gè)特殊的DN下(又稱(chēng)root DSE),主要的信息是:
服務(wù)器存放的后綴
存放schema的DN
該服務(wù)器支持的LDAP的版本
支持的SASL安全機制
Functional model Functional model是指訪(fǎng)問(wèn)和更新LDAP目錄信息的機制。LDAP的操作基本上有三類(lèi):查詢(xún)、更新和認證
查詢(xún)是LDAP中最復雜的操作,它允許客戶(hù)端指定查詢(xún)的起點(diǎn)、查詢(xún)的深度、屬性需要滿(mǎn)足的條件以及最終返回的目錄條目所包含的屬性。
查 詢(xún)的起點(diǎn)是通過(guò)base DN來(lái)指定的,查詢(xún)的深度即范圍有三種baseObject, singleLevel, wholeSubtree。baseObject只對base DN指定的目錄條目進(jìn)行查詢(xún);singleLevel只對base DN的直接子節點(diǎn)進(jìn)行查詢(xún); wholeSubtree對base DN(包括base DN)的所有子節點(diǎn)查詢(xún)。屬性需要滿(mǎn)足的條件是用search filter來(lái)表達的。此外,還可以指定別名的解析(Aliase Dereferrencing)和查詢(xún)的結果集大小限定和查詢(xún)時(shí)間限定。
search filter的基本語(yǔ)法是:
attribute operator value
主要的操作符有:=, >=, <=, =*, ~=其中=*可以表示匹配子字符串,~=近似相等。例子有sn=*表示sn有值的所有目錄條目。cn=J*Smi*, sn~=smit。
多個(gè)簡(jiǎn)單filter可以用關(guān)系操作符組成復合表達式,基本語(yǔ)法是:
(&(filter1)(filter2)...(filtern))
(|(filter1)(filter2)...(filtern))
(!(filter))
例子有:(|(sn=Miler)(sn=Smith)), (|(sn=Miler)(&(ou=Austin)(sn=Smith)))
更新操作
LDAP定義了以下更新操作:
add 創(chuàng )建新的目錄條目到目錄樹(shù)種
delete 刪除目錄條目,只有葉子節點(diǎn)可以刪除,刪除別名并不影響被引用的節點(diǎn)
modify 修改目錄條目的屬性,包括增加、刪除屬性
modify DN 移動(dòng)目錄樹(shù)
認證操作
LDAP定義了以下認證操作:
bind 該操作用于在LDAP的客戶(hù)端和服務(wù)器之間建立會(huì )話(huà)
unbind 該操作用于結束LDAP會(huì )話(huà)
abandon 該操作用于放棄前一個(gè)操作
control和Extended Operation
Control 和Extended Operation用來(lái)在不修改LDAP協(xié)議本身的前提下擴展LDAP的功能。control用來(lái)修改操作的行為,Extended Operation用來(lái)增加新的操作。每個(gè)control由標識、參數、重要性構成。如果重要性為T(mén)RUE,那么服務(wù)器要么處理該control,要么完 全不支持該control;如果重要性為FALSE,那么那些無(wú)法支持該control的服務(wù)器可以忽略該control。Extended Operation由標識、參數構成。
LDIF文件格式 LDAP協(xié)議定義LDIF文件格式用于在不同的LDAP實(shí)現產(chǎn)品之間交換數據。LDIF的字符編碼必須是UTF-8。LDIF文件的基本格式如下:
[
] dn: objectClass: objectClass: ...attributeType[;language tag]:attributeValue attributeType[;language tag]:attributeValue
... 在LDIF文件中表示二進(jìn)制數據時(shí)必須使用base64編碼。凡是base64編碼的數據用兩個(gè)冒號開(kāi)頭,例如:jpegPhoto:: 。以&ldquo#&rdquo開(kāi)頭的行是注釋行,以單個(gè)空格開(kāi)始的行表示與前一行在邏輯上同一行。