LDAP技術報告

LDAP技術報告
  一、目錄和目錄服務
       LDAP(Lightweight Directory Access Protocol)輕型目錄訪問協議是目錄訪問協議的一種。因此下面首先介紹什麼是目錄和目錄服務。
       目錄是一個以一定規則排列的對象的屬性集合,是一個存儲着關於對象各種屬性的特殊數據庫,這些屬性可以供訪問和管理對象時使用,類似電話簿和圖書館卡片分類系統。這裏,我們所談的目錄服務是指網絡目錄服務。目錄服務是指一個存儲着用於訪問、管理或配置網絡資源信息的特殊數據庫(also called data repository),它把網絡環境中的各種資源都作爲目錄信息,在目錄樹結構中分層存儲,對這些信息可以存儲、訪問、管理並使用。網絡中的這些資源包括用戶、各個應用系統、硬件設備、網絡設備、數據、信息等。目錄服務是爲有效的集成管理網絡目錄中的信息提供服務,是支持網絡系統的重要底層基礎技術之一。
目錄服務將分佈式系統中的用戶、資源和組成分佈式系統的其它對象統一的組織起來,提供一個單一的邏輯視圖,允許用戶和應用透明地訪問網絡上的資源。一個由目錄服務支持的網絡系統是一個集成的、網絡化的、統一的系統,而不是各個獨立功能部分的簡單聚合。在目錄服務系統中對象可以根據名字或功能、屬性訪問,而不是根據機器地址、文件服務器名字和mail地址等訪問。在目錄服務的基礎上開發的應用,易於使用、功能增強和易於管理,目錄信息的共享爲應用的開發提供了方便。下一代分佈式網絡的信息模型和模式是一種基於目錄的,當我們進入網絡時,是登錄到一個基於目錄的網絡中,而不是登錄到某個機器上。
目錄服務可以存儲信息種類:
用戶帳戶信息(登入名、口令、權限)
用戶個人信息(電話號碼、地址、僱員ID號)
外圍設備配置信息(打印機、調製借調器、傳真)
應用程序配置信息
安全信息
網絡基礎設施配置信息(路由器、代理服務器、INTERNET訪問設置)
人們可以想得到的,網絡目錄中都可以存儲
這些信息集中在一個標準數據庫中,就可以有多種不同的使用方法。其中,最普通的是供系統管理員用於網絡訪問控制和網絡資源訪問控制。目錄將成爲對許多網絡活動進行集中控制的地方。

       控制的例子:
用戶登入進入一個網絡,系統進行認證和權限判定;
用戶進入網絡後,訪問網絡中的資源,系統向目錄服務查詢該用戶是否具有使用該資源的權限,並返回所請求資源的物理地址。
個人用戶可以使用目錄服務存儲個人設置信息,並可以對其所有環境進行集中存儲和控制。
隨着目錄服務技術的成熟,人們可以使用該技術通過一些網絡設備監視和控制網絡傳輸情況。

    目錄服務的基本功能:
資源信息的目錄式表示、分佈存儲、資源定位和查找、用戶的統一認證、系統資源的統一授權、系統資源信息的共享、系統資源的單點統一管理、安全傳輸的保證、資源的統一監控等。
目錄服務的主要優點:
網絡管理工作大大減輕,包括管理網絡上的各個應用;
網絡的集中管理點;
訪問用戶信息的集中控制點;
存儲在其它條件下很難處理的管理信息
系統資源信息的利用率高、管理的可擴展性好
簡單地說,目錄的發展經歷了書面目錄(電話目錄、醫士列表)——基於計算機的目錄(PIM,不易共享、必須訪問到響應的軟件和計算機)——網絡目錄(公共的、共享的、統一的)。
傳統的目錄是計算機或網絡基礎結目錄的一個構件,它向其它應用程序提供服務,但沒有提供集成管理的機制,網絡上的計算和服務需要一種公共的、分佈式的目錄,能夠跨平臺地對應用程序和用戶提供集中、統一的服務。目錄服務將使網絡上的系統資源管理朝着單一的、全網絡的目標發展,並能夠讓用戶、管理員以更容易的方式來管理網絡環境。目錄服務作爲一種工具來減少大型網絡的管理負擔,提供了集中的單點管理和適應複雜環境所必須的靈活性,減輕了非目錄服務系統中存在的冗餘管理。
通過網絡資源邏輯接口,目錄服務(ADS)減少了人們爲了利用網絡功能而必須對網絡掌握的程度。也就是說,普通用戶只需要很少的網絡知識,就可以通過複雜網絡訪問和使用資源。用戶不需要再瞭解資源的物理分佈,訪問本地打印機的方法和訪問遠程網絡資源的方法相同。目錄服務(ADS)提供了邏輯表示與資源的網絡上的物理位置的連接,從用戶的角度看,這可能是轉移到基於目錄的網絡操作系統具有的最大優點。)
目錄服務和數據庫的區別:
讀多於寫
一般不支持事務處理
信息訪問方式不同(一個是SQL、一個是LDAP的API)
目錄中的信息一般不要求嚴格的一致性
傳統的數據庫是平面的,無法表示資源之間及資源使用控制的複雜邏輯關係而遠遠不能滿足當前資源信息管理的各種要求。
目錄服務與DNS系統的相同之處和不同之處
相同之處:
分佈存儲
樹型層次結構
容錯
不同之處:
DNS的功能和目錄服務不同,DNS功能單一,本質上是將主機名解析成IP地址。目錄服務是可以爲多個應用提供網絡資源的信息存儲和管理,具有廣泛的應用特性;
DNS是以一系列文本文件爲基礎,是一種純文本式的數據庫,無法進行擴展,適應其它功能的要求;
與分佈式文件系統的相同在於採用了準樹型層次結構,具有一定的授權功能,區別在於:
目錄服務表示資源的各種屬性信息,可爲各種應用提供服務,文件不能表示;
目錄服務有很強的邏輯表示和分類,文件的組織邏輯性單一,主要按存儲位置;
文件系統的認證功能較差
獨立性強
目錄服務的應用舉例
C4ISR系統:由多個大的子系統構成,管理問題更爲複雜和嚴重
新的應用:電子商務(IBM)、操作系統(WINDOWS2000)
網絡的監控管理
會議系統和PIM
搜索功能
太多的應用——基於目錄的應用
原有應用的資源管理的重新開發
二、  LDAP協議的特點
X.500協議是爲了便於建立全局、分佈式的目錄信息而設計的一套協議。它是一種C---S(Client—Server)結構的應用協議,支持用戶通過網絡訪問和維護資源信息,另外還具有幾個突出的特點:
支持分佈式的目錄信息維護,所以每一個運行X.500的服務器都只需負責自己所管轄的資源信息,只需在本地就可完成信息的更新;
提供強大查詢能力,可以讓用戶隨心所欲的設計查詢方式;
全局的信息標示,通過這種標示可以唯一的定位信息位置,獲取內容;
結構化的信息模式,支持開發者的本地擴展;
遵循統一的標準,所以可以通過標準的方式訪問任何一個X.500服務器,獲取信息;
X.500協議中包含了這諸多的強大功能,可以說在很大的程度上滿足了用戶和開發者的要求,但是在用戶和開發制的使用過程中卻逐漸暴露出其許多的不足之處,阻礙了它的應用和推廣,主要集中在使用方式和性能開銷上這兩個方面,由於X.500是在OSI協議棧上實現的,雖然X.500提供了強大的信息查詢功能,但是協議所要求的訪問格式卻十分複雜,往往難以掌握;其次在運行X.500服務器時對系統的開銷要求較高。爲了兼顧保留協議的優點和克服這些不盡人意的地方,推出了由X.500目錄服務協議延伸發展而來的輕型目錄訪問協議(Lightweight Drectory Access Protocol,簡稱LDAP)。LDAP協議繼承了X.500的90%左右的功能,同時兼容所有使用X.500協議建立的服務端數據庫,避免了重複開發的浪費;在運行開銷上卻只是X.500的10%。正是由於LDAP具有巨大的優越性,它從一開始僅僅是作爲X.500客戶層的另一種實現方式,到現在在許多應用中完全替代了X.500協議,成爲一個完整實用的應用開發協議。
LDAP在以下四個方面對X.500進行了簡化:
傳輸 :   LDAP直接運行在TCP上,避免了OSI多層通信的高層開銷;
功能:    LDAP簡化了X.500的功能,拋棄了較少用到的功能和冗餘的操作;
數據表示:X.500的數據表示結構複雜,LDAP採用簡單的字符串對數據進行表示;
編碼:    LDAP用於網絡傳輸的編碼規則比 X.500的編碼規則更加簡單。
總到來說,基於LDAP的目錄服務有以下特點。
目的是存儲網絡資源的信息
結構化的信息框架(面向對象的信息存儲方法),採用樹型層次式結構表示
在系統中的單點集中(不指物理位置)管理資源,可實現單一登入點
讀多於寫
基於TCP 協議
Client/Server邏輯結構
標準的訪問協議LDAP
強大的搜索功能,允許用戶組織複雜的查詢要求
維護的分散性(信息可分佈存儲,具有集中式數據庫無可比擬的優越性)
可全球唯一的命名
動態添加和修改信息
容錯功能
自動更新和維護存儲的信息
方便的備份和恢復功能
安全訪問和信息傳輸的安全
易對資源進行授權管理
三、  LDAP協議的內容
        LDAP定義了四種基本模型:
