LDAP基本概念

LDAP(Lightweight Directory Access Protocol)是一種基於計算模型的客戶機/服務器X.500目錄服務訪問協議。LDAP是從X.500目錄訪問協議的基礎上發展過來的,它是對X.500的簡化,它和X.500的主要區別在於:
  1. LDAP是基於TCP/IP的,而X.500是基於OSI網絡協議棧,OSI很少有真正的應用
  2. LDAP刪除了X.500中一些繁瑣而不常用的功能
  3. LDAP使用了更簡潔的字符串來表示數據,而非比較複雜的結構化語法ASN1 (Abstract Syntax Notation One)

LDAP客戶端和LDAP服務器端交互的一般過程
  1. LDAP客戶端發起連接請求與LDAP服務器建立會話,LDAP的術語是綁定(binding)。在建立綁定時客戶端通常需要指定訪問用戶,以便能夠訪問服務器上的目錄信息。
  2. LDAP客戶端發出目錄查詢、新建、更新、刪除、移動目錄條目、比較目錄條目等操作
  3. LDAP客戶端結束與服務器的會話,即解除綁定(unbinding)

LDAP和RFC文檔
LDAP協議的版本目前是3.0,它是有一系列RFC組成成的:
RFC2251 Light-weight Directory Access Protocol
主要定義了LDAP的操作、在客戶端和服務器之間的交換的消息格式。爲了更好地支持國際化,它規定數據用UTF-8表示。此外,相對舊版本RFC2251又添加了referral的功能,並把schema本身存放到目錄中,使得客戶端可以讀取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和屬性已經由X.500定義,該RFC對這些在LDAP中使用的objectClass作了總結。

LDAP的四層模型

  1. Information model 描述LDAP目錄結構
  2. Naming model 描述目錄條目的唯一標識方法
  3. Functional model 描述LDAP支持的操作
  4. Security 描述目錄信息的訪問控制


Information model
目 錄條目是LDAP中最基本的表示信息的單元,每個目錄條目可以一個以上的屬性,和編程語言及數據庫類型定義中的屬性不同,LDAP中的屬性允許多值。每個 屬性都屬於一種類型,類型規定了屬性允許存放的值的約束條件,同時也規定了該類型的數據進行比較時規則,這一點類似於關係數據庫中的字符型數據的 collation。LDAP中是用語法(syntax)這一概念來表式屬性的取值約束和比較規則的。常用的LDAP Syntax有:

bin 二進制信息
ces 大小寫敏感比較,也就是所謂的directory string
cis 大小寫不敏感比較
tel 電話號碼,字符串中的空格、減號在比較時會被去掉
dn 標識
Generalized Time
Postal Address

屬性定義在LDAP中是全局的,屬性名稱通常有簡寫形式,常用的屬性如下:
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進一步約束目錄條目。schema是一種類型定義機制,每種類型定義又成爲objectClass,它規定一個該類 型的目錄條目實例必須的和可選的屬性等其它約束。和麪向對象的編程語言相似,objectClass支持繼承,並且所有的objectClass都是 top的子類型,因爲top定義了必須的屬性objectClass,所以所有的目錄條目實例都有objectClass這個屬性。常見的 objectClass有:
InetOrgPerson, OrganizationalUnit, Organization
extensibleObject允許任何屬性。


Naming model
DN是無歧義標識一個目錄條目的名字。DN的語法如下:

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
...
由此可見,如果在RDN中有多個屬性則需將它們用加號"+"連接。比如,cn=John Smith+l=Shanghai,o=SUN,c=CN。此外,屬性也可以用OID來表示,比如cn=John Smith等價於2.5.4.2 = John Smith。
以下是常用的屬性名和它代表的意義(在LDAP中屬性名大小寫不敏感):
CN 常用名稱,常常是DN的一部分
L 地名,通常是城市的名稱
ST 州或省的名稱
O 組織名稱
OU 組織單位
C 國家名稱
STREET 街道地址
DC 域名成分
UID 用戶標識

後綴(suffix)是目錄信息樹中頂層節點的DN,一個LDAP服務器可以存放多個後綴。
引 用(referral)是一種將分佈在不同LDAP服務器中目錄信息子樹連接成邏輯上的一棵完整樹的機制。創建referral將目錄條目增加一個值爲 "referral"的objectClass,並將屬性ref設成引用的目錄樹的LDAP URL。引用過程的大致步驟是:
LDAP客戶端發出查詢請求
LDAP服務器發現該請求目錄信息不在該服務器上,但服務器保存了這些信息的引用,服務器就返回一個引用,用LDAP URL告訴客戶端真正的信息源的位置
LDAP客戶端接受到引用後,決定是否根據引用向真正的目錄信息源發請求

