已經有很多關於LDAP的文獻,所以我不想在這裏再重複什麼,我不準備討論高級的LDAP概念、計劃以及第二版和第三版LDAP的區別等等。事實上,我對這類問題也所知不多。相反地,我將嘗試用簡單明瞭的語言解釋什麼是LDAP, 它能給我們帶來的好處以及我們如何使用它。
我不是一個LDAP專家。我只是一個LDAP的初學者。本文介紹的是我用LDAP做了些什麼以及如何做。我不會使你再像以前的我一樣感到迷惑。
問題:既然你是個LDAP初學者,爲什麼還要寫一篇關於LDAP的文章?
最近我在一個項目上需要一位同事的幫助。 這個項目的基礎就是LDAP。我的同事可以在perl、郵件服務器等等方面幫助我,但是他對LDAP一無所知,事實是每一次他想要深入學習LDAP, 反而會對LDAP越來越迷惑。因爲該項目的基礎是LDAP, 所以我給了這位同事半小時來學習LDAP,結果是一切反而變得清晰明瞭了。 原因很簡單, LDAP是在前端的,只需要集中一點點注意力或者一些生動的例子就可以了。
在本文中我也正想這樣做。
你可以在文中發現好多對學習LDAP有用的url。
LDAP是什麼?
LDAP是輕量目錄訪問協議(Lightweight Directory Access Protocol)的縮寫,其實是一種目錄服務,類似於我們在文件系統中所使用的目錄,類似於我們查詢電話號碼使用的電話號碼簿,類似於我們所使用諸如 NIS(Network Information Service)、DNS (Domain Name Service)等網絡目錄,也類似於你在花園中所看到的樹木。
LDAP是一種特殊的數據庫。但是LDAP和一般的數據庫不同,明白這一點是很重要的。 LDAP對查詢進行了優化,與寫性能相比LDAP的讀性能要優秀很多。
一般地,目錄服務提供什麼樣的服務呢?
通常是根據查詢的標準返回一定的信息。
實例
文件系統目錄
ls /etc
返回/etc目錄下所有的文件和子目錄。
ls /etc/p*
返回/etc下所有以p開頭的文件和子目錄。
find /usr/local/apache -name index.html
這將在"/usr/local/apache"目錄下搜索名爲index.html的文件/子目錄。
NIS目錄
ypcat passwd
這將從NIS數據庫返回用戶名、密碼、用戶id等信息。
ypmatch atif passwd
返回用戶atif的密碼。
DNS目錄
nslookup www.linuxfocus.org
返回www.linuxfocus.org的ip地址。
nslookup -type MX linuxfocus.org
返回主機名符合linuxfocus.org的MX記錄信息。
LDAP目錄
(我們將在下面詳細闡述)
ldapsearch uid=aghaffar
返回關於用戶aghaffar的所有公開信息。
這和find / -uid aghaffar unix命令很類似。
ldapsearch uid=aghaffar mail
返回用戶ughaffar的郵件信息
目錄基礎或根
在上面我們所提到的任何一種目錄服務中都有一個我們開始瀏覽或搜索的開始點。 這個開始點就是通常所謂的根。 這和一棵數的根也很類似。每棵都有一個根,以及很多的樹枝樹葉。
* 文件系統的根是 /
* NIS 的根是域名,比如 "linuxfocus.org"
* DNS 根是Internic(譯者注:Internet網絡信息中心, Internet的管理組織)
* LDAP同樣有一個可定義的根,比如 "o=linuxfocus.org" ,這裏o表示組織
每個根都可以衍生出好多枝葉(正如同你鄰居的花園中的樹木一樣), 對於文件系統來說,它的枝葉就是一個個文件及子目錄。每一個枝葉都有一些屬性。比如文件系統的枝葉(文件及子目錄)有以下的屬性:
* 名稱
* 修改時間
* 所有者
* 組(譯者注:所有者所在的組)
* 等等
下圖顯示了一個文件系統目錄。
屬性由unix命令ls -ld /usr得到。
下面是一個LDAP目錄的圖示:
我們將在下面討論這張圖。
區分名(DN,Distinguished Name)
和自然界中的樹不同,文件系統/LDAP/電話號碼簿目錄的每一片枝葉都至少有一個獨一無二的屬性,這一屬性可以幫助我們來區別這些枝葉。
在文件系統中, 這些獨一無二的屬性就是帶有完整路徑的文件名。比如/etc/passwd,該文件名在該路徑下是獨一無二的。當然我們可以有/usr/passwd, /opt/passwd,但是根據它們的完整路徑,它們仍然是唯一的。
類似於DNS系統的FQDN正式域名,FQDN也是唯一的。
在LDAP中,一個條目的區分名稱叫做“dn”或者叫做區分名。在一個目錄中這個名稱總是唯一的。比如,我的dn是"uid=aghaffar, ou=People, o=developer.ch"。不可能有相同的dn,但是我們可以有諸如"uid=aghaffar, ou=Administrators, o=developer.ch"的dn。這同上面文件系統中/etc/passwd 和 /usr/passwd的例子很類似。
我們有獨一無二的屬性,在"ou=Administrators, o=developer.ch" 中uid和在"ou=People, o=developer.ch"中的uid。這並不矛盾。
LDAP服務器
現在市場上有很多LDAP服務器,大多數都可以在linux上運行。本文將介紹openLDAP的使用。
我爲什麼選擇openLDAP? 爲什麼你應該選擇openLDAP?
* openLDAP是開放源碼的
openLDAP的官方網站是http://www.openldap.org。你可以下載其源代碼包自己編譯,或者看看你的linux發行版是否已經包含了該軟件包。如果已經包含了就可以安裝預先編譯好的版本從而少花費些力氣。
我已經成功地在SuSE6.x 和 RedHat6.x上測試過openLDAP。
構建LDAP目錄
下面我們將介紹設置一個LDAP服務器的步驟。
步驟:
* 下載並安裝openLDAP
* 配置 LDAP server
* 配置本地環境指向LDAP 安裝
* 初始化LDAP 數據庫
* 查詢 LDAP
* 添加/修改 LDAP 條目
下載並安裝openLDAP
正如前面所提到的,可以從www.openldap.com下載源代碼包並根據它的相關文檔進行安裝,或者安裝預先編譯好的包(包的安裝或如何編譯應用程序已經超出了本文討論的範疇)。
配置LDAP服務器
在我們的例子中,我將爲linuxfocus.org構建LDAP服務器。你可以用你喜歡的編輯器編輯slapd.conf和ldap.comf配置文件來更改名稱等參數以適應你的具體需求。
在我的服務器上配置文件在/etc/openldap目錄下,你的配置文件可能在/usr/local/etc/openldap或者別的地方,這要根據你的linux發行版本或者編譯openldap的具體情況而定。
######### /etc/openldap/slapd.conf ###################################
# 下面的部分是我的suse 6.4 linux 發行版本預先定義的
# 我們設置的部分在本文的第二和第三部分
include /etc/openldap/slapd.at.conf
include /etc/openldap/slapd.oc.conf
schemacheck off
pidfile /var/run/slapd.pid
argsfile /var/run/slapd.args
#######################################################################
# ldbm database definitions
#######################################################################
# 定義使用的數據庫類型。 缺省是ldbm
database ldbm
# 後綴或者根. 這是你LDAP目錄的頂節點
suffix "o=linuxfocus.org"
# LDAP的dbs 保存的位置
directory /var/lib/ldap
# 目錄管理員的區分名
rootdn "cn=Manager, o=linuxfocus.org"
# 保存ldap目錄管理員的明文密碼是很糟糕的,但是我們將在剛剛開始使用ldap時這樣做
rootpw secret
# 這就是所有的一切
編輯你的 /etc/openldap/ldap.conf配置文件
該文件位於ldap客戶端(我們將使用同一計算機作爲服務器和客戶端,當然這可以在同一計算機或不同的計算機上)
通常諸如ldapdelete 、ldapadd等等的ldap客戶端會讀該文件的內容。
##########/etc/openldap/ldap.conf#########
# LDAP 的缺省設置
#
# 查看 ldap.conf(5) 可以獲取更多的信息
# 本文件應該設置爲對所有人可讀
# 定義ldap服務器,可以用主機名或ip地址
host 127.0.0.1
# 定義我們要查詢的目錄的根
# 我們將要使用的頂節點,這不一定是目錄的根,比如我們可以使用
# base = ou=users, o=linuxfocus.ch
# 這時我們的一切查詢都將從樹根o=linuxfocus.org的分支開始
現在啓動ldap服務器。
如果你使用SuSE預先編譯好的openldap服務器,你可以通過下面的命令啓動ldap服務
/etc/rc.d/ldap start
在RedHat,該命令爲
/etc/rc.d/init.d/ldap start
如果你是使用缺省設置自己編譯並安裝的,你可以用/usr/local/libexec/slapd &啓動ldap服務器。如果沒有使用缺省設置,請找到slapd文件並運行它。
在新安裝的LDAP服務器上添加數據
到現在爲止,你的ldap服務器已經運行起來了,可以準備添加數據了。最標準的往ldap服務器中添加數據的方法是建立一個LDIF(LDAP目錄交換格式)文件。你可以通過閱讀man ldif來獲得更多關於ldif的信息。
簡單說來,ldif是ldap條目的文本表示。這些條目是很好讀懂的,並且可以在來自兩個不同的廠家的LDAP服務器間交換數據,哪怕使用的是不同的數據庫後臺或者是運行在不同的操作系統上。
是的,還有其他方法。我對爲什麼不使用XML替代LDIF感到很驚訝。
就讓我們一起來建立ldif文件,而不要感到任何的忙亂。一些應該記住的要點:? ldif 文件中的每一記錄/條目都應用一個空行分開? 空格是很重要的,"Atif Ghaffar" 和"Atif Ghaffar " 是完全不同的
下面是一個ldif文件linuxfocus.org.ldif
dn: o=linuxfocus.org
o: linuxfocus.org
objectclass: top
objectclass: organization
dn: ou=editors, o=linuxfocus.org
ou: editors
objectclass: organizationalUnit
dn: uid=aghaffar, ou=editors, o=linuxfocus.org
uid: aghafar
cn: Atif Ghaffar
sn: Ghaffar
givenname: Atif
objectclass: person
userpassword: yIvSBWSuLs2N2
mailacceptinggeneralid: [email protected]
ou: editors
dn: uid=mkempe, ou=editors, o=linuxfocus.org
uid: mkempe
cn: Magnus Kempe
sn: Kempe
givenname: Magnus
objectclass: person
userpassword: clearpass
mailacceptinggeneralid: [email protected]
maildrop: [email protected]
preferredlanguage: fr
ou: editors
下面我們將這些數據加入ldap目錄。我們使用命令行程序ldapadd
ldapadd -D "cn=Manager, o=linuxfocus.org" -w secret < linuxfocus.org.ldif
該命令使用“cn=Manager, o=linuxfocus.org”作爲管理員的區分名(dn),使用secret
作爲密碼,然後從linuxfocus.org.ldif文件中讀取數據並寫入ldap目錄。
如果一切正常的話你可以準備開始查詢你的ldap目錄了,否則如果其間出了差錯的話,
你或許可以準備往我的郵箱灌水了;)
爲我的郵件服務器考慮,我希望一切正常。
在繼續之前,讓我們一行一行的來檢查一下這個ldif文件。
1. 這一行定義頂級記錄的區分名(dn),這將是目錄樹的根,這是必須定義的。
2. 這一行我們定義組織(o),並賦值爲“linuxfocus.org”。
3. 這一行定義這個對象的對象類,我們定義爲top。
4. 定義對象的類型(這裏是組織對象)。
5. 空行爲分割符。
6. 定義組editors(這是linuxfocus editors分支),舉一反三,我們也可以根據不同的目的來定義其他的分支,比如hosts和data分支。
7.明確定義組織單元(ou)editors的屬性。屬性是可以被用來查詢的條目,比如,如果你想要查詢所有屬於editors的用戶,你可以這樣查詢 “show all dn where ou=editors”。如果我們沒有定義屬性,則這條記錄將不符合查詢條件。
8. 定義對象類(組織單元)。
9. 空行爲分割符。
10. 定義屬於組editors的用戶aghaffar的區分名。
11. 定義該用戶的uid(要保證其是唯一的)。
12. 定義該用戶的cn(普通名字),比如,我喜歡將我的名字寫成“Firstname Lastname”,而有的人可能喜歡“Lastname Firstname”.
13. 姓
14. 名
15. 對象類(人)
16. 用戶密碼(這裏是加密的密碼)。這串字符表示密碼是用加密算法加密過的。剩下的部分是用“yI”加密的密碼"yIvSBWSuLs2N"。
17. 定義我的郵件地址。
18. 定義我所屬於的組織單元(組editors)
19. 空行爲分割符。
20. 定義另一個用戶mkempe
21. 普通名字
22. 姓
23. 名
24. 對象類
25. 用戶密碼:注意這裏我們使用明文密碼。你可以爲不同的用戶使用不同的方案。這是根據每一條目定義的,而不是基於數據庫定義的。因此一個用戶可能使用明文密碼,第二個可能使用加密密碼,另一個則可能使用SHA認證方式。
26. 郵件地址。
27. maildrop:定義用戶郵箱的真實位置。在這個例子中,這個服務器接受收件人爲[email protected]的郵件,然後郵件服務器會查詢ldap服務器“有接受收件人爲[email protected]的郵箱嗎?”ldap服務器就會返回maildrop屬性值。接着郵件服務器就會將該郵件發給那個郵箱。
28.母語:這是我們一個額外的屬性,這個屬性定義了用戶的母語。我們可以利用存儲在中央ldap服務器的信息來爲改用戶提供更好的服務。比如,直接向該用戶顯示本頁的法語版本。請注意前面一條記錄沒有母語、maildrop等屬性,這也是ldap強大的一個方面——不必象一個數據庫中的表格那樣擁有固定的結構。你可以在一條記錄中定義3條屬性,而在另一箇中定義30條屬性。
29. 組織單元。
查詢ldap數據庫
讓我們找出關於用戶mkempe的所有數據
ldapsearch uid=mkempe
找出editors的所有區分名
ldapsearch (&(objectclass=person)(ou=editors)) dn
更多的例子可以參考ldapsearch的man手冊。
LDAP的好處
讓我們來看一看遷移到LDAP所帶來的好處。
LDAP是一個開放的標準。你將使用的大多數的新的應用程序都能夠查詢ldap數據庫,甚至windows2000使用LDAP作爲他的目錄服務。信息的集中化將會帶來巨大的利益,單點管理,減少錯誤,減少數據複製等等。
LDAP應用實例
如果我是康柏公司的推銷員,我可以測試向你銷售LDAP並告訴你可以用它來作爲“聯繫人管理”,但是我不受僱於康柏公司,所以我會嘗試向你介紹LDAP有趣的一些方面。
同一登錄系統的單一數據源
用戶帳號放置在一個集中的地方。
你可能會使用一個LDAP目錄來管理你的用戶,放置用戶的密碼及其他信息,而不僅僅是存放在/et/passwd文件中。Windows/Unix/Mac用戶都可以使用這些信息。
建議:你可以使用LDAP信息來進行用戶認證,而不是用shadow或nis等等方式。
建議:你可以寫一個小web程序來讓用戶不用登錄到系統就可以更改他的存放在LDAP中的unix密碼。這時你將需要使用pam_ldap, 可以參考資源列表中關於pam_ldap的url.
注意:
統一登錄系統的單一數據源!=同一登錄系統
大多數LDAP銷售商在向你銷售LDAP時,會告訴你如果你使用LDAP,你就可以擁有一個同一登錄系統解決方案。其實這隻說對了一半。同一登錄系統並不是什麼新玩藝,只不過時99v經理的噱頭而已。
同一登錄系統的實例:
* 你用"aghaffar"登錄工作站
* 你訪問公司的內部網,內部網中的web頁面是密碼保護的,你不用登錄就可以訪問,因爲www服務器可以識別你的身份。
* 你開始運行一個程序,比如SAP, 再一次地,你不需要密碼,因爲系統已經擁有了你的身份和信息。
* 等等等等
當然你可以使用LDAP作爲用戶數據源,而在幾個不同的應用程序間進行會話管理的小戲法就是所謂的“統一登錄系統”了,要知道,這和LDAP是風馬牛不相及的。
其實這可以用LDAP, NIS, NT域控制器帳號,數據庫,平面文件實現的。
建議:你可能想要建立用戶郵件帳號但是不想建立unxi帳號。沒問題,我正在使用一個LDAP+Postfix 郵件服務器+ Cyrus IMAP/POP服務器的複合服務器來管理成千上萬的用戶,當然不用建立相應的系統帳號。
建議:你可能想要將不同應用程序的信息集中化。比如,將Netscape的首選項、書籤等信息存入LDAP,並且用戶可以將這些信息從一部計算機移動到另一部,從LDAP服務器下載他/她的信息。這個用戶可以從Windows NT Netscape 遷移到Linux/Solaris/Macintosh Netscape的同時還使用同樣的用戶信息(對不起,又提到了Microsoft,我知道這倒了你的胃口)。
情景:我憎惡老是在web和書面上填充我的個人信息。我不知道爲什麼人們老是想知道我的年齡、生日、辦公室地址,即使已經告訴過他們。在我以前謀職的公司裏,我們不得不建立龐大的表格,表格的信息75%都是一樣的(姓名、主題、通信地址、樓層、管理員名字、部門)。
建議:比如,如果我的電話出故障了,我給你的唯一信息是“我的電話出故障了”。
採取以下的措施可以儘量減少用戶的厭煩:? 爲用戶提供問題提交表單? 頁面提供用戶名/密碼驗證 (每個對話驗證一次,下一次用戶登錄是能記住用戶信息)
? 頁面提供兩個表單元素 1) 反映問題的文字框2)提交按鈕
寫文章:教/學
我希望這篇文章能對你有所幫助,或者讓你的大腦充滿了10001100110010。你看看,你並不是必須成爲專家才能和大家共享你的知識。你不必成爲一個教授,也不必成爲一個教師才能寫教程。每一點小小的知識都能幫助別人。
幸運的是,現在我看到越來越多的人在討論linux, 我看到他們中的大多數人都在測試linux,在一些人進行了一段時間的同時一些人很快放棄了。這些人可能完全沒有unix命令的使用經驗和概念,然而他們卻可能和遇到的問題鬥爭了一段時間。如果你精神飽滿的面對遇到的問題,那麼你可以成爲最好的教師,如果你認爲你沒有任何的資料寫文章來幫助linux社團,你可以自願的將本文翻譯成你的母語。
資源列表:
PAM LDAP Module
pam_ldap 模塊爲Solarish和linux工作站提供LDAP目錄認證,以及更改其在目錄中的密碼。
openLDAP
OpenLDAP 項目是一個協作開發強健的、商業等級的、具有豐富特性的、並且是開放源碼的LDAP應用程序和工具的項目。該項目由一個全世界志願者組成的社團管理,該社團利用Internet來交流、計劃和開發OpenLDAP 軟件和文檔。
Java based excellent LDAP Browser/Editor
LDAP 瀏覽器/編輯器提供用戶友好界面LDAP目錄編輯工具。由JFC (SwingSet) 和JNDI 類庫寫成。可以連接第二和第三版LDAP 服務器。
kldap
kldap 是一個KDE的LDAP客戶端(瀏覽器) 。你可以象你熟悉的Novell Administrator那樣瀏覽LDAP目錄。
freshmeat.net/search.php3?query=ldap
Freshmeat 站點上大量的LDAP相關工具。
www.redbooks.ibm.com/abstracts/sg245110.html
IBM的LDAP實現手冊。你可以在線瀏覽或購買。
ypldapd - nis 2 ldap gateway
Ypldapd 是一個網絡信息服務(NIS) 服務器,它使用LDAP作爲數據源。通過ypldapd,現存的NIS 客戶可以透明地使用LDAP來查詢用戶、組和主機信息。企業可以充分地獲得LDAP所帶來的好處,比如擴展性等而不用升級客戶端。
Introduction to the SLAPD and SLURPD Administrators Guide
必讀的關於LDAP的教程。
An LDAP RaodMap & FAQ
一個關於LDAP和X.500目錄服務的資源教程。
www.umich.edu/~dirsvcs/ldap/index.html
輕量目錄訪問協議。