信息模型說明了LDAP目錄中可以存儲哪些信息;
命名模型說明了如何組織和引用LDAP目錄中的信息;
功能模型說明了LDAP目錄中的信息處理,特別是如何訪問和更新信息;
安全模型說明如何保護LDAP目錄中的信息不受非授權訪問和修改。
信息模型
       LDAP的信息模型是以模式(Schema)爲基礎的,以項目(Entry)爲核心的。模式由若干項目組成,項目是描述客觀實體的基本單位,項目(如圖3)由描述客觀實體具體信息的一組屬性(Attribute)構成。屬性(如圖3)只能有一種類型(Type),可以有一個或多個值(Value)。屬性的類型具體說明屬性值可以存儲哪些信息,以及這些信息的行爲特性。例如,屬性cn的類型是caseIgnoreString,它意味着屬性值是按照詞典排序的字符串,並且在比較時忽略大小寫,如BEIJING和Beijing是相同的;屬性tele的類型是telephoneNumber,它具有caseIgnoreString的全部特性,另外在比較時忽略空格和破折號,如0731-4573670和07314573670是相同的。每個項目都有一個屬性objectClass,用於說明項目的類型,以及項目中的必選屬性和可選屬性。屬性objectClass的取值可以是一個或多個,其中必須有一個用於說明項目的基本結構的結構對象類(Structural object class),結構對象類不能輕易改變;除此之外,還可以有若干個對項目結構進行輔助說明的輔助對象類(Auxiliary object class),在訪問控制允許的範圍內可以新增或刪除輔助對象類。

命名模型
        在LDAP目錄中,項目是按照樹形結構組織的,根據項目在樹形結構中的位置對項目進行命名,這樣的命名通常稱爲標識(Distinguished name),簡稱DN。DN由若干元素構成,每個元素稱爲相對標識(Relative distinguished name),簡稱RDN。RDN由項目的一個或多個屬性構成。

       LDAP的命名模型(如圖4)與我們熟悉的文件系統有很多相似之處,RDN與文件系統中的文件名很相似,DN與文件的絕對路徑名很相似。另外,與文件系統一樣,兄弟項目(即,具有相同父項目的子項目)必然具有不同的RDN。LDAP的命名模型與文件系統之間的區別主要有:
在LDAP目錄中,位於葉節點和非葉節點的項目都擁有各自的屬性;在文件系統中,只有位於葉節點的文件擁有較豐富的內容,而位於非葉節點的目錄的內容相對簡單。
在LDAP目錄中,DN中各元素的排序是從葉到根;在文件系統中,文件絕對路徑名中各元素的排序是從根到葉。
在LDAP目錄中,DN中各元素之間的分隔符是“,”;在文件系統中,文件絕對路徑名中各元素之間的分隔符是“/”或“/”。
在LDAP目錄中,允許超越樹形結構的別名項目(Alias entry),它指向其它項目。

功能模型
        LDAP的功能模型涉及以下三個方面:
詢問(Interrogation)
LDAP在信息詢問方面主要定義了查找(Search)和比較(Compare)兩個操作。在查找操作中,根據選取標準在指定範圍內選擇項目,這個選取標準通常稱作查找過濾器(Search filter),並且可以規定一組需要返回的屬性。另外,還可以規定查找結果的大小和客戶端等待結果的時間。比較操作主要是判斷指定項目是否包含指定屬性(包括類型和值)。
更新(Update)
LDAP在信息更新方面定義了新增(Add)、刪除(Delete)、修改(Modify)和修改RDN(Modify RDN)等四個操作。新增操作主要是在LDAP目錄中插入一個新的項目。刪除操作主要是從LDAP目錄中刪除已有項目。修改操作主要是修改已有項目的屬性,具體地說,可以增加、刪除、修改屬性或屬性值。修改RDN操作主要是修改項目的名字。
身份驗證(Authentication)
LDAP在身份驗證方面定義了連接(Bind)、斷接(Unbind)和作廢(Abandon)等三個操作。連接操作主要是客戶端向服務器提供身份信息,包括DN和口令,以便於服務器驗證客戶端的身份,身份驗證成功即建立客戶端與服務器之間的會話(session)。斷接操作主要是結束客戶端與服務器的會話。作廢操作主要是中止正在執行的操作。
       
        安全模型
