LDAP是輕量目錄訪問協議,全稱是Lightweight Directory Access Protocol,通常都簡稱爲LDAP。它是基於X.500標準的,可是簡單多了而且能夠根據須要定製。與X.500不一樣,LDAP支持TCP/IP或其餘面向鏈接的轉移服務,這對訪問Internet是必須的。LDAP的細節在RFC2251 「輕量級目錄訪問協議(v3)」和包含技術規範RFC3377的其餘文檔中定義。
html
LDAP信息模型基於條目(entries)。條目是具備全局惟一性的屬性集合專有名稱(DN,Distinguished Name)。DN用於明確指向條目。每一個條目的屬性都有一個類型(type )和一個或多個值(values)。這些類型一般是助記符字符串,例如「 cn 」,common name,表示公用名,或「 mail 」表示電子郵件地址。值的語法取決於屬性類型,例如,cn屬性可能包含值Babs Jensen,一個郵件屬性可能包含值「 babs@example.com 」,jpegPhoto屬性將包含以JPEG(二進制)格式的照片。前端
在LDAP中,目錄條目以分層樹狀結構排列。傳統上,這種結構反映了地理和/或組織邊界。表示國家/地區的條目顯示在樹的頂部。下面是表明各州和國家組織的條目。它們下面多是表示組織單位,人員,打印機,文檔或您能夠想到的任何其餘內容的條目。左圖顯示了使用傳統命名的示例LDAP目錄樹。web
還能夠基於因特網域名來安排樹。這種命名方法正變得愈來愈流行,由於它容許使用DNS定位目錄服務。右圖顯示了使用基於域的命名的LDAP目錄樹示例。sql
此外,LDAP容許您經過使用名爲objectClass的特殊屬性來控制條目中所需和容許的屬性。objectClass屬性的值肯定條目必須遵照的模式規則。shell
如何引用信息?條目由其DN名稱來引用,該名稱由條目自己的名稱(稱爲相對DN或RDN)並鏈接上其祖先條目名稱來合成。例如,上面互聯網命名示例中Barbara Jensen的條目的RDN爲uid = babs,DN爲uid = babs,ou = People,dc = example,dc = com。RFC2253 「輕量級目錄訪問協議(v3):可分辨名稱的UTF-8字符串表示」中描述了完整的DN格式。數據庫
如何獲取信息?LDAP定義了詢問和更新目錄的操做。提供操做以添加和刪除目錄中的條目,更改現有條目以及更改條目的名稱。可是,大多數狀況下,LDAP用於搜索目錄中的信息。LDAP搜索操做容許搜索目錄的某些部分以查找與搜索過濾器指定的某些條件匹配的條目。能夠從符合條件的每一個條目請求信息。例如,您可能但願在整個dc = example,dc = com目錄子樹下搜索名爲Barbara Jensen的人員,檢索找到的每一個條目的電子郵件地址。LDAP可以讓您輕鬆完成此操做。或者,您可能但願搜索st = California,c = US條目下方的條目,以查找名稱中包含字符串Acme且具備傳真號碼的組織。LDAP也可讓你這樣作。編程
如何保護信息免受未經受權的訪問?某些目錄服務不提供保護,容許任何人查看信息。LDAP爲客戶端提供了一種機制,用於對目錄服務器進行身份驗證或證實其身份,爲豐富的訪問控制鋪平了道路,以保護服務器包含的信息。LDAP還支持數據安全性(完整性和機密性)服務。後端
LDAP速度很是快,比當今最快的數據庫還要快,其實LDAP主要的應用場景是查詢多而修改極少,查詢和修改的比率是10:1 甚至更高, 那就充分發揮LDAP的優點了,專一於優化查詢,又沒有事務處理, 就像一個緩存同樣,那數據庫的速度但是比不上。 還有LDAP能存儲海量的數據,還能夠輕鬆地在各個系統之間複製,可用性超高。緩存
LDAP目錄服務基於客戶端 - 服務器模型。一個或多個LDAP服務器包含組成目錄信息樹(DIT)的數據。客戶端鏈接到服務器並詢問它。服務器響應搜索的答案 和/或 指向能夠獲取其餘客戶端位置的指針(一般是另外一個LDAP服務器)。不管客戶端鏈接到哪一個LDAP服務器,它都會看到相同的目錄視圖; 提供給一個LDAP服務器的名稱引用在另外一個LDAP服務器上是相同條目。這是全局目錄服務的重要功能,如LDAP。安全
從技術上講, LDAP 是一個X.500 目錄服務的目錄訪問協議 , OSI目錄服務。最初,LDAP客戶端訪問X.500目錄服務的網關。該網關運行客戶端和網關之間LDAP以及網關與X500服務器之間的X500DAP。DAP是一種重量級協議,可在完整的OSI協議棧上運行,而且須要大量的計算資源。LDAP旨在運行TCP/IP 並以更低的成本提供DAP的大部分功能。
雖然LDAP仍然用於經過網關訪問X.500目錄服務,但如今更常見的是在X.500服務器中直接實現LDAP。
能夠將獨立LDAP守護程序或slapd(8)視爲輕量級 X.500目錄服務器。也就是說,它沒有實現X.500的DAP,也不支持完整的X.500型號。
LDAPv3是在1990年代後期開發的,用於取代LDAPv2。LDAPv3將如下功能添加到LDAP:
LDAPv2具備歷史意義(RFC3494)。因爲大多數所謂的 LDAPv2實現(包括slapd(8))不符合LDAPv2技術規範,所以聲稱LDAPv2支持的實現之間的互操做性是有限的。因爲LDAPv2與LDAPv3顯着不一樣,所以同時部署LDAPv2和LDAPv3是很是有問題的。應避免使用LDAPv2。默認狀況下禁用LDAPv2。
LDAP目錄服務器的守護程序稱爲slapd和獨立的LDAP更新複製守護進程slurpd。
slapd(8)是一個在許多不一樣平臺上運行的LDAP目錄服務器。可使用它來提供本身的目錄服務。目錄能夠包含想要放入的任何內容。能夠將其鏈接到全局LDAP目錄服務,也能夠本身運行全部服務。slapd的一些更有趣的特性和功能包括:
LDAPv3:slapd實現版本3輕量級目錄訪問協議。slapd支持IPv4和IPv6以及Unix IPC上的LDAP。
簡單的身份驗證和安全層:slapd經過使用SASL支持強身份驗證和數據安全性(完整性和機密性)服務。 slapd的SASL實現使用Cyrus SASL軟件,該軟件支持多種機制,包括DIGEST-MD5,EXTERNAL和GSSAPI。
傳輸層安全性:slapd經過使用TLS(或SSL)支持基於證書的身份驗證和數據安全性(完整性和機密性)服務。 slapd的TLS實現使用OpenSSL軟件。
拓撲控制:slapd能夠配置爲根據網絡拓撲信息限制套接字層的訪問。此功能使用TCP包裝器。
訪問控制:slapd提供了豐富而強大的訪問控制功能,容許您控制對數據庫中信息的訪問。您能夠根據LDAP受權信息控制對條目的訪問,IP地址,域名和其餘標準。 slapd支持靜態和動態訪問控制信息。
國際化:slapd支持Unicode和語言標籤。
數據庫後端的選擇:slapd附帶了各類不一樣的數據庫後端,您能夠從中選擇。他們包括BDB,一個高性能的事務數據庫後端; HDB,分層的高性能事務後端; LDBM,一個基於DBM的輕量級後端; SHELL,任意shell腳本的後端接口; 和PASSWD,passwd(5)文件的簡單後端接口。BDB和HDB後端使用Sleepycat Berkeley DB。LDBM使用Berkeley DB或GDBM。
多個數據庫實例:slapd能夠配置爲同時爲多個數據庫提供服務。這意味着單個slapd服務器可使用相同或不一樣的數據庫後端響應LDAP樹的許多邏輯上不一樣部分的請求。
通用模塊API:若是您須要更多自定義,slapd可以讓您輕鬆編寫本身的模塊。slapd由兩個不一樣的部分組成:一個處理與LDAP客戶端協議通訊的前端; 和處理特定任務(如數據庫操做)的模塊。由於這兩件經過明確的方式進行溝通C API,您能夠編寫本身的自定義模塊,以多種方式擴展slapd。此外,還提供了許多可編程數據庫模塊。這些容許您使用流行的編程語言(Perl,shell,SQL和TCL)將外部數據源公開給slapd。
線程:slapd具備高性能的線程。單個多線程slapd進程使用線程池處理全部傳入請求。這樣能夠在提供高性能的同時減小所需的系統開銷。
複製:slapd能夠配置爲維護目錄信息的卷影副本。這種單主/多從複製方案在高容量環境中相當重要,由於單個slapd不能提供必要的可用性或可靠性。slapd支持兩種複製方法:基於LDAP Sync和基於slurpd(8)的複製。
代理緩存:slapd能夠配置爲緩存LDAP代理服務。
配置:slapd可經過單個配置文件進行高度配置,容許您更改您想要更改的全部內容。配置選項具備合理的默認值,使您的工做更輕鬆。
slurpd(8)是一個守護進程,經過slapd幫助,提供複製服務。它負責將對主slapd數據庫所作的更改分發到各類slapd副本。它讓slapd免於擔憂在更改發生時某些副本可能會關閉或沒法訪問; slurpd自動處理重試失敗的請求。 slapd和slurpd經過一個用於記錄更改的簡單文本文件進行通訊。
目錄服務
目錄服務中的目錄是專爲讀取,瀏覽和搜索而優化的專用分佈式數據庫。目錄每每包含描述性的,基於屬性的信息,並支持複雜的過濾功能。目錄一般不支持爲處理大量複雜更新而設計的數據庫管理系統中發現的復瑣事務或回滾方案。若是容許,目錄更新一般是簡單的全有或全無變化。目錄通過調整,能夠快速響應高容量查找或搜索操做。他們可能具備普遍複製信息的能力,以提升可用性和可靠性,同時縮短響應時間。複製目錄信息時,副本之間的臨時不一致可能沒問題,只要它們最終同步便可。
目錄數據庫和關係數據庫不一樣,它有優異的讀性能,但寫性能差,而且沒有事務處理、回滾等複雜功能,不適於存儲修改頻繁的數據。因此目錄天生是用來查詢的,就好象它的名字同樣。
目錄服務是由目錄數據庫和一套訪問協議組成的系統。大多用於存儲企業員工信息(用戶統一認證),還有公用證書和安全密鑰、公司的物理設備信息等查詢多更新少的信息。
提供目錄服務有許多不一樣的方法。不一樣的方法容許在目錄中存儲不一樣類型的信息,對如何引用、查詢和更新信息、如何防止未經受權的訪問等提出不一樣的要求。某些目錄服務是本地的,爲受限制的服務提供服務上下文(例如,單個機器上的單個服務)。其餘服務是全球性的,爲更普遍的環境(例如整個互聯網)提供服務。全局服務一般是分佈式的,這意味着它們包含的數據分佈在許多機器上,全部機器都協做提供目錄服務。一般,全局服務定義統一的命名空間能夠提供相同的數據視圖,不管在什麼地方,只與數據自己有關。互聯網域名系統 (DNS)是全局分佈式目錄服務的示例。
與LDAP同樣提供相似的目錄服務軟件還有ApacheDS、Active Directory、Red Hat Directory Service。
一、DIT 目錄信息樹 directory information tree,即目錄結構
二、Entry,條目,也叫記錄項,是LDAP中最基本的顆粒,就像字典中的詞條,或者是數據庫中的記錄。一般對LDAP的添加、刪除、更改、檢索都是以條目爲基本對象的。
DN
:distinguished Name,每個條目都有一個惟一的標識名(DN),每一個葉子結點到根的路徑就是DN,如上圖中一個 dn:」uid=andy,ou=people,dc=example,dc=com」 。經過DN的層次型語法結構,能夠方便地表示出條目在LDAP樹中的位置,一般用於檢索。
RDN
:Relative Distinguished Name,葉子結點自己的名字是RDN,即通常爲dn逗號最左邊的部分,如uid=andy。RDN也特指DN中最靠前的一段,而剩餘的部分稱爲父標識(Parent DN,PDN)。RDN自己也能夠由多個值構成,好比OU=Tech+CN=doubao,dc=shuyun,dc=com中的RDN爲OU=Tech+CN=doubao,由2個值OU=Tech和CN=doubao組成,他們之間由加好隔開。它與RootDN不一樣,RootDN一般與RootPW同時出現,特指管理LDAP中信息的最高權限用戶。
Base DN
: 基準DN,LDAP目錄樹的最頂部就是根,指定LDAP search的起始DN,也就是所謂的「Base DN」,如」dc=example,dc=com」。
若是DN中含有一些特殊字符,好比:,=+<>;\",他們須要轉轉義符(\)來幫助表述。
三、Attribute,屬性,每一個條目均可以有不少屬性(Attribute),好比常見的人都有姓名、地址、電話等屬性。每一個屬性都有名稱及對應的值,屬性值能夠有單個、多個。好比你有多個電話。屬性不是隨便定義的,須要符合必定的規則,而這個規則能夠經過schema制定。
LDAP爲人員組織機構中常見的對象都設計了屬性(好比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 | 內置屬性 | organizationalPerson |
四、AttributeType,屬性類型, 每一個屬性都有惟一的屬性類型(AttributeType),屬性類型約定屬性值的數據格式和語法類型(Syntax)。好比,屬性cellPhone的類型爲telephoneNumber,它規定了電話號碼是由數字組成的,其中容許插入一些分隔符,如鏈接符、括號、空格等。 屬性類型也約定了屬性值是否能夠有多少個,多值屬性類型也可使人員信息的組織變得更加靈活並接近現實狀況,好比:人員的手機、地址、郵箱等屬性均可以有多個值。這樣,用ldap組織的信息會比簡單的表結構更加理想。類型也規定了屬性查詢時的匹配規則、排序順序、大小寫敏感等。
五、ObjectClass,對象類是屬性的集合,LDAP預想了不少人員組織機構中常見的對象,並將其封裝成對象類。好比人員(person)含有姓(sn)、名(cn)、電話(telephoneNumber)、密碼(userPassword)等屬性,單位職工(organizationalPerson)是人員(person)的繼承類,除了上述屬性以外還含有職務(title)、郵政編碼(postalCode)、通訊地址(postalAddress)等屬性。
經過對象類能夠方便的定義條目類型。每一個條目能夠直接繼承多個對象類,這樣就繼承了各類屬性。若是2個對象類中有相同的屬性,則條目繼承後只會保留1個屬性。對象類同時也規定了哪些屬性是基本信息,必須含有(Must或Required,必要屬性):哪些屬性是擴展信息,能夠含有(May或Optional,可選屬性)。
對象類有三種類型:結構類型(Structural)、抽象類型(Abstract)和輔助類型(Auxiliary)。結構類型是最基本的類型,它規定了對象實體的基本屬性,每一個條目屬於且僅屬於一個結構型對象類。抽象類型能夠是結構類型或其餘抽象類型父類,它將對象屬性中共性的部分組織在一塊兒,稱爲其餘類的模板,條目不能直接集成抽象型對象類。輔助類型規定了對象實體的擴展屬性。雖然每一個條目只屬於一個結構型對象類,但能夠同時屬於多個輔助型對象類。
對象類自己是能夠相互繼承的,因此對象類的根類是top抽象型對象類。以經常使用的人員類型爲例,他們的繼承關係:
下面是inetOrgPerson對象類的在schema中的定義,能夠清楚的看到它的父類SUB和可選屬性MAY、必要屬性MUST(繼承自organizationalPerson),關於各屬性的語法則在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 )
)
六、Schema,對象類(ObjectClass)、屬性類型(AttributeType)、語法(Syntax)分別約定了條目、屬性、值,他們之間的關係以下圖所示。因此這些構成了模式(Schema)——對象類的集合。條目數據在導入時一般須要接受模式檢查,它確保了目錄中全部的條目數據結構都是一致的。有系統schema,用戶也可自定義schema文件。
schema(通常在/etc/ldap/schema/
目錄)在導入時要注意先後順序。
七、LDIF
LDIF(LDAP Data Interchange Format,數據交換格式)是LDAP數據庫信息的一種文本格式,經常使用來向目錄導入或更改記錄信息,每行都是「屬性: 值」對。
基本格式:AttributeName: value
屬性名 冒號 空格 屬性值
如
dn: dc=zy,dc=net
objectclass: dcObject
objectclass: organization
參考: