標籤: 暫無標籤

LDAP是輕量目錄訪問協議,英文全稱是Lightweight Directory Access Protocol,一般都簡稱為LDAP。它是基於X.500標準的,但是簡單多了並且可以根據需要定製。與X.500不同,LDAP支持TCP/IP,這對訪問Internet是必須的。LDAP的核心規範在RFC中都有定義,所有與LDAP相關的RFC都可以在LDAPman RFC網頁中找到。

1LDAP簡介

簡單的說來,LDAP是一個得到關於人或者資源的集中、靜態數據的快速方式。
LDAP是一個用來發布目錄信息到許多不同資源的協議。通常它都作為一個集中的地址本使用,不過根據組織者的需要,它可以做得更加強大。
LDAP其實是一個電話簿,類似於我們所使用諸如NIS(Network Information Service)、DNS (Domain Name Service)等網路目錄,也類似於你在花園中所看到的樹木。
不少LDAP開發人員喜歡把LDAP與關係資料庫相比,認為是另一種的存貯方式,然後在讀性能上進行比較。實際上,這種對比的基礎是錯誤的。LDAP和關係資料庫是兩種不同層次的概念,後者是存貯方式(同一層次如網格資料庫,對象資料庫),前者是存貯模式和訪問協議。LDAP是一個比關係資料庫抽象層次更高的存貯概念,與關係資料庫的查詢語言SQL屬同一級別。LDAP最基本的形式是一個連接資料庫的標準方式。該資料庫為讀查詢作了優化。因此它可以很快地得到查詢結果,不過在其它方面,例如更新,就慢得多。
特殊的資料庫
從另一個意義上 LDAP是實現了指定的數據結構的存貯,它是一種特殊的資料庫。但是LDAP和一般的資料庫不同,明確這一點是很重要的。 LDAP對查詢進行了優化,與寫性能相比LDAP的讀性能要優秀很多。
就象Sybase、Oracle、Informix或Microsoft的資料庫管理系統(DBMS)是用於處理查詢和更新關係型資料庫那樣,LDAP伺服器也是用來處理查詢和更新LDAP目錄的。換句話來說LDAP目錄也是一種類型的資料庫,但不是關係型資料庫。要特別注意的是,LDAP通常作為一個 hierarchical資料庫使用,而不是一個關係資料庫。因此,它的結構用樹來表示比用表格好。正因為這樣,就不能用SQL語句了。
21世紀的LDAP技術發展很快。 幾乎所有計算機平台上的所有的應用程序都可以從LDAP目錄中獲取信息。LDAP目錄中可以存儲各種類型的數據:電子郵件地址、郵件路由信息、人力資源數據、公用密匙、聯繫人列表,等等。通過把LDAP目錄作為系統集成中的一個重要環節,可以簡化員工在企業內部查詢信息的步驟,甚至連主要的數據源都可以放在任何地方。
伺服器
LDAP伺服器可以用「推」或「拉」的方法複製部分或全部數據,例如:可以把數據「推」到遠程的辦公室,以增加數據的安全性。複製技術是內置在LDAP伺服器中的而且很容易配置。如果要在DBMS中使用相同的複製功能,資料庫廠商就會要你支付額外的費用,而且也很難管理。

2目錄優勢