如何控制從網絡上來的各種訪問請求,防止非授權的訪問發生?這對於一個系統而言,也是十分重要的,因爲許多的用戶信息(如密碼、費用)以及許多系統的配置數據等都屬於敏感信息,它們不希望被隨便一個普通的使用者訪問,而只允許管理員擁有查詢和修改的權限。LDAP的安全模型是以客戶端的身份信息爲基礎的。客戶端的身份信息通過連接操作提供給服務器,服務器根據身份信息對客戶端提出的訪問請求進行控制。在LDAP中存在一個被稱爲訪問控制列表(Access Control List,以下簡稱ACL)的文件,控制各類訪問請求具有的權限。ACL文件中的控制方式具有極大的彈性:即可以在大範圍上控制某一類資源可以被某類甚至某個用戶訪問,還可以具體到資源類中的任何一個屬性。其授權的種類有讀、搜索、比較、寫這幾種,可以單獨,也可以組合使用。一般的格式是
access to “cn=*,ou=nudt,o=cs,c=cn”
by    “cn=tom,ou=nudt,o=cs,c=cn”   write
上面的控制設置就賦予了Tom對NUDT部門下的所有資源信息寫的權利,當然也就有了讀等這些權利了。詳細的定製和完善ACL文件,可以使目錄服務系統提供較好的安全性。此外,開發者還可以根據安全程度的需要,在LDAP中集成其它的安全工具,如KERBOUS, SSL等應用廣泛的安全技術,適用不同層次用戶的需要。

四、 LDAP如何工作以及如何開發LDAP的應用
LDAP是以服務器—客戶端方式工作的,目錄服務將數據庫軟件的邏輯結構分爲前端(客戶端)和後端(服務端和倉庫)(圖1)                                            


       客戶端是直接面對一般開發者和用戶的;服務端是用於接收和解釋客戶請求,然後以客戶的身份完成請求,並將完成結果返回給用戶;倉庫則是真正存儲信息的地方。在LDAP中,服務端和倉庫之間的連接採用了ODBC機制,所以可以使用任何支持和具有ODBC驅動程序的數據庫軟件,簡單的可以是Linux系統中自帶的GDBM或Alpha中的NDBM等數據庫管理系統;也可以選用在功能和性能上更優越的Oracle和Sybase等系統,這樣,可以提高系統的可移植性。
       現在已經有了許多基於LDAP協議開發出的資源管理系統和工具,如Openldap、NDS(Novell Directory Service)和ADS(Active Directory Service)等。它們已經逐漸的被使用在了各個需要目錄服務的領域,並且應用的趨勢在增強。
      Openldap是Michigan大學發佈的免費軟件,實現了LDAP v2的功能,並部分支持LDAP v3。它提供原代碼,可以在大多數的Unix和Linux系統中安裝。開發者能夠直接利用它所附帶的一些SHELL工具開發簡單的應用,這些SHELL包括了查詢(ldapsearch)、修改(ldapmodify)、刪除(ldapdelete)、增加(ldapadd)等,關於他們的使用方法可以參照幫助文件;也可以調用它提供的程序接口(API)來開發應用,接口包括了查詢(ldap_search)、修改(ldap_modify)、增加(ldap_add)、刪除(ldap_delete)等。從模版的定製到資源信息的組織和輸入都可以按照用戶的要求進行,開發出滿足你要求的應用軟件。
我們以openldap1.2.7爲例,進一步說明LDAP的工作方式。也就是如何使用openldap1.2.7來建立一個基於LDAP應用開發。Openldap1.2.7的後臺數據庫選用gdbm 1.8.0,Openldap實現了與gdbm的接口ldbm。SLAPD是Openldap實現的獨立的LDAP服務的守護進程,SLURPD是Openldap實現的獨立的LDAP更新和複製的守護進程。gdbm 是GNU發佈的免費dbm,使用哈希排序的數據庫例程集,與標準的UNIX下的dbm例程一樣工作。gdbm有比Berkeley dbm更快的快速排序,並且它是可重入的。
進行開發前,先要安裝gdbm和openldap。
得到gdbm1.8.0.tar,tar xvf gdbm1.8.0.tar
cd ./gdbm
./configure
make
make install
然後安裝openldap:
tar xvf openldap.tar
cd ./ldap
./configure - - with-ldbm-api=gdbm,使ldap服務進程在後端使用gdbm數據庫
make depend
make
make install
        接下來,進行基於LDAP協議的應用開發,大致分爲四個步驟,這四個步驟同時也分別對應了建立協議中四種基本模型的過程:信息模型、命名模型、功能模型和安全模型。
       首先是建立信息模型,既計劃需要管理的資源範圍,在LDAP中所建立的信息以“實體”(entry)爲單位,數據庫的框架被稱爲“模版”(schema),每個實體的屬性範圍都會在模版中說明。模版的內容可以根據你的需要隨意定製,可以將具有類似屬性範圍的信息歸爲一類,對於一類實體的說明採用了基於面向對象的機制,將模版中的每一個信息框架稱爲一個類“class”,而可以用這個類定義出你需要的事例,也就是一個個信息實體。
