原文做者:Jason P. Holland 27-February-2001 翻譯: ideal Linuxaid專業技術支持網站 LDAP簡介 LDAP(輕量級目錄訪問協議,Lightweight Directory Access Protocol)是實現提供被稱爲目錄服務的信息服務。 目錄服務是一種特殊的數據庫系統,其專門針對讀取,瀏覽和搜索操做進行了特定的優化。目錄通常用來包含描 述性的,基於屬性的信息並支持精細複雜的過濾能力。目錄通常不支持通用數據庫針對大量更新操做操做須要的 複雜的事務管理或回捲策略。而目錄服務的更新則通常都很是簡單。這種目錄能夠存儲包括我的信息、web鏈結、 jpeg圖像等各類信息。爲了訪問存儲在目錄中的信息,就須要使用運行在TCP/IP之上的訪問協議—LDAP。 LDAP目錄中的信息是是按照樹型結構組織,具體信息存儲在條目(entry)的數據結構中。條目至關於關係數據庫中 表的記錄;條目是具備區別名DN(Distinguished Name)的屬性(Attribute),DN是用來引用條目的,DN至關於 關係數據庫表中的關鍵字(Primary Key)。屬性由類型(Type)和一個或多個值(Values)組成,至關於關係數 據庫中的字段(Field)由字段名和數據類型組成,只是爲了方便檢索的須要,LDAP中的Type能夠有多個Value, 而不是關係數據庫中爲下降數據的冗餘性要求實現的各個域必須是不相關的。LDAP中條目的組織通常按照地理位置 和組織關係進行組織,很是的直觀。LDAP把數據存放在文件中,爲提升效率可使用基於索引的文件數據庫,而不 是關係數據庫。類型的一個例子就是mail,其值將是一個電子郵件地址。 LDAP的信息是以樹型結構存儲的,在樹根通常定義國家(c=CN)或域名(dc=com),在其下則每每定義一個或多個組織 (organization)(o=Acme)或組織單元(organizational units) (ou=People)。一個組織單元可能包含諸如全部僱員、 大樓內的全部打印機等信息。此外,LDAP支持對條目可以和必須支持哪些屬性進行控制,這是有一個特殊的稱爲對 象類別(objectClass)的屬性來實現的。該屬性的值決定了該條目必須遵循的一些規則,其規定了該條目可以及至少 應該包含哪些屬性。例如:inetorgPerson對象類須要支持sn(surname)和cn(common name)屬性,但也能夠包含可選 的如郵件,電話號碼等屬性。 目錄設計 設計目錄結構是LDAP最重要的方面之一。下面咱們將經過一個簡單的例子來講明如何設計合理的目錄結構。該例子將 經過Netscape地址薄來訪文。假設有一個位於美國US(c=US)並且跨越多個州的名爲Acme(o=Acme)的公司。Acme但願爲 全部的僱員實現一個小型的地址薄服務器。 咱們從一個簡單的組織DN開始: dn: o=Acme, c=US Acme全部的組織分類和屬性將存儲在該DN之下,這個DN在該存儲在該服務器的目錄是惟一的。Acme但願將其僱員的信 息分爲兩類:管理者(ou=Managers)和普通僱員(ou=Employees),這種分類產生的相對區別名(RDN,relative distinguished names。表示相對於頂點DN)就shi : dn: ou=Managers, o=Acme, c=US dn: ou=Employees, o=Acme, c=US 在下面咱們將會看到分層結構的組成:頂點是US的Acme,下面是管理者組織單元和僱員組織單元。所以包括Managers 和Employees的DN組成爲: dn: cn=Jason H. Smith, ou=Managers, o=Acme, c=US dn: cn=Ray D. Jones, ou=Employees, o=Acme, c=US dn: cn=Eric S. Woods, ou=Employees, o=Acme, c=US 爲了引用Jason H. Smith的通用名(common name )條目,LDAP將採用cn=Jason H. Smith的RDN。而後將前面的父條目 結合在一塊兒就造成以下的樹型結構: cn=Jason H. Smith + ou=Managers + o=Acme + c=US -> cn=Jason H. Smith, ou=Managers, o=Acme, c=US 如今已經定義好了目錄結構,下一步就須要導入目錄信息數據。目錄信息數據將被存放在LDIF文件中,其是導入目錄 信息數據的默認存放文件。用戶能夠方便的編寫Perl腳原本從例如/etc/passwd、NIS等系統文件中自動建立LDIF文件。 下面的實例保存目錄信息數據爲testdate.ldif文件,該文件的格式說明將能夠在man ldif中獲得。 在添加任何組織單元之前,必須首先定義Acme DN: dn: o=Acme, c=US objectClass: organization 這裏o屬性是必須的 o: Acme 下面是管理組單元的DN,在添加任何管理者信息之前,必須先定義該條目。 dn: ou=Managers, o=Acme, c=US objectClass: organizationalUnit 這裏ou屬性是必須的。 ou: Managers 第一個管理者DN: dn: cn=Jason H. Smith, ou=Managers, o=Acme, c=US objectClass: inetOrgPerson cn和sn都是必須的屬性: cn: Jason H. Smith sn: Smith 可是還能夠定義一些可選的屬性: telephoneNumber: 111-222-9999 mail: [email]headhauncho@acme.com[/email] localityName: Houston 能夠定義另一個組織單元: dn: ou=Employees, o=Acme, c=US objectClass: organizationalUnit ou: Employees 並添加僱員信息以下: dn: cn=Ray D. Jones, ou=Employees, o=Acme, c=US objectClass: inetOrgPerson cn: Ray D. Jones sn: Jones telephoneNumber: 444-555-6767 mail: [email]jonesrd@acme.com[/email] localityName: Houston dn: cn=Eric S. Woods, ou=Employees, o=Acme, c=US objectClass: inetOrgPerson cn: Eric S. Woods sn: Woods telephoneNumber: 444-555-6768 mail: [email]woodses@acme.com[/email] localityName: Houston 安裝配置 下一步須要設置OpenLDAP來接受剛纔定義的目錄結構的導入及提供訪問Netscape中的地址薄。在OpenLDAP郵件列 表中一個常見的問題是「我如何使Netscape地址薄來使用個人LDAP服務器?」保存地址薄信息是LDAP常見的一個 應用方面,這是由於它具備快速的查詢和讀取功能。並且OpenLDAP支持例如SSL/TLS等會話加密和目錄服務器複製 等功能,這樣就能夠實現一個很是好的開發源碼解決方案。 下面的討論都是基於openldap-2.0.7,其支持LDAP v2和LDAP v3。LDAP v3相對於LDAP v2最重要的是添加了對傳輸 層安全(TLS,Transport Layer Security)的支持及增長了認證方法。OpenLDAP有兩種安裝方式:源代碼方式和打包 的deb/rpm模式。能夠從[url]http://www.openldap.org/[/url]下載源代碼方式或者從[url]http://rpmfind.net/[/url]及光盤上獲得RPM包 方式。源代碼方式安裝過程以下: [root@radiusd src]# ar -xzvf openldap-2.0.7.tgz [root@radiusd src]# cd openldap-2.0.7 [root@radiusd openldap-2.0.7]# ./configure --prefix=/usr/local 這裏指示openldap被安裝在/usr/local目錄下,當這並非必須的。 [root@radiusd openldap-2.0.7]# make depend;make 在安裝結束之前進行測試: [root@radiusd openldap-2.0.7]# make test [root@radiusd openldap-2.0.7]# make install 若出現任何編譯錯誤,應該到OpenLDAP郵件列表去尋求幫助。你也許須要在PATH環境變量中添加以下路徑: /usr/local/libexec, /usr/local/bin及/usr/local/sbin。 PRM包方式的安裝實例以下: rpm -ivh openldap-2.0.7-14-i386.rpm rpm -ivh openldap-devel-2.0.7-14-i386.rpm 下來須要編輯slapd.conf文件,其是slapd守護進程的配置文件。slapd進程負責響應客戶應用訪問目錄服務請求。配置 文件存放/usr/local/etc/openldap。 爲了能使用Netscape地址薄屬性,須要添加一些額外的"模式"配置信息。在slapd.conf文件的開頭處添加以下include 內容,可是根據安裝路徑的不一樣,模式目錄路徑可能也不大同樣。 include /usr/local/etc/openldap/schema/cosine.schema include /usr/local/etc/openldap/schema/inetorgperson.schema 在slapd.conf的定義的suffix和rootdn行修改成能反應你須要的DN: suffix "o=Acme, c=US" rootdn "cn=root, o=Acme, c=US" 這裏cn=root條目是咱們的管理DN,其不受任何訪問控制或限制。其默認是cn=Manager,可是我但願root訪問。在 slapd.conf文件的末端添加以下內容,實現給Netsacpe進行目錄過濾和搜索操做的讀權限。全部沒有受權的訪問目 錄服務的請求都被做爲匿名用戶對待。下面的DN條目被格式化處理,也就是全部的空格被去掉,而且其值被逗號隔開。 在訪問控制,必須格式化條目不然將不能工做。 access to dn=".*,o=Acme,c=US" by anonymous read 對目錄的訪問許能夠進行精細的調節以適應各類需求。OpenLDAP 2.0管理指南有很是好的配置訪問許可的文檔說明。 這裏爲了測試目的,這樣的訪問控制級別是足夠了。 下面咱們就將啓動slapd服務器。若系統的ldap是經過RPM/DEB格式進行安裝的,根據使用的Linux發佈版本不一樣,啓動 腳本多是/etc/rc.d/init.d/ldap或/etc/init.d/ldap。固然也能夠手工啓動來進行測試。 slapd & 下面測試看slapd是否在運行 ps -ef | grep -i slapd | grep -v grep root 15479 1 0 10:42 ? 00:00:00 slapd root 15483 15479 0 10:42 ? 00:00:00 slapd root 15484 15483 0 10:42 ? 00:00:00 slapd root 15491 15483 0 10:43 ? 00:00:00 slapd root 15492 15483 0 10:43 ? 00:00:00 slapd 下面測試ldap的默認端口389是否被監聽: netstat -an | grep 389 tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 到這裏爲止,一切看上去都很正常,下面將導入ldap信息數據到數據庫中: ldapadd -D "cn=root, o=Acme, c=US" -W -v -f testdata.ldif 咱們使用-D參數和無限制的cn來捆綁目錄,這樣容許寫信息到目錄中。-W參數致使服務器須要密碼才能訪問。缺省的 密碼是在slapd.conf文件中的rootpw來設定的,默認是secre。使用該默認密碼是很是危險的,所以在測試完畢之後, 應該改變該密碼。記得使用-v參數來進行詳細輸出以判斷是否及如何修正出現的錯誤。 測試 當數據導入結束,下一步就須要配置客戶端來進行測試。Netscape地址薄支持不少目錄屬性,在下面的資源部分將包 含Netscape地址薄API標準鏈結地址。下面的簡單的測試實例,將使用以下屬性:cn,sn,mail.telephoneNumber和 localityName。地址薄中的Nickname條目是經過屬性xmozillanickname來支持的,其在任何「模式」中都不是默認地 被支持而須要對「模式」進行修改。本文將不設計如何修改「模式」方面。 打開Netscape的地址薄,選擇File->New Directory,輸入LDAP服務器的信息: Description: Acme Address Book LDAP Server: the IP/hostname address of your LDAP server Server Root: o=Acme, c=US 端口號和其餘信息不須要修改。並且因爲鏈結將以匿名用戶身份進行,所以不須要設置用戶名和密碼。 選擇OK按鈕,而後在左邊的目錄欄選中"Acme Address Book",最後在"Show names containing"框中輸入一個查詢, 例如Smith而後回車。你將能夠看到返回了一行數據。 若但願對每一個組織單元獲得獨立的列表輸出,你能夠在Netsacpe中建立另一個新的目錄條目: Description: Acme Managers LDAP Server: the IP/hostname address of your LDAP server Server Root: ou=Managers, o=Acme, c=US 這將致使僅僅在Acem目錄中搜索Nanagers組織單元,也就是實現了必定的過濾。固然能夠對Employees進行一樣的限制。 錯誤處理 可能會在測試中遇到以下問題: 若目錄服務不能返回數據,則編輯slapd.conf file並添加"Loglevel 1"。將致使slapd服務進程記錄全部的信息到 syslog LOCAL4。一樣須要編輯 /etc/syslog.conf文件來將這些信息定向到一個單獨的文件來便於調試。檢查該 log文件以確保slapd服務器啓動正常沒有任何錯誤信息。這一樣會詳細記錄每一個請求服務的信息。 確保PATH環境包括全部的ldap命令的路徑。 若導入數據失敗,仔細察看文件LDIF文件格式。更高一級的條目必須首先出現,從你的目錄數頂端開始,直到葉子節點。 須要有root身份來啓動slapd,除非改變slapd到超過1024以上的端口。 檢查slapd.conf文件格式,若你的訪問控制列表沒有被格式化,則可能致使鏈結服務器失敗。 使用Netscape地址薄來訪問LDAP是掌握使用LDAP概念一個很是好的方法。下面是一些和LDAP相關的一些鏈結資源, 包括一些使用LDAP認證一些常見服務的方法如:系統登陸及Samba等。 資源 [url]http://www.openldap.org/[/url] - OpenLDAP Web Site [url]http://www.openldap.org/doc/admin/[/url] - OpenLDAP 2.0 Administrators Guide [url]http://www.hklc.com/ldapschema/[/url] - LDAP Schema Browser [url]http://www.padl.com/pam_ldap.html[/url] - Pam-LDAP Authentication Module (they also have some Perl migration scripts) [url]http://perl-ldap.sourceforge.net/[/url] - Perl LDAP modules [url]http://www.unav.es/cti/ldap-smb-howto.html[/url] - Samba-PDC LDAP Howto [url]http://developer.netscape.com/docs/manuals/communicator/addrapi.htm[/url] - Netscape Address Book API