目錄服務
後端在Linux系統的典型實現可能是Linux+ Apache + postgresql,Apache和資料庫之間通過PHP3提供的函數進行連接。使用上述方法的缺點是後端關係資料庫的引入導致系統整體的性能降低和系統的管理比較繁瑣,因為需要不斷的進行數據類型的驗證和事務的完整性的確認;並且前端用戶對數據的控制不夠靈活,用戶許可權的設置一般只能是設置在表一級而不是設置在記錄一級。
目錄服務的推出主要是解決上述資料庫中存在的問題。目錄與關係資料庫相似,是指具有描述性的基於屬性的記錄集合,但它的數據類型主要是字元型,為了檢索的需要添加了BIN(二進位數據)、CIS(忽略大小寫)、CES(大小寫敏感)、TEL(電話型)等語法(Syntax),而不是關係資料庫提供的整數、浮點數、日期、貨幣等類型,同樣也不提供象關係資料庫中普遍包含的大量的函數,它主要面向數據的查詢服務(查詢和修改操作比一般是大於10:1),不提供事務的回滾(rollback)機制,它的數據修改使用簡單的鎖定機制實現All-or-Nothing,它的目標是快速響應和大容量查詢並且提供多目錄伺服器的信息複製功能。
現在該說說LDAP目錄到底有些什麼優勢了。現在LDAP的流行是很多因素共同作用的結果。可能LDAP最大的優勢是:可以在任何計算機平台上,用很容易獲得的而且數目不斷增加的LDAP的客戶端程序訪問LDAP目錄。而且也很容易定製應用程序為它加上LDAP的支持。
使用許可權
LDAP允許你根據需要使用ACI(一般都稱為ACL或者訪問控制列表)控制對數據讀和寫的許可權。例如,設備管理員可以有權改變員工的工作地點和辦公室號碼,但是不允許改變記錄中其它的域。ACI可以根據誰訪問數據、訪問什麼數據、數據存在什麼地方以及其它對數據進行訪問控制。因為這些都是由LDAP目錄伺服器完成的,所以不用擔心在客戶端的應用程序上是否要進行安全檢查。
LDAP(Lightweight Directory Access Protocol)是目錄服務在TCP/IP上的實現(RFC 1777 V2版和RFC 2251 V3版)。它是對X500的目錄協議的移植,但是簡化了實現方法,所以稱為輕量級的目錄服務。在LDAP中目錄是按照樹型結構組織,目錄由條目(Entry)組成,條目相當於關係資料庫中表的記錄;條目是具有區別名DN(Distinguished Name)的屬性(Attribute)集合,DN相當於關係資料庫表中的主鍵(Primary Key);屬性由類型(Type)和多個值(Values)組成,相當於關係資料庫中的域(Field)由域名和數據類型組成,只是為了方便檢索的需要,LDAP中的Type可以有多個Value,而不是關係資料庫中為降低數據的冗餘性要求實現的各個域必須是不相關的。LDAP中條目的組織一般按照地理位置和組織關係進行組織,非常的直觀。LDAP把數據存放在文件中,為提高效率可以使用基於索引的文件資料庫,而不是關係資料庫。LDAP協議集還規定了DN的命名方法、存取控制方法、搜索格式、複製方法、URL格式、開發介面等。
LDAP對於這樣存儲這樣的信息最為有用,也就是數據需要從不同的地點讀取,但是不需要經常更新。
例如,這些信息存儲在LDAP目錄中是十分有效的:
l 公司員工的電話號碼簿和組織結構圖
l 客戶的聯繫信息
l 計算機管理需要的信息,包括NIS映射、email假名,等等
l軟體包的配置信息
l 公用證書和安全密匙
什麼時候該用LDAP存儲數據
大多數的LDAP伺服器都為讀密集型的操作進行專門的優化。因此,當從LDAP伺服器中讀取數據的時候會比從專門為OLTP優化的關係型資料庫中讀取數據快一個數量級。也是因為專門為讀的性能進行優化,大多數的LDAP目錄伺服器並不適合存儲需要需要經常改變的數據。例如,用LDAP伺服器來存儲電話號碼是一個很好的選擇,但是它不能作為電子商務站點的資料庫伺服器。
如果下面每一個問題的答案都是「是」,那麼把數據存在LDAP中就是一個好主意。
l 需要在任何平台上都能讀取數據嗎?
l 每一個單獨的記錄項是不是每一天都只有很少的改變?
l 可以把數據存在平面資料庫(flat database)而不是關係型資料庫中嗎?換句話來說,也就是不管什麼範式不範式的,把所有東西都存在一個記錄中(差不多隻要滿足第一範式)。
最後一個問題可能會唬住一些人,其實用平面資料庫去存儲一些關係型的數據也是很一般的。例如,一條公司員工的記錄就可以包含經理的登錄名。用LDAP來存儲這類信息是很方便的。一個簡單的判斷方法:如果可以把數據存在一張張的卡片里,就可以很容易地把它存在LDAP目錄里。
組織數據
在UNIX文件系統中,最頂層是根目錄(root)。在根目錄的下面有很多的文件和目錄。象上面介紹的那樣,LDAP目錄也是用同樣的方法組織起來的。
在根目錄下,要把數據從邏輯上區分開。因為歷史上(X.500)的原因,大多數LDAP目錄用OU從邏輯上把數據分開來。OU表示「Organization Unit",在X.500協議中是用來表示公司內部的機構:銷售部、財務部,等等。現在LDAP還保留ou=這樣的命名規則,但是擴展了分類的範圍,可以分類為:ou=people, ou=groups, ou=devices,等等。更低一級的OU有時用來做更細的歸類。例如:LDAP目錄樹(不包括單獨的記錄)可能會是這樣的:
dc=foobar, dc=com
ou=customers
ou=asia
ou=europe
ou=usa
ou=employees
ou=rooms
ou=groups
ou=assets-mgmt
ou=nisgroups
ou=recipes
定製對象
你可以用LDAP存儲各種類型的數據對象,只要這些對象可以用屬性來表示,下面這些是可以在LDAP中存儲的一些信息:
l 員工信息:員工的姓名、登錄名、口令、員工號、他的經理的登錄名,郵件伺服器,等等。
l 物品跟蹤信息:計算機名、IP地址、標籤、型號、所在位置,等等。
l 客戶聯繫列表:客戶的公司名、主要聯繫人的電話、傳真和電子郵件,等等。
l 會議廳信息:會議廳的名字、位置、可以坐多少人、電話號碼、是否有投影機。
l 食譜信息:菜的名字、配料、烹調方法以及準備方法。
因為LDAP目錄可以定製成存儲任何文本或二進位數據,到底存什麼要由你自己決定。LDAP目錄用對象類型(object classes)的概念來定義運行哪一類的對象使用什麼屬性。在幾乎所有的LDAP伺服器中,你都要根據自己的需要擴展基本的LDAP目錄的功能,創建新的對象類型或者擴展現存的對象類型。
LDAP目錄以一系列「屬性對」的形式來存儲記錄項,每一個記錄項包括屬性類型和屬性值(這與關係型資料庫用行和列來存取數據有根本的不同)。下面是我存在LDAP目錄中的一部分食譜記錄:
dn: cn=Oatmeal Deluxe, ou=recipes, dc=foobar, dc=com
cn: Instant Oatmeal Deluxe
recipeCuisine: breakfast
recipeIngredient: 1 packet instant oatmeal
recipeIngredient: 1 cup water
recipeIngredient: 1 pinch salt
recipeIngredient: 1 tsp brown sugar
recipeIngredient: 1/4 apple, any type
請注意上面每一種配料都作為屬性recipeIngredient值。LDAP目錄被設計成象上面那樣為一個屬性保存多個值的,而不是在每一個屬性的後面用逗號把一系列值分開。
因為用這樣的方式存儲數據,所以資料庫就有很大的靈活性,不必為加入一些新的數據就重新創建表和索引。更重要的是,LDAP目錄不必花費內存或硬碟空間處理「空」域,也就是說,實際上不使用可選擇的域也不會花費你任何資源。
PART1
1.1. LDAP是什麼
LDAP是輕量目錄訪問協議,英文全稱是Lightweight Directory Access Protocol,一般都簡稱為LDAP。它是基於X.500標準的,但是簡單多了並且可以根據需要定製。與X.500不同,LDAP支持TCP/IP,這對訪問Internet是必須的。LDAP的核心規範在RFC中都有定義,所有與LDAP相關的RFC都可以在LDAPman RFC網頁中找到。
1.2. LDAP是電話簿
1.3. LDAP是不是資料庫
PART3
3. LDAP的基本模型
3.1 信息模型:描述LDAP的信息表示方式
在LDAP中信息以樹狀方式組織,在樹狀信息中的基本數據單元是條目,而每個條目由屬性構成,屬性中存儲有屬性值;LDAP中的信息模式,類似於面向對象的概念,在LDAP中每個條目必須屬於某個或多個對象類(Object Class),每個Object Class由多個屬性類型組成,每個屬性類型有所對應的語法和匹配規則;對象類和屬性類型的定義均可以使用繼承的概念。每個條目創建時,必須定義所屬的對象類,必須提供對象類中的必選屬性類型的屬性值,在LDAP中一個屬性類型可以對應多個值。
在LDAP中把對象類、屬性類型、語法和匹配規則統稱為Schema,在LDAP中有許多系統對象類、屬性類型、語法和匹配規則,這些系統Schema在LDAP標準中進行了規定,同時不同的應用領域也定義了自己的Schema,同時用戶在應用時,也可以根據需要自定義Schema。這有些類似於XML,除了XML標準中的XML定義外,每個行業都有自己標準的DTD或DOM定義,用戶也可以自擴展;也如同XML,在LDAP中也鼓勵用戶盡量使用標準的Schema,以增強信息的互聯互通。
在Schema中最難理解的是匹配規則,這是LDAP中為了加快查詢的速度,針對不同的數據類型,可以提供不同的匹配方法,如針對字元串類型的相等、模糊、大於小於均提供自己的匹配規則。
3.2 命名模型:描述LDAP中的數據如何組織
LDAP中的命名模型,也即LDAP中的條目定位方式。在LDAP中每個條目均有自己的DN和RDN。DN是該條目在整個樹中的唯一名稱標識,RDN是條目在父節點下的唯一名稱標識,如同文件系統中,帶路徑的文件名就是DN,文件名就是RDN。
3.3功能模型:描述LDAP中的數據操作訪問
在LDAP中共有四類10種操作:查詢類操作,如搜索、比較;更新類操作,如添加條目、刪除條目、修改條目、修改條目名;認證類操作,如綁定、解綁定;其它操作,如放棄和擴展操作。除了擴展操作,另外9種是LDAP的標準操作;擴展操作是LDAP中為了增加新的功能,提供的一種標準的擴展框架,當前已經成為LDAP標準的擴展操作,有修改密碼和StartTLS擴展,在新的RFC標準和草案中正在增加一些新的擴展操作,不同的LDAP廠商也均定義了自己的擴展操作。
3.4 安全模型:描述LDAP中的安全機制
LDAP中的安全模型主要通過身份認證、安全通道和訪問控制來實現。
3.4.1身份認證
在LDAP中提供三種認證機制,即匿名、基本認證和SASL(Simple Authentication and Secure Layer)認證。匿名認證即不對用戶進行認證,該方法僅對完全公開的方式適用;基本認證均是通過用戶名和密碼進行身份識別,又分為簡單密碼和摘要密碼認證;SASL認證即LDAP提供的在SSL和TLS安全通道基礎上進行的身份認證,包括數字證書的認證。
3.4.2 通訊安全
在LDAP中提供了基於SSL/TLS的通訊安全保障。SSL/TLS是基於PKI信息安全技術,是當前Internet上廣泛採用的安全服務。LDAP通過StartTLS方式啟動TLS服務,可以提供通訊中的數據保密性、完整性保護;通過強制客戶端證書認證的TLS服務,同時可以實現對客戶端身份和伺服器端身份的雙向驗證。
3.4.3訪問控制
雖然LDAP並無訪問控制的標準,但從一些草案中或是事實上LDAP產品的訪問控制情況,我們不難看出:LDAP訪問控制異常的靈活和豐富,在LDAP中是基於訪問控制策略語句來實現訪問控制的,這不同於現有的關係型資料庫系統和應用系統,它是通過基於訪問控制列表來實現的,無論是基於組模式或角色模式,都擺脫不了這種限制。
在使用關係型資料庫系統開發應用時,往往是通過幾個固定的資料庫用戶名訪問資料庫。對於應用系統本身的訪問控制,通常是需要建立專門的用戶表,在應用系統內開發針對不同用戶的訪問控制授權代碼,這樣一旦訪問控制策略變更時,往往需要代碼進行變更。總之一句話,關係型資料庫的應用中用戶數據管理和資料庫訪問標識是分離的,複雜的數據訪問控制需要通過應用來實現。
而對於LDAP,用戶數據管理和訪問標識是一體的,應用不需要關心訪問控制的實現。這是由於在LDAP中的訪問控制語句是基於策略語句來實現的,無論是訪問控制的數據對象,還是訪問控制的主體對象,均是與這些對象在樹中的位置和對象本身的數據特徵相關。
在LDAP中,可以把整個目錄、目錄的子樹、制定條目、特定條目屬性集或符合某過濾條件的條目作為控制對象進行授權;可以把特定用戶、屬於特定組或所有目錄用戶作為授權主體進行授權;最後,還可以定義對特定位置(例如IP地址或DNS名稱)的訪問權。
4. LDAP數據結構