例如在模版文件中寫入這樣內容:
                        objectclass  person
{
requires
account,
userpassword
allows
sex,
……
}
        其中requires所包含的屬性是每一個登記的用戶都必須填寫的屬性範圍,而allows所包含的則是可有可無的內容,這也給信息的存儲控制增添了許多靈活性;其中,象系統管理員這種資源可以與一般用戶合併,只是需要在屬性中加入“類型”這樣的屬性用以區分是用戶還是,爲了安全,也可以將管理員單獨設置爲一類資源,在他的屬性範圍中包括帳號名、密碼、管轄的範圍(機器等設備的標示)、和聯繫方式等。對於其它的資源則根據實際情況分別設計,最後生成一個完整的模版文件。在openldap中,模版文件包括編輯yourname.oc.conf(定義信息對象類的文件)和yourname.at.conf(定義對象類中屬性的文件)。
        對照上面的信息模型所建立的信息庫還僅僅是一個個零散的資源記錄,爲了表現出它們之間的邏輯聯繫,需要完成LDAP中的命名模型。在平面式數據庫中定位信息記錄是通過每一條記錄前面的標號或通過某些域的關鍵字匹配來完成的,實現過程大多是通過輪詢,這在提高處理性能上就造成了許多障礙。LDAP中採用了更加合理的樹形存儲方式,將資源信息記錄分別放置在樹的根到葉的位置上,這種方式總是從不同的方面表現出了信息記錄之間的某種從屬的邏輯關係。
    對於每一個信息實體的定位使用全球唯一的命名方式既“可區分的名字”(DN:Distinguished Name),信息間的邏輯關係同時從DN中得到體現。可以參照Internet中的域名來理解DN的表示方法,如果你將所管理的信息按照地域進行分類,那麼DN中就回包含你的分類標準,如從國家,到地區,在具體到某個部門中的人或者機器等等,格式是“cn=  ,ou=  ,o=  ,c=  ”。(其中的cn、ou、o、c都是一些標示關鍵字,分別表示用戶名字、部門、地區和國家)這樣當用戶需要尋找某人的一些信息(如電話號碼、Email地址等),如果知道他的工作地址,那麼可以查找這個單位中所有符合條件的人員信息,如果查找的條件較具體,那麼可以直接找到這個人的信息實體,即使是給的查找條件比較模糊,也可以找出單位中所有符合條件的人員信息,然後由用戶從中挑選出需要的,信息的邏輯結構見(圖2)
  cn            中國
 
  o             長沙              上海     北京
 
  ou           國防科大      市政府
 
 cn           張三               李四
        當然,分類方式完全可以按照你的需要進行選擇,將所有的信息組織在數據庫中。建立了信息模版之後,就可以開始生成數據庫本身了。添加數據庫信息可以是先寫一個LDIF(Ldap Data Information Format)格式的文檔,(每個ldif文件對應一個數據庫,在LDAP中可以有多個數據庫,)這種格式是與模版是對應的,將一個個信息實體羅列在文件中,然後使用SHELL工具“ldif2ldbm”將其轉換爲當前使用的數據庫軟件的格式,並且在啓動服務端時告訴這些數據庫文件的存儲路徑;
         如何真正的訪問LDAP信息庫中的記錄則是在其功能模型中定義的內容,在應用開發中即開發一個LDAP的客戶端和該客戶端如何訪問LDAP服務器。Openldap提供的僅僅是一系列的shell命令和API,我們要依靠這些底層調用來建立一個完整的用戶訪問和顯示環境。如果不進行這方面的開發,可以使用普通的瀏覽器或者直接通過shell命令來操作,不過這種操作方式需要對LDAP的環境,配置情況,存儲內容都有相當詳細的瞭解,還要記住LDAP中複雜而又繁瑣命令格式。普通用戶根本不可能掌握。
         一個完整的訪問過程包括四個步驟:初始化、綁定服務器、訪問資源信息和斷開連接。其中初始化是分配一個操作句柄;綁定服務器是向服務端提供自己的身份標示(含用戶名和密碼等);訪問資源信息則是提出自己的訪問請求(如查詢和更新,他們分別有對應的標準API),等待並獲取訪問結果;斷開連接是在所有的訪問工作完成之後斷開與服務端的連接,釋放佔用的資源。LDAP是簡化了X.500中的許多操作,它在訪問資源的方式中主要提供與“讀”和“寫”相關的操作手段。與“讀”相關的有查找(search)和比較(compare),在查找時可以通過設置不同的“過濾器”(filter)達到獲得自己需要的結果,過濾器中的內容可以涉及到任何相關屬性的名稱及取值範圍等,並且支持與、或、非等關係表達式;“比較”則是將特定記錄中某屬性的值取出與自己的設定進行關係比較。與“寫”相關的操作有增加、刪除、修改和更名。增加是在信息庫中增加新的信息記錄,當然不能有相同唯一標示的記錄存在;刪除是將被認定爲無用的信息記錄從庫中刪除;修改是對於庫中資源信息的某些屬性值進行修改;更名則是更替唯一標示中最後一部分的內容,往往使用在僅僅這個資源的名稱有了改變的情況下。
        如何防止資源信息的非授權訪問和處理數據備份以及恢復是在安全模型中解決的問題。我們在下一章進行詳細說明。
