天天看點

OpenLDAP快速指南OpenLDAP快速指南

原貼:http://fanqiang.chinaunix.net/app/ldap/2005-03-23/2979.shtml

OpenLDAP快速指南

作者:Jason P. Holland 來源:freebsdchina (2005-03-23 12:33:27)

 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 protected]

    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 protected]

    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 protected]

    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模式。可以從http: //www.openldap.org/下載下傳源代碼方式或者從http://rpmfind.net/及CD光牒上得到RPM包方式。源代碼方式安裝過程如 下:

    [[email protected] src]# ar -xzvf openldap-2.0.7.tgz

    [[email protected] src]# cd openldap-2.0.7

    [[email protected] openldap-2.0.7]# ./configure --prefix=/usr/local

  這裡訓示openldap被安裝在/usr/local目錄下,當這并不是必須的。

    [[email protected] openldap-2.0.7]# make depend;make

  在安裝結束以前進行測試:

    [[email protected] openldap-2.0.7]# make test

    [[email protected] 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參數來進行詳細輸出以判斷是 否及如何修正出現的錯誤。

7

測試

  當資料導入結束,下一步就需要 配置用戶端來進行測試。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等。

資源

http://www.openldap.org/ - OpenLDAP Web Site

http://www.openldap.org/doc/admin/ - OpenLDAP 2.0 Administrators Guide

http://www.hklc.com/ldapschema/ - LDAP Schema Browser

http://www.padl.com/pam_ldap.html - Pam-LDAP Authentication Module (they also have some Perl migration scripts)

http://perl-ldap.sourceforge.net/ - Perl LDAP modules

http://www.unav.es/cti/ldap-smb-howto.html - Samba-PDC LDAP Howto

http://developer.netscape.com/docs/manuals/communicator/addrapi.htm - Netscape Address Book API Specification

_________________

專業始于專注

(http://www.fanqiang.com)

原文連結:http://www.freebsdchina.org/forum/viewtopic.php?t=1814&sid=82d6f2f00abe183ffb5576ac39656df8