PART4

LDAP是實現了指定的數據結構的存貯,它包括以下可以用關係資料庫實現的結構要求:樹狀組織、條目認證、類型定義、許可樹形記錄拷貝。
4.1 樹狀組織
無論是X500還是LDAP都是採用樹狀方式進行記錄。每一個樹目錄都有一個樹根的入口條目,子記錄全部是這一根條目的子孫。這是目錄與關係數據類型最大的區別(關係資料庫的應用結構也可實現樹狀記錄)。因此,把目錄看作是更高級的樹狀資料庫也未嘗不可,只不過除此外,它不能實現關係存貯的重要功能。
4.2 條目和條目認證
LDAP是以條目作為認證的根據。ROOT的許可權認證與目錄本身無關,但除此外所有條目的認證許可權由條目本身的密碼進行認證。LDAP可以配置成各種各樣不同的父子條目許可權繼承方式。
每一個條目相當於一個單一的平面文本記錄,由條目自身或指定的條目認證進行訪問控制。因此,LDAP定義的存貯結構等同於一批樹狀組織的平面資料庫,並提供相應的訪問控制。
條目中的記錄以名-值對的形式存在,每一個名值對必須由數據樣式schema預定義。因此,LDAP可以看作是以規定的值類型以名值對形式存貯在一系列以樹狀組織的平面資料庫的記錄的集合。
4.3 數據樣式(schema)
數據樣式schema是針對不同的應用,由用戶指定(設計)類和屬性類型預定義,條目中的類(objectclass)和屬性必須在在LDAP伺服器啟動時載入內存的schema已有定義。因此,AD活動目錄中的條目記錄就必須符合Active Directory的schema中。如果已提供的schema中的定義不夠用,用戶可以自行定義新的schema.
在http://ldap.akbkhome點com/index.php中可以看到常用的schema。
4.4 對象類型(objectClass)
LDAP目錄用對象類型(objectclass)的概念來定義運行哪一類的對象使用什麼屬性。
條目中的記錄通過objectclass實現分類,objectClass是一個繼承性的類定義,每一個類定義指定必須具備的屬性。如某一條目指定必須符合某個類型,則它必須具備超類所指定的屬性。
通過objectclass分類,分散的條目中的記錄就實際上建立了一個索引結構,為高速的讀查詢打下了基礎。Objectclass也是過濾器的主要查詢對象。
4.5 過濾器和語法
LDAP是一個查詢為主的記錄結構,無論是何種查詢方式,最終都由過濾器缺點查詢的條件。過濾器相當於SQL中的WHERE子句。任何LDAP的類過濾和字元串都必須放在括弧內,如(objectclass=*),指列出所有類型的記錄(不過分類)。
可以使用=,>=,<=,~=(約等於)進行比較,如(number<=100)。合併條件是最怪的,必須把操作符放在兩個操作對象的前面而不是中間,單一操作對象用括弧括起來。如
l A與B,不是A&B,而是(&(A)(B))。
l 或使用"|"表示;
l 非使用"!"表示。
l 對於"與",或"或"在操作符后可以跟多個條件表達式,但非后則只參是單個表達式。
詳見RFC1558。
4.6 樹移植
LDAP最重要的特性和要求並不是讀性能,而是擴展性。這一特性是通過樹移植和樹複製實現的。按LDAP的RFC要求,LDAP目錄應該可以任意地在不同的目錄間連接、合併並實現自動複製,及自動性同步。這意味著用戶可以在任一LDAP中訪問條目,而不用管其中某一部分是否複製自全世界另一目錄中的記錄,同時另一目錄中的記錄同樣在正常運作。
這一特性如果在關係資料庫中實現,意味著要使用程序化的非規範化預複製。類似於匯總帳目的設計。
4.7 LDIF交換文件
LDIF是LDAP約定的記錄交換格式,以平面文本的形式存在,是大部分LDAP內容交換的基礎,如拷貝、添加、修改等操作,都是基於LDIF文件進行操作。
4.8 JAVA或CORBA對象串列化存儲
網路高效率的訪問加上JAVA的跨平台能力,當把JAVA或CORBA對象串列化后存儲到LDAP目錄上時,可以產生非同一般的集成效果--實際上,這正是EJB和.NET的網路定位基礎技術。
使用JAVA或CORBA對象存儲時,必須首先讓LDAP服務支持該對象定義,也就是說包含qmail.schema或corba.schema。
JAVA必須存儲在objectclass=javacontainer的條目中,而且必須帶有cn屬性,這意味著除非該JAVA類專門實現了DirContext介面,對於大多數JAVA類來說,只能採用DirContext代替Context實現bind的添加操作。取出JAVA類相對要簡單得多,只需使用context.lookup()獲得該對象的句柄,然後強製造型成所需要的對象就可以了,如:
Person p=(Person)contex.lookup("cn=elvis,dc=daifu,dc=com");
這個句法在EJB的程序中,是經常用到的。
使用CORBA的跨語言性質,使用CORBA存儲對象比JAVA更加誘人,這意味著所存儲的對象可以被任何語言編寫的客戶端訪問。其實,微軟的.net說到底也非常簡單,無非是把COM對象存儲到微軟自家的目錄ActiveDirectory裡面,從而可以在網路範圍內使用任何微軟平台的語言進行對象訪問而已。眾所周知,COM就是與CORBA相對的微軟規範。
使用對象串列化技術,可以把常用對象如某個印表機,某個客戶直接存儲到LDAP中,然後快速獲取該對象的引用,這樣,就比把對象信息存儲到關係資料庫中,分別取出屬性,然後再初始化對象操作的做法,效率要高得多了。這是LDAP比普通關係資料庫存儲要優秀的地方,而對象資料庫還不成熟。
上一篇[MIME]    下一篇 [ingres]

相關評論

同義詞:暫無同義詞