在處理好以上四個方面後 ,我們就可以啓動LDAP服務了,在openldap中,啓動服務器端的SLAPD(LDAP服務器進程),就可以響應用戶的訪問了。
 LDAP中的訪問控制
        LDAP通過安全控制列表ACL(Access Control List)可以對信息庫中的所有資源進行訪問控制,甚至可以具體到一個資源記錄中的某個屬性。在openldap中,是在slapd.conf中定義的。Slapd.conf是LDAP最主要的配置文件,它說明了LDAP中使用的模板文件、日誌文件、數據庫位置、系統管理員帳號、系統管理員口令和各種安全機制等,其中主要是定義用戶訪問權限和建立LDAP的主從和主備關係。
對於用戶訪問權限,舉例說明,我們可以將用戶信件信息只授權給收件人,那麼當該用戶在綁定服務器並提供正確的帳號名和密碼之後可以訪問所有寄給他的信件,而其他用戶試圖超越自身的權限,獲取其他用戶的信件信息時會被立即拒絕。可以這樣來描述權限的設置:
access to dn=”.*, User=Tom, o=XY, c=A”   by  dn=”User=Tom, o=XY, c=A”。
通過這條限制就將信件的訪問權限完全的賦給了信件的收取者。同樣,設備的訪問權限是授予了相應的設備管理員,而用戶這類資源則只能由系統管理員來控制。
對於用戶密碼這個屬性,可以這樣定義。
access to dn=".*,grp=general,ou=nudt,o=cs,c=cn" attr=userpassword
        by self                                       write
        by *                                         none

在slapd.conf中還可以定義referral配置,它的值應是另一個LDAP服務器或多個LDAP服務器的 URL,當用戶進行查詢時,沒在本地找到,就會去referral指定的其它LDAP服務器進行查找。openldap直接在服務器上實現了referral,而是返回給客戶referral地址,如圖1。①向server發出請求;需要指向其它server時,②返回referral地址;③客戶需重新向referral地址發出請求;④返回結果。爲了網格用戶的方便,需要屏蔽掉信息所在地址即referral,實現Chaining,即在服務器上自動支持referral,如圖2。①向server發出請求;需要指向其它server時,②自動指向referral地址;③自動向referral地址發出請求;④返回結果。

圖1
圖2
有了referral的功能,我們就可以把網絡內的LDAP服務器都建立這樣一種聯繫,使得用戶不必記住每個LDAP服務器都存儲些什麼內容以及它們的地址,只要記住離自己最近的LDAP服務器就可以了,如果用戶要操作的內容不在該服務器上,會自動地尋找直到找到正確的服務器,得到正確的內容爲止。
六、LDAP的主從備份功能
       安全機制中一個重要的內容就是備份和恢復,在LDAP中提供了主從備份服務器的機制,它方便和經濟地實現了備份和恢復的功能。下面介紹主從服務器的配置方法和運行過程。
主服務器爲了表明當前所運行服務進程的身份,必須在其配置文件(slapd.conf)中註明,並且還標明所有從(備份)服務進程的地址(IP或域名);從(備份)服務進程中需要標明它所面對的主服務進程的地址(IP或域名)。
主服務進程配置文件:
# Just show the necessary portion for replicate, ‘389’ is the port number
replica          host=172.26.20.98:389
               binddn=“adm=replica99,ou=nudt,o=cs,c=cn”
               bindmethod=simple      credentials=passwd