與referral相對應的是chaining,它和referral的區別在於referral要求客戶端解析引用,而chaining是由服務器來完成的。chaining過程的大致步驟是:
LDAP客戶端發出查詢請求
LDAP服務器發現該請求目錄信息不在該服務器上,但服務器保存了這些信息的引用,服務器就信息源發出請求,取得信息並返回給客戶端
LDAP客戶端響應

referral是LDAP v3定義的,但chaining並不屬於LDAP v3的範疇。

LDAP v3規定了LDAP服務器必須將自己的信息存放在一個特殊的DN下(又稱root DSE),主要的信息是:
服務器存放的後綴
存放schema的DN
該服務器支持的LDAP的版本
支持的SASL安全機制

Functional model
Functional model是指訪問和更新LDAP目錄信息的機制。LDAP的操作基本上有三類:查詢、更新和認證
查詢是LDAP中最複雜的操作,它允許客戶端指定查詢的起點、查詢的深度、屬性需要滿足的條件以及最終返回的目錄條目所包含的屬性。
查 詢的起點是通過base DN來指定的,查詢的深度即範圍有三種baseObject, singleLevel, wholeSubtree。baseObject只對base DN指定的目錄條目進行查詢;singleLevel只對base DN的直接子節點進行查詢; wholeSubtree對base DN(包括base DN)的所有子節點查詢。屬性需要滿足的條件是用search filter來表達的。此外,還可以指定別名的解析(Aliase Dereferrencing)和查詢的結果集大小限定和查詢時間限定。
search filter的基本語法是:
attribute operator value
主要的操作符有:=, >=, <=, =*, ~=其中=*可以表示匹配子字符串,~=近似相等。例子有sn=*表示sn有值的所有目錄條目。cn=J*Smi*, sn~=smit。
多個簡單filter可以用關係操作符組成複合表達式,基本語法是:
(&(filter1)(filter2)...(filtern))
(|(filter1)(filter2)...(filtern))
(!(filter))
例子有:(|(sn=Miler)(sn=Smith)), (|(sn=Miler)(&(ou=Austin)(sn=Smith)))

更新操作
LDAP定義了以下更新操作:
add 創建新的目錄條目到目錄樹種
delete 刪除目錄條目,只有葉子節點可以刪除,刪除別名並不影響被引用的節點
modify 修改目錄條目的屬性,包括增加、刪除屬性
modify DN 移動目錄樹

認證操作
LDAP定義了以下認證操作:
bind 該操作用於在LDAP的客戶端和服務器之間建立會話
unbind 該操作用於結束LDAP會話
abandon 該操作用於放棄前一個操作

control和Extended Operation
Control 和Extended Operation用來在不修改LDAP協議本身的前提下擴展LDAP的功能。control用來修改操作的行爲,Extended Operation用來增加新的操作。每個control由標識、參數、重要性構成。如果重要性爲TRUE,那麼服務器要麼處理該control,要麼完 全不支持該control;如果重要性爲FALSE,那麼那些無法支持該control的服務器可以忽略該control。Extended Operation由標識、參數構成。

LDIF文件格式
LDAP協議定義LDIF文件格式用於在不同的LDAP實現產品之間交換數據。LDIF的字符編碼必須是UTF-8。LDIF文件的基本格式如下:
[]
dn:
objectClass:
objectClass:
...
attributeType[;language tag]:attributeValue
attributeType[;language tag]:attributeValue
...

在LDIF文件中表示二進制數據時必須使用base64編碼。凡是base64編碼的數據用兩個冒號開頭,例如:jpegPhoto:: 。以&ldquo#&rdquo開頭的行是註釋行,以單個空格開始的行表示與前一行在邏輯上同一行。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=677927


<script src="http://localhost:82/PromoteIcon.aspx?id=677927" type="text/javascript"></script> [收藏到我的網摘]   schnell18發表於 2006年04月26日 11:44:00
href="http://blog.csdn.net/schnell18/Services/Pingback.aspx" rel="pingback" /> <script type="text/javascript">function hide(){showComment();}</script>
相關文章:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章