LDAP 介紹(二)
原文:
查看原文 作者:
Michael Donnelly 翻譯:
Brimmer 校審:LDAPChina.com
LDAPChina序言:這篇文章是互聯(lián)網(wǎng)上最流行的一篇介紹LDAP基礎知識的文章,本文作者
Michael Donnelly是
LDAPMAN.org的站長(cháng)。由于本文譯文較長(cháng),我們將其分為兩部分,第一部分介紹LDAP概論,第二部分介紹LDAP基礎知識。感謝網(wǎng)友
Brimmer翻譯此文。
接上文
LDAP目錄樹(shù)的結構單條LDAP記錄定制目錄的對象類(lèi)一個(gè)LDAP單個(gè)條目的例子LDAP復制安全和訪(fǎng)問(wèn)控制LDAP目錄樹(shù)的結構
LDAP目錄以樹(shù)狀的層次結構來(lái)存儲數據。如果你對自頂向下的DNS樹(shù)或UNIX文件的目錄樹(shù)比較熟悉,也就很容易掌握LDAP目錄樹(shù)這個(gè)概念了。就象DNS的主機名那樣,LDAP目錄記錄的分辨名(Distinguished Name,簡(jiǎn)稱(chēng)DN)是用來(lái)讀取單條記錄,以及回溯到樹(shù)的頂部。后面會(huì )做詳細地介紹。
為什么要用層次結構來(lái)組織數據呢?原因是多方面的。下面是可能遇到的一些情況:
如果你想把所有的美國客戶(hù)的聯(lián)系信息都“推”到位于到西雅圖辦公室(負責營(yíng)銷(xiāo))的LDAP服務(wù)器上, 但是你不想把公司的資產(chǎn)管理信息“推”到那里。 你可能想根據目錄樹(shù)的結構給予不同的員工組不同的權限。在下面的例子里,資產(chǎn)管理組對“asset-mgmt”部分有完全的訪(fǎng)問(wèn)權限,但是不能訪(fǎng)問(wèn)其它地方。 把LDAP存儲和復制功能結合起來(lái),可以定制目錄樹(shù)的結構以降低對WAN帶寬的要求。位于西雅圖的營(yíng)銷(xiāo)辦公室需要每分鐘更新的美國銷(xiāo)售狀況的信息,但是歐洲的銷(xiāo)售情況就只要每小時(shí)更新一次就行了。
刨根問(wèn)底:基準DN
LDAP目錄樹(shù)的最頂部就是根,也就是所謂的“基準DN”?;鶞蔇N通常使用下面列出的三種格式之一。假定我在名為FooBar的電子商務(wù)公司工作,這家公司在Internet上的名字是foobar.com。
o="FooBar, Inc.", c=US
(以X.500格式表示的基準DN)
在這個(gè)例子中,o=FooBar, Inc. 表示組織名,在這里就是公司名的同義詞。c=US 表示公司的總部在美國。以前,一般都用這種方式來(lái)表示基準DN。但是事物總是在不斷變化的,現在所有的公司都已經(jīng)(或計劃)上Internet上。隨著(zhù)Internet的全球化,在基準DN中使用國家代碼很容易讓人產(chǎn)生混淆?,F在,X.500格式發(fā)展成下面列出的兩種格式。
o=foobar.com
(用公司的Internet地址表示的基準DN)
這種格式很直觀(guān),用公司的域名作為基準DN。這也是現在最常用的格式。
dc=foobar, dc=com
(用DNS域名的不同部分組成的基準DN)
就象上面那一種格式,這種格式也是以DNS域名為基礎的,但是上面那種格式不改變域名(也就更易讀),而這種格式把域名:foobar.com分成兩部分 dc=foobar, dc=com。在理論上,這種格式可能會(huì )更靈活一點(diǎn),但是對于最終用戶(hù)來(lái)說(shuō)也更難記憶一點(diǎn)??紤]一下foobar.com這個(gè)例子。當foobar.com和gizmo.com合并之后,可以簡(jiǎn)單的把“dc=com”當作基準DN。把新的記錄放到已經(jīng)存在的dc=gizmo, dc=com目錄下,這樣就簡(jiǎn)化了很多工作(當然,如果foobar.com和wocket.edu合并,這個(gè)方法就不能用了)。如果LDAP服務(wù)器是新安裝的,我建議你使用這種格式。再請注意一下,如果你打算使用活動(dòng)目錄(Actrive Directory),Microsoft已經(jīng)限制你必須使用這種格式。
更上一層樓:在目錄樹(shù)中怎么組織數據
在UNIX文件系統中,最頂層是根目錄(root)。在根目錄的下面有很多的文件和目錄。象上面介紹的那樣,LDAP目錄也是用同樣的方法組織起來(lái)的。
在根目錄下,要把數據從邏輯上區分開(kāi)。因為歷史上(X.500)的原因,大多數LDAP目錄用OU從邏輯上把數據分開(kāi)來(lái)。OU表示“Organization Unit”,在X.500協(xié)議中是用來(lái)表示公司內部的機構:銷(xiāo)售部、財務(wù)部,等等?,F在LDAP還保留ou=這樣的命名規則,但是擴展了分類(lèi)的范圍,可以分類(lèi)為:ou=people, ou=groups, ou=devices,等等。更低一級的OU有時(shí)用來(lái)做更細的歸類(lèi)。例如:LDAP目錄樹(shù)(不包括單個(gè)條目)可能會(huì )是這樣的:
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記錄
DN是LDAP條目的名字
在LDAP目錄中的所有條目項都有一個(gè)唯一的“Distinguished Name”,也就是DN。每一個(gè)LDAP條目的DN是由兩個(gè)部分組成的:相對DN(RDN)和條目在LDAP目錄中的位置。
RDN是DN中與目錄樹(shù)的結構無(wú)關(guān)的部分。在LDAP目錄中存儲的絕大多數條目都有一個(gè)名字,這個(gè)名字通常存在cn(Common Name)這個(gè)屬性里。因為幾乎所有的東西都有名字,所以絕大多數在LDAP中存儲的對象都用它們的cn值作為RDN的基礎。如果我把最喜歡的吃燕麥粥食譜存為一個(gè)記錄,我就會(huì )用cn=Oatmeal Deluxe作為條目的RDN。
我的LDAP目錄的基準DN是dc=foobar,dc=com 我把自己的食譜作為L(cháng)DAP的記錄項存在ou=recipes 我的LDAP記錄項的RDN設為cn=Oatmeal Deluxe
上面這些構成了燕麥粥食譜的LDAP記錄的完整DN。記住,DN的讀法和DNS主機名類(lèi)似。下面就是完整的DN:
cn=Oatmeal Deluxe,ou=recipes,dc=foobar,dc=com
舉一個(gè)實(shí)際的例子來(lái)說(shuō)明DN
現在為公司的員工設置一個(gè)DN??梢杂没赾n或uid(User ID),作為典型的用戶(hù)賬號。例如,FooBar的員工Fran Smith(登錄名:fsmith)的DN可以為下面兩種格式:
uid=fsmith,ou=employees,dc=foobar,dc=com
(基于登錄名)
LDAP(以及X.500)用uid表示“User ID”,不要把它和UNIX的uid號混淆了。大多數公司都會(huì )給每一個(gè)員工唯一的登錄名,因此用這個(gè)辦法可以很好地保存員工的信息。你不用擔心以后還會(huì )有一個(gè)叫Fran Smith的加入公司,如果Fran改變了她的名字(結婚?離婚?或宗教原因?),也用不著(zhù)改變LDAP條目的DN。
cn=Fran Smith,ou=employees,dc=foobar,dc=com
(基于姓名)
可以看到這種格式使用了Common Name(CN)??梢园袰ommon Name當成一個(gè)人的全名。這種格式有一個(gè)很明顯的缺點(diǎn)就是:如果名字改變了,LDAP的記錄就要從一個(gè)DN轉移到另一個(gè)DN。如上所述,我們應該盡可能地避免改變一個(gè)記錄項的DN。
定制目錄的對象類(lèi)
你可以用LDAP存儲各種類(lèi)型的數據對象,只要這些對象可以用屬性來(lái)表示,下面這些是可以在LDAP中存儲的一些信息:
員工信息:?jiǎn)T工的姓名、登錄名、口令、員工號、他的經(jīng)理的登錄名,郵件服務(wù)器,等等。 物品跟蹤信息:計算機名、IP地址、標簽、型號、所在位置,等等。 客戶(hù)聯(lián)系列表:客戶(hù)的公司名、主要聯(lián)系人的電話(huà)、傳真和電子郵件,等等。 會(huì )議廳信息:會(huì )議廳的名字、位置、可以坐多少人、電話(huà)號碼、是否有投影機。 食譜信息:菜的名字、配料、烹調方法以及準備方法。
因為L(cháng)DAP目錄可以定制成存儲任何文本或二進(jìn)制數據,到底存什么要由你自己決定。LDAP目錄使用對象類(lèi)(object classes)的概念來(lái)定義運行哪一類(lèi)的對象使用什么屬性。在幾乎所有的LDAP服務(wù)器中,你都要根據自己的需要擴展基本的LDAP目錄的功能,創(chuàng )建新的對象類(lèi)或者擴展現存的對象類(lèi)。
LDAP目錄以一系列“屬性對”的形式來(lái)存儲記錄項,每一個(gè)記錄項包括屬性類(lèi)型和屬性值(這與關(guān)系型數據庫用行和列來(lái)存取數據有根本的不同)。下面是我保存在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
請注意上面每一種配料都作為屬性類(lèi)型recipeIngredient值。LDAP目錄被設計成象上面那樣為一個(gè)屬性保存多個(gè)值的,而不是在每一個(gè)屬性的后面用逗號把一系列值分開(kāi)。
因為用這樣的方式存儲數據,所以數據庫就有很大的靈活性,不必為加入一些新的數據就重新創(chuàng )建表和索引。更重要的是,LDAP目錄不必花費內存或硬盤(pán)空間處理“空”域,也就是說(shuō),實(shí)際上不使用可選擇的域也不會(huì )花費你任何資源。
一個(gè)LDAP單個(gè)條目的例子
讓我們看看下面這個(gè)例子。我們用Foobar, Inc.的員工Fran Smith的LDAP記錄。該條目的格式是LDIF,用來(lái)導入和導出LDAP目錄的條目。
dn: uid=fsmith, ou=employees, dc=foobar, dc=com
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: foobarPerson
uid: fsmith
givenname: Fran
sn: Smith
cn: Fran Smith
cn: Frances Smith
telephonenumber: 510-555-1234
roomnumber: 122G
o: Foobar, Inc.
mailRoutingAddress: fsmith@foobar.com
mailhost: mail.foobar.com
userpassword: {crypt}3x1231v76T89N
uidnumber: 1234
gidnumber: 1200
homedirectory: /home/fsmith
loginshell: /usr/local/bin/bash
屬性的值在保存的時(shí)候是保留大小寫(xiě)的,但是在默認情況下搜索的時(shí)候是不區分大小寫(xiě)的。某些特殊的屬性(例如,password)在搜索的時(shí)候需要區分大小寫(xiě)。
讓我們一點(diǎn)兒一點(diǎn)兒地分析上面的記錄項。
dn: uid=fsmith, ou=employees, dc=foobar, dc=com
這是Fran的LDAP條目的完整DN,包括在目錄樹(shù)中的完整路徑。LDAP(和X.500)使用uid來(lái)表示“User ID”,不要把它和UNIX的uid號混淆了。
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: foobarPerson
可以為任何一個(gè)對象根據需要分配多個(gè)對象類(lèi)。person對象類(lèi)要求cn(common name)和sn(surname)這兩個(gè)域不能為空。person對象類(lèi)允許有其它的可選域,包括givenname、telephonenumber等等。對象類(lèi)organizational Person給person加入更多的可選域,inetOrgPerson又加入更多的可選域(包括電子郵件信息)。最后,foobarPerson是為Foobar定制的對象類(lèi),該對象類(lèi)加入了所有需要的定制屬性。
uid: fsmith
givenname: Fran
sn: Smith
cn: Fran Smith
cn: Frances Smith
telephonenumber: 510-555-1234
roomnumber: 122G
o: Foobar, Inc.
以前說(shuō)過(guò)了,uid表示User ID。當看到uid的時(shí)候,就在腦袋里想一想“login”。
請注意CN有多個(gè)值。就象上面介紹的,LDAP允許某些屬性有多個(gè)值。為什么允許有多個(gè)值呢?假定你在用公司的LDAP服務(wù)器查找Fran的電話(huà)號碼。你可能只知道她的名字叫Fran,但是對人力資源處的人來(lái)說(shuō)她的正式名字叫做Frances。因為保存了她的兩個(gè)名字,所以用任何一個(gè)名字檢索都可以找到Fran的電話(huà)號碼、電子郵件和辦公房間號,等等。
mailRoutingAddress: fsmith@foobar.com
mailhost: mail.foobar.com
就象現在大多數的公司都上網(wǎng)了,Foobar使用Sendmail發(fā)送郵件和處理外部郵件路由信息。Foobar把所有用戶(hù)的郵件信息都存在LDAP中。最新版本的Sendmail支持這項功能。
userpassword: {crypt}3x1231v76T89N
uidnumber: 1234
gidnumber: 1200
gecos: Frances Smith
homedirectory: /home/fsmith
loginshell: /usr/local/bin/bash
注意,Foobar的系統管理員把所有用戶(hù)的口令映射信息也都存在LDAP中。FoobarPerson類(lèi)型的對象具有這種能力。再注意一下,用戶(hù)口令是用UNIX的口令加密格式存儲的。UNIX的uid在這里為uidnumber。提醒你一下,關(guān)于如何在LDAP中保存NIS信息,有完整的一份RFC。在以后的文章中我會(huì )談一談NIS的集成。
LDAP復制
LDAP服務(wù)器可以使用基于“推”或者“拉”的技術(shù),用簡(jiǎn)單或基于安全證書(shū)的安全驗證,復制一部分或者所有的數據。
例如,Foobar有一個(gè)“公用的”LDAP服務(wù)器,地址為ldap.foobar.com,端口為389。Netscape Communicator的電子郵件查詢(xún)功能、UNIX的“ph”命令要用到這個(gè)服務(wù)器,用戶(hù)也可以在任何地方查詢(xún)這個(gè)服務(wù)器上的員工和客戶(hù)聯(lián)系信息。公司的主LDAP服務(wù)器運行在相同的計算機上,不過(guò)端口號是1389。
你可能即不想讓員工查詢(xún)資產(chǎn)管理或食譜的信息,又不想讓信息技術(shù)人員看到整個(gè)公司的LDAP目錄。為了解決這個(gè)問(wèn)題,Foobar有選擇地把子目錄樹(shù)從主LDAP服務(wù)器復制到“公用”LDAP服務(wù)器上,不復制需要隱藏的信息。為了保持數據始終是最新的,主目錄服務(wù)器被設置成即時(shí)“推”同步。這些種方法主要是為了方便,而不是安全,因為如果有權限的用戶(hù)想查詢(xún)所有的數據,可以用另一個(gè)LDAP端口。
假定Foobar需要通過(guò)從奧克蘭到歐洲的低帶寬連接,用LDAP來(lái)管理客戶(hù)聯(lián)系信息。這時(shí),他們可以建立從ldap.foobar.com:1389到munich-ldap.foobar.com:389的復制,象下面這樣:
periodic pull: ou=asia,ou=customers,o=sendmail.com
periodic pull: ou=us,ou=customers,o=sendmail.com
immediate push: ou=europe,ou=customers,o=sendmail.com
“拉”連接每15分鐘同步一次,在上面假定的情況下足夠了。“推”連接保證任何歐洲的聯(lián)系信息發(fā)生變化時(shí)就立即被“推”到Munich。
用上面的復制模式,用戶(hù)為了訪(fǎng)問(wèn)數據需要連接到哪一臺服務(wù)器呢?在Munich的用戶(hù)可以簡(jiǎn)單地連接到本地服務(wù)器。如果他們改變了數據,本地的LDAP服務(wù)器就會(huì )把這些變化傳到主LDAP服務(wù)器。然后,主LDAP服務(wù)器把這些變化“推”回本地的“公用”LDAP服務(wù)器保持數據的同步。這對本地的用戶(hù)有很大的好處,因為所有的查詢(xún)(大多數是讀)都在本地的服務(wù)器上進(jìn)行,速度非???。當需要改變信息的時(shí)候,最終用戶(hù)不需要重新配置客戶(hù)端的軟件,因為L(cháng)DAP目錄服務(wù)器為他們完成了所有的數據交換工作。
安全和訪(fǎng)問(wèn)控制
LDAP提供了訪(fǎng)問(wèn)控制實(shí)例(access control instances)或者ACI的復雜層次。因這些訪(fǎng)問(wèn)可以在服務(wù)器端控制,這比用客戶(hù)端的軟件保證數據的安全可安全得多。
用LDAP的ACI,可以完成:
給予用戶(hù)改變他們自己的電話(huà)號碼和家庭地址的權限,但是限制他們對其它數據(如,職務(wù)名稱(chēng),經(jīng)理的登錄名,等等)只有“只讀”權限。 給予“HR-admins”組中的所有人可以更改任何用戶(hù)的下列屬性域的值的權限:經(jīng)理、工作名稱(chēng)、員工號、部門(mén)名稱(chēng)和部門(mén)號。但是對其它域沒(méi)有寫(xiě)權限。 禁止任何人查詢(xún)LDAP服務(wù)器上的用戶(hù)口令,但是可以允許用戶(hù)改變他或她自己的口令。 給予經(jīng)理訪(fǎng)問(wèn)他們上級的家庭電話(huà)的只讀權限,但是禁止其他人有這個(gè)權限。 給予“host-admins”組中的任何人創(chuàng )建、刪除和編輯所有保存在LDAP服務(wù)器中所有與計算機主機有關(guān)的信息。 通過(guò)Web,允許“foobar-sales”組中的成員有選擇地給予或禁止他們自己讀取一部分客戶(hù)聯(lián)系數據的讀權限。這將允許他們把客戶(hù)聯(lián)系信息下載到本地的筆記本電腦或個(gè)人數字助理(PDA)上。(如果銷(xiāo)售人員的軟件都支持LDAP,這將非常有用) 通過(guò)Web,允許任何組的所有者刪除或添加他們擁有的組的成員。例如:可以允許銷(xiāo)售經(jīng)理給予或禁止銷(xiāo)售人員改變Web頁(yè)的權限。也可以允許郵件別名(mail aliase)的所有者不經(jīng)過(guò)IT技術(shù)人員就直接刪除或添加用戶(hù)。“公用”的郵件列表能夠允許用戶(hù)向郵件別名中添加或從郵件別名中刪除自己(但是只能是自己)。也可以對IP地址或主機名加以限制。例如,某些屬性域只允許IP地址以192.168.200.*開(kāi)頭的用戶(hù)有讀的權限,或者用戶(hù)反向查找DNS得到的主機名必須為*.foobar.com。
這不過(guò)是讓你了解一下可以對LDAP目錄進(jìn)行怎樣的訪(fǎng)問(wèn)控制,實(shí)際上真正實(shí)現起來(lái)需要做的工作比這多得多。在以后的文章中我會(huì )詳細地討論訪(fǎng)問(wèn)控制。