# The second slave server
replica          host=172.26.20.97:389
               。
               。
               。
(注):
binddn是主server向該從server發出操作命令時使用的身份。
    Bindmethod是標明使用的身份驗證的方法,可以是“用戶名+密碼”也可以是kerberos方法。
    Credentials分別爲密碼和認證書

從server配置文件:
# Just show the necessary portion for replicate,98 is the IP of the master server
referral          ldap://172.26.20.98
updatedn        “adm=replica99,ou=nudt,o=cs,c=cn”
# Give updatedn the right to write the Directory Tree
access  to “.*,o=cs,c=cn”
       by “cn=replica99,ou=nudt,o=cs,c=cn”  write

(注):
referral:是當在本地無法提供信息數據時,提供下一個服務器的地址,可以通過再一次查詢獲取數據。
在備份服務進程的配置文件中,不必使用referral,因爲它不真正的提供索引服務。
啓動順序
將主服務進程上的數據庫文件拷貝給各個從(備份)服務進程,達到最初的一致。
啓動主服務進程上的slapd進程
啓動從服務進程上的slapd進程
啓動主服務進程上的slurpd進程
slurpd是可以定時把主服務器上的修改進行備份,依據是由寫操作產生的日誌,如果由於網絡的原因導致了備份失敗,slurpd會自動進行重試,直到備份成功。
日誌
設置在主服務進程r服務器上,需要修改配置文件:
# For log of the LDAP server ,you can set the file name you like
replogfile         /home/ldap/nhpce.replog
實際此文件只是給slurpd進程使用,作爲一個廣播操作命令的中轉站,真正的日誌文件在/var/tmp下,文件名稱爲slurpd.replog。
一個主服務器的從服務器個數是沒有限制的,通過以上設置,可以產生了一個由主服務器進程和一個或幾個從服務進程組成的服務機羣,主守護進程作爲整個服務機羣的核心,其始終維持系統信息的一致性,因爲除了查詢以外的請求都首先由它操作自己的信息庫,然後再將該操作廣播給各個從服務器,同步更新各自的信息庫。而對於查詢請求,由於不會造成信息內容的改變,所以可以由各個從服務器完成,這樣的方式特別適用於象目錄服務這樣查詢請求遠遠多於修改等請求的應用。

下面是一個主服務器和多個從服務器組成的服務機羣處理訪問的步驟:
客戶向服務機羣發出請求(客戶使用的可能是IP或域名),此請求可以被一個前端的域名服務器轉給一個從服務進程。
從服務進程將除了搜索以外的請求發向主服務進程。
主服務進程根據請求成功完成相應操作之後,將操作廣播給所有的從服務進程。
從服務進程r此時完成主服務進程要求的操作。
從服務進程將操作結果返回給客戶。

圖3
這樣的服務器機羣,每個從服務器都有一個主服務器信息的完全備份,當出現主服務器因爲各種原因無法提供服務或無法恢復其信息數據時,則可將備份服務器上的數據信息轉移到主服務器上,繼續提供服務;或者直接將備份服務器的配置文件進行修改,從新啓動服務進程,將其身份變爲主服務進程。而且這些處理都十分方便。如果在平時就做好準備,那麼可以在極短的時間內恢復服務。
實際上,不但一個主服務器可以對應多個從服務器,而且一個從服務器可以從多個主服務器上備份信息,形成一個主備的服務機羣。
        採用主備關係服務機羣的系統邏輯視圖如下:                                        

 

圖4
        在上圖中,設置了兩個主服務信息庫,它們平時可以是各不相干的角色,管理各自的域內事務,而後面的兩個備份信息庫則爲了提高使用效率,同時作爲了兩個主服務信息庫的備份庫。對於上面兩種方式的實現,其配置文件的寫法大體相同。
不僅如此,多個LDAP服務器之間可以互爲主從關係,即每個服務器都把自己管理部分定義爲主服務信息庫,而其他所有的LDAP服務器把與之相應的信息庫定義爲該主信息庫的從信息庫。這樣,實際上每個LDAP服務器的地位是平等的,存儲的信息則包括了全局的信息。每個單位只有對本單位的LDAP服務器上本單位的信息具有寫和修改的權限。而修改的同時各個單位的LDAP服務器上的相應的信息就都修改了,每個單位的用戶都可以在本地的LDAP上訪問全局的信息,而且基本上能保證是最新的信息,這種方式有響應時間短,資源利用率高,抗毀能力強的優點。充分地發揮了分佈式系統特點。缺點是每一次寫操作都要廣播到每個LDAP服務器,增加了網絡的負擔。但因爲目錄服務的特點是讀操作遠遠大於寫操作,實際上對網絡負載影響不大。具體邏輯關係見下圖。
圖5
在配置上需要在每個LDAP服務器上建立相應的slapd.conf文件,在配置文件中聲明自那部分是主服務器並定義每個從服務器的位置和權限。自己作爲從服務器從那些LDAP服務器中以什麼身份取得那些信息。下面舉例說明。在國家高性能計算環境中基於LDAP的目錄服務採用了這種組織形式,它的LDAP的配置文件如下,本地服務器是國防科大。
下面是slapd.conf簡化了的寫法。

#NHPCE Slapd Configure File
include                /etc/openldap/slapd.oc.conf
include                /etc/openldap/slapd.at.conf
schemacheck        on
pidfile                /var/run/slapd.pid
argsfile        /var/run/slapd.args
access to attr=userpassword
        by self                                                read
        by dn="cn=Manager_nudt,grp=GENERAL,ou=NUDT,o=CS,c=CN"        read
        by *                                                none       

#ldbm definition for the NUDT master database
database        ldbm
suffix                "ou=NUDT,o=CS,c=CN"
directory        /etc/openldap/database/nudt_db
rootdn                "cn=Manager_nudt,grp=GENERAL,ou=NUDT,o=CS,c=CN"
replogfile        /etc/openldap/database/nudt_db/slapd.replog
replica                host=159.226.39.173:389
                binddn="cn=Replicator_nudt,grp=GENERAL,ou=NUDT,o=CS,c=CN"
                bindmethod=simple
                credentials=secret
replica                host=159.226.39.144:389
                binddn="cn=Replicator_nudt,grp=GENERAL,ou=NUDT,o=CS,c=CN"
                bindmethod=simple
                credentials=secret
index                default                none
defaultaccess                                                read
access to dn=".*,grp=general,ou=nudt,o=cs,c=cn"        attr=userpassword
        by self                                                write
        by *                                                none
access to dn=".*,grp=general,ou=nudt,o=cs,c=cn"        attrs=email,telephone,description
        by self                                                write
        by *                                                read       
access to dn="cn=Manager_nudt,grp=GENERAL,ou=NUDT,o=CS,c=CN"
        by *                                                none
access to dn="cn=Replicator_nudt,grp=GENERAL,ou=NUDT,o=CS,c=CN"
        by self                                                write
        by *                                                none
lastmod                                                        on

#ldbm definition for the NUDT slave database
database        ldbm
suffix                "ou=CAS,o=BJ,c=CN"
directory        /etc/openldap/database/cas_db
rootdn                "cn=Replicator_cas,grp=GENERAL,ou=CAS,o=BJ,c=CN"
updatedn        "cn=Replicator_cas,grp=GENERAL,ou=CAS,o=BJ,c=CN"
index                default                none
defaultaccess                                                read       
 
#ldbm definition for the JNICT slave database
database        ldbm
suffix                "ou=JNICT,o=WX,c=CN"
directory        /etc/openldap/database/jnict_db
rootdn                "cn=Replicator_jnict,grp=GENERAL,ou=JNICT,o=WX,c=CN"
updatedn        "cn=Replicator_jnict,grp=GENERAL,ou=JNICT,o=WX,c=CN"
index                default                none
defaultaccess                                                read       
七、 LDAP的應用前景
目錄服務系統將在越來越多的網絡應用系統中使用,特別是一些大型的網絡應用(一些大型網站也會需要)當中,這也是各個大公司爲什麼要將此作爲網絡基礎軟件來看待。
集中單點管理、分佈容錯和單一登入點(包括合理的認證服務)的功能是具有巨大的誘人優勢。
使用LDAP可以開發大的應用軟件項目,比如可以應用在C4ISR中,當然會還有其它應用。
小的項目也會需要目錄服務的的支持,目錄服務是一個在邏輯上集中存儲資源信息的特殊數據庫,許多數據庫開發都可以用LDAP替代,而且LDAP更易於開發,更靈活。
目錄服務系統將從現行的V2、V3繼續發展,具有目錄服務功能的網絡DEN(發佈、發現和獲取)即將出現,不經對網絡上的高層資源進行集中管理,而且對網絡基礎設備的集中管理,例如:具有目錄路由器。一句話:就是DEN將網絡服務和網絡設備的管理更好地繼承到普通管理技術中。

發佈了13 篇原創文章 · 獲贊 2 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章