歡迎您光臨本站 註冊首頁

[翻譯]OpenLDAP管理員指南(僅前七章)

←手機掃碼閱讀     火星人 @ 2014-03-04 , reply:0

[翻譯]OpenLDAP管理員指南(僅前七章)

(水平有限,疏漏之處,在所難免.懇請指正)




序言

版權

Copyright 1998-2002, The OpenLDAP Foundation, All Rights Reserved.

Copyright 1992-1996, Regents of the University of Michigan, All Rights Reserved

本文檔是OpenLDAP項目的一部分。它遵從在OpenLDAP Software Copyright Notices和OpenLDAP Public License中聲明的條款。完整的notices和相關的license分別可以在附錄B和C中找到。

本文檔的適用範圍

本文檔提供了在UNIX和類UNIX系統上安裝OpenLDAP 2.1的指南。它面向那些有經驗但是還沒有接觸過LDAP目錄操作的系統管理員。

本文檔也用於彙集各種以二進位包發放的OpenLDAP軟體或者其他放在OpenLDAP官方站點(http://www.OpenLDAP.org/)上的其他資源,在該站點上有很多資源可用。

OpenLDAP資源列表

Resource                          URL  
Document Catalog                  http://www.OpenLDAP.org/doc/  
Frequently Asked Questions          http://www.OpenLDAP.org/faq/  
Issue Tracking System          http://www.OpenLDAP.org/its/  
Mailing Lists                  http://www.OpenLDAP.org/lists/  
Software Pages                  http://www.OpenLDAP.org/software/  
Support Pages                  http://www.OpenLDAP.org/support/  

聲明

OpenLDAP項目由志願者組成。沒有他們在時間和精力上無償的奉獻就不會有本文檔。

OpenLDAP項目組也要向密歇根大學LDAP課題組致謝,他們在LDAP理論基礎方面的研究對OpenLDAP項目的實現功不可沒。本文檔也借鑒了密歇根大學的LDAP文檔:《SLAPD和SLURPD管理員指南》。

修訂

對本文檔的加強和修訂方面的建議將通過OpenLADP項目組的Issue Tracking System (http://www.openldap.org/its/)提交。

關於本文檔

本文檔是通過Ian Clatworthy所開發的Simple Document Format (http://search.cpan.org/src/IANC/sdf-2.001/doc/) 文檔系統製作完成的。SDF工具可從CPAN (http://search.cpan.org/search?query=SDF)獲得。


OpenLDAP 2.2 管理員指南

OpenLDAP 項目組 <http://www.openldap.org>;
2004年2月25日

目錄

序言
1.簡要介紹OpenLDAP目錄服務
1.1 什麼是目錄服務?
1.2 什麼是LDAP?
1.3 LDAP是如何工作的?
1.4 什麼是X.500?
1.5 LDAPv2和LDAPv3的區別?
1.6 什麼是slapd,它能做什麼?
1.7 什麼是slurpd,它能做什麼?

2.快速入門
3。總覽 - 配置選擇
3.1 本地目錄服務
3.2 帶有引用(Referrals)的本地目錄服務
3.3 拷貝(Replicated)的目錄服務
3.4 分散式(Distributed)的目錄服務

4.構建和安裝OpenLDAP軟體
4.1 獲取和解壓縮
4.2 預安裝(Prerequisite)
4.3 運行configure命令
4.4 生成
4.5 測試
4.6 安裝

5.slapd的配置文件
5.1 配置文件格式
5.2 配置文件指令
5.3 訪問控制
5.4 配置文件示列

6.運行slapd
6.1 命令行選項
6.2 啟動slapd
6.3 停止slapd

7.資料庫創建和維護工具
7.1 在LDAP上創建資料庫
7.2 離線創建資料庫
7.3 LDIF文本的條目格式

8.方案說明
8.1 分散式的方案文件
8.2 方案的擴展

9.安全考慮
9.1 網路安全
9.2 保持數據的完整(integrity)與一致(confidentiality)
9.3 認證(authentication)方法

10.使用SASL
10.1 SASL的安全考慮
10.2 SASL認證
10.3 SASL代理認證

11.使用TLS
11.1 TLS驗證
11.2 配置TLS

12.構建分散式的目錄服務(Distributed Directory Service)
12.1 子確認消息(Subordinate Knowledge Infomation)
12.2 父確認消息(Superior Knowledge Infomation)
12.3 ManageDsaIT控制器(Control)

13.用slurpd進行拷貝
13.1 總覽
13.2 拷貝日誌
13.3 命令行選項
13.4 配置slurpd和從屬的slapd實例
13.5 高級slurpd選項

14.LDAP同步拷貝
14.1 LDAP內容同步協議
14.2 Syncrepl的細節
14.3 配置Syncrepl

15.代理緩存引擎
15.1 總覽
15.2 代理緩存配置

附錄A.通用配置說明
附錄B.OpenLDAP軟體版權聲明
B.1 OpenLDAP軟體版權聲明
B.2 附加版權聲明
B.3 密西根大學版權聲明

附錄C.OpenLDAP公關許可證

1.OpenLDAP目錄服務簡介

本文檔詳細講解了如何構建,配置和操作OpenLDAP來提供目錄服務。其中包括配置並運行LDAP守護程序slapd以及負責LDAP的更新和複製的守護程序slurpd的細節。它既是新手的上路指南,也為經驗豐富的管理員提供參考。本節將對目錄服務,特別是slapd所提供的目錄服務做一個簡單的介紹。

1.1 什麼是目錄服務?

目錄是在讀取,瀏覽和搜索方面做了特殊優化的一類資料庫。目錄包含基於屬性的,描述性的信息,並且支持高級的過濾功能。目錄一般來說不支持大多數事務型資料庫所支持的高吞吐量和複雜的更新操作。就算目錄允許進行更新操作的話,也是要麼全部,要麼都不的原子操作。目錄的長處在於為大量的查詢和搜索操作提供快速反饋。為了保證數據的可用性和可靠性,它們在著眼於減少反應時間的同時也可能具備廣泛的複製信息的能力。當目錄信息被複制時,複製方與被複制方有暫時的不一致是可以的,只要它們最終仍然保持同步。

可以有多種不同的方式來提供目錄服務。不同的目錄所允許存儲的信息是不同的,在信息如何被引用,查詢,更新以及防止未經授權的訪問等問題上不同的目錄的處理方式也有諸多的不同。一些目錄服務是本地的,只提供受限的服務(比如,單機上的finger服務)。另一些服務是大範圍的(global),提供廣闊得多的服務(比如面向整個網際網路)。大範圍的服務通常是分散式的,這也就意味著數據是分佈在多台機器上的,這些機器一起來提供目錄服務。典型的大範圍服務定義一個統一的名稱空間(namespace)來給出一個相同的數據視圖(data view),而不管你相對於數據所在的位置。DNS是一個典型的大範圍分散式目錄服務的例子。

1.2 什麼是LDAP?

LDAP是Lightweight Directory Access Protocol(輕量級目錄訪問協議)的縮寫。正如它的名字所表明的那樣,它是一個輕量級的目錄訪問協議,特指基於X.500的目錄訪問協議的縮微版本。LDAP運行在TCP/IP或者其他的面向連接的傳輸服務之上。LDAP完整的技術規範由 RFC2251 "The Lightweight Directory Access Protocol (v3)" 和其他幾個在RFC3377中定義的文檔組成。本節將從用戶的角度對LDAP做一個大致的了解。

什麼樣的信息可以存儲在目錄當中?LDAP信息模型是基於條目的(entry)。一個條目就是一些具有全局唯一的標識名(Distinguished Name,簡寫做DN)的屬性的集合。DN用於無二義性的指代一個唯一的條目。條目的每一個屬性都有一個類型(type),一個或者多個值(value)。類型(type)往往是特定字元串的簡寫,比如用"cn"指代"common name",或者"mail"指代電子郵件地址。值(value)的語法依賴於類型(type)。比如,類型為cn的屬性可能包含值Babs Jensen。類型為mail的屬性可能包含值"babs@example.com"。類型為jpegPhoto的屬性可能包含二進位格式的JPEG圖象。

信息在目錄中是如何組織的?在LDAP中,條目是按樹狀的層次結構組織的。傳統上,這個結構往往是地理界限或者組織界限的反映。代表國家的條目位於整個目錄樹的頂層。之下的條目則代表各個州以及國家性的組織。再下面的條目則代表著組織單位,個人,印表機,文件,或者你所能想到的其他東西。圖1.1顯示了按照傳統命名方式組織的LDAP目錄信息樹。


圖1.1: LDAP目錄樹(傳統命名方式)

目錄樹也可以按照網際網路域名結構組織。因為它允許按照DNS對目錄服務進行定位,這種命名方式正變得越來越受歡迎。圖1.2顯示了按照域名進行組織的一個LDAP目錄樹的例子。


圖1.2:LDAP目錄樹(域名命名方式)

另外,LDAP允許你通過使用一種叫做objectClass的特殊屬性來控制哪些屬性是條目所必須的,哪些屬性是條目可選的。objectClass屬性的值是由條目所必須遵從的方案(schema)來定義的。

信息是如何被引用的?一個條目是通過它的標識名來引用的。而標識名是由相對標識名(Relative Distinguished Name或者RDN)和它的父條目名連在一起來構成的。比如,在網際網路命名的例子中,Barbara Jensen條目有相對標識名uid=babs和標識名uid=babs,ou=People,dc=example,dc=com。完整的DN格式在 RFC2253,"Lightweight Directory Access Protocol (v3): UTF-8 String Representation of Distinguished Names"中描述。

信息是如何被訪問的?LDAP定義了一組查詢和更新目錄的操作。支持的操作包括從目錄中添加和刪除條目,更改已有的條目,更改已有條目的名字。然而,大多數情況下LDAP是用於搜索目錄中的信息的。通過指定搜索過濾器,LDAP可以在目錄的相關部分搜索相符的條目。滿足過濾條件的每一個條目都能收到請求信息。

比如,你可能想搜索位於dc=example,dc=com目錄子樹下的叫Barbara Jensen的人的條目,並獲取找到的每個條目的email地址。LDAP可以讓你輕鬆的完成這一切。或者你想搜索直接位於st=California,c=US子樹之下且名稱中有Acme字元串,並且有一個傳真號的組織的條目。LDAP也讓你能輕鬆地完成這一切。下一節將詳細描述更多的有關你能用LDAP做什麼和它如何對你有用的諸多細節。

怎樣保護信息不受未經授權的訪問?一些目錄服務不提供保護,允許信息對任何人可見。LDAP提供了一套機制來對客戶進行身份確認,或者讓客戶證明他擁有連接到伺服器的身份,這無疑為對伺服器進行全方位的訪問控制鋪平了道路,從而確保了伺服器上所包含信息的安全。LDAP也支持privacy和integrity的安全服務。

1.3 LDAP是怎樣工作的?

LDAP目錄服務是基於客戶--伺服器模式的。一個或者多個LDAP伺服器包含著組成整個目錄信息樹(DIT)的數據。客戶連接到伺服器並且發出一個請求(question)。然後伺服器要麼以一個回答(answer)予以回應,要麼給出一個指針,客戶可以通過此指針獲取到所需的數據(通常,該指針是指向另一個LDAP伺服器)。無論客戶連到哪個LDAP伺服器,它看到的都是同一個目錄視圖(view)。這是LDAP這類全局目錄服務的一個重要特徵。

1.4 什麼是X.500?

從技術上來說,LDAP是一個到X.500目錄服務的目錄訪問協議,X.500是一個OSI目錄協議。最初,LDAP客戶通過網關(gateway)訪問X.500目錄服務。這個網關在客戶和網關之間運行LDAP和X.500目錄訪問協議(Directory Access Protocol ,DAP),而X.500目錄訪問協議是位於網關和X.500伺服器之間的。DAP是一個重量級的協議,在整個OSI協議棧上進行操作,而且需要佔用大量的計算資源。LDAP被設計為在TCP/IP層上操作,以小得多的代價實現了大多數DAP的功能。

雖然LDAP可以仍舊通過網關訪問X.500目錄伺服器,但是現在通常都是在X.500伺服器上直接實現LDAP。

單獨的LDAP守護程序,slapd,可以被看做是一個輕量級的X.500目錄伺服器。也就是說,它沒有實現X.500完整的DAP協議。作為一個輕量級的目錄伺服器,slapd實現的僅僅是X.500模型的一個子集。

如果你已經在打算運行一個X.500的DAP服務而且你想繼續這麼做的話,你可以不用再閱讀本指南了。本指南全都是關於通過slapd運行LDAP的,而不是運行X.500的DAP。如果你現在沒有運行X.500的DAP,或者想停止運行X.500的DAP,或者還沒有立即計劃要運行X.500的話,請繼續往下讀。

從LDAP目錄伺服器上拷貝數據到X.500 DAP DSA是可能的。這需要LDAP/DAP網關。OpenLDAP不提供這樣的網關,但是我們的拷貝守護程序可以用於拷貝數據到這樣的網關。請參閱本文檔的Replication with slurpd章節了解關於拷貝的信息。

1.5 LDAPv2和LDAPv3的區別?

LDAPv3 是在90年代後期開發以取代LDAPv2的。LDAPv3為LDAP添加了如下功能:

        。基於SASL的強類型認證(Strong Authentication)
        。基於TLS(SSL)的數據完整性和一致性保護
        。通過Unicode國際化
        。Referrals and Continuations
        。方案發現
        。可擴展性(控制,可擴展的操作,等等)

LDAPv2是歷史性的(RFC3494)。因為大多數LDAPv2的實現(包括 slapd(8))都沒有遵從LDAPv2技術規範,在不同的LDAPv2的實現當中進行互操作是有限的。因為LDAPv2和LDAPv3有著顯著的不同,同時部署LDAPv2和LDAPv3將會有大麻煩。應該避免使用LDAPv2。LDAPv2默認是不被支持了的。

1.6 什麼是slapd,它能幹什麼?

slapd(8)是一個可在許多平台上運行的LDAP目錄伺服器。你可以用它來提供你自己的目錄服務。你的目錄可以包含相當多的你想放在裡面的東西。你可以將它連接到一個全局的目錄伺服器上,也可以自己運行它。slapd的一些其他的有趣的功能包含如下:

LDAPv3:slapd實現了輕量級目錄訪問協議的第三個版本。slapd支持IPv4和IPv6還有Unix IPC上的LDAP。

Simple Authentication and Security Layer:slapd支持通過SASL的強類型認證服務。slapd的SASL實現利用了 Cyrus SASL--一個支持DIGEST-MD5,EXTERNAL,和GSSAPI在內的多種機制的軟體。

Transport Layer Security:slapd通過使用TLS(或者SSL)提供privacy和integrity保護。slapd的TLS實現利用了OpenSSL。

Topology control:slapd可以被配置為限制基於網路拓撲信息之上的套接字層的訪問。這個功能用到了TCP wrappers。

Access control:slapd提供了一個多樣並且強大的訪問控制功能,它允許你控制對你的資料庫中的信息的訪問。你能夠通過LDAP認證信息,IP地址,域名或者其它的規則控制對條目的訪問。slapd支持靜態的和動態的訪問控制信息。

Internationalization:slapd支持Unicode和語言標誌。

Choice of database backends:slapd提供了可讓你選擇的多種後端資料庫。這包括BDB,一種高性能的事務性後端資料庫;LDBM,一種輕量級的DBM後端資料庫;SHELL,一種能夠和任意腳本交互的資料庫介面;還有PASSWD,一種與passwd文件交互的簡單資料庫介面。BDB後端資料庫使用了Sleepycat Berkeley DB。LDBM使用Berkeley DB或者GDBM。

Multiple database instances:slapd可以被配置為同時支持多個資料庫實例。這意味著一個單一的slapd伺服器能夠響應LDAP樹上多個不同邏輯的部分,使用相同或者不同的後端資料庫。

Generic modules API:如果你要求有更多的個性化,slapd可以讓你輕易的寫出你自己的模塊。slapd包含兩個不同的部分:前端模塊處理和LDAP客戶的通信;另外有多個模塊處理特定的任務比如資料庫操作。因為這兩部分是通過定義好的C API進行交互的,所以你可以寫出自己的個性化的模塊來以多種方式擴展slapd。而且,許多可編程的資料庫模塊也被提供。這允許你使用流行的編程語言將外部的數據源導入slapd當中(比如Perl,shell,SQL,和TCL)。

Threads: 為達到高性能slapd被線程化了。通過使用一個線程池,只需要有一個支持多線程的slapd進程你就可以處理所有的輸入請求。這減小了在高負荷時系統的開銷。

Replication: slapd可以被配置為維護一個目錄信息的shadow拷貝。這種一主多屬(single-master/multiple-slave)的拷貝方案在一些大數據量的環境下是很重要的,因為這種情況下單一的slapd不能提供必要的可用性和可靠性。slapd也支持尚在實驗中的多主(multi-master)拷貝方案(用於強類型的ACID屬性不需要的地方)。slapd支持兩種拷貝方案:LDAP Sync-based和slurpd(8)-based拷貝方案。

Proxy Cache:slapd可以被配置為具有代理緩存功能的LDAP伺服器。

Configuration:slapd是高度可配置的,通過一個簡單的配置文件你就可以更改你想要改變的一切。配置選項也都有合理的默認值,無疑這會讓你的工作更為輕鬆。

1.7 什麼是slurpd,它能幹什麼?

slurpd(8)是一個在slapd的幫助下提供拷貝服務的守護程序。它負責將對主slapd資料庫的改變分發給各個不同的slapd從屬(replicas)。它免除了slapd的後顧之憂--在數據發生改變的時候某些從屬也許當掉(down)了或者不可達。slurpd會自動處理失敗請求的重傳。slapd和slurpd通過一個將更改記入日誌的簡單文本文件進行通信。

查看Replication with slurpd章節以獲得更多關於如何配置和運行slurpd的信息。

反過來,LDAP-Sync-based拷貝也可以用來提供拷貝服務。查看LDAP Sync Replication章節以獲得更多信息。

2.快速入門

以下將對OpenLDAP 2.1做一個簡單的簡介,其中包括LDAP守護程序,slapd(8)。

它將帶你領略安裝和配置OpenLDAP的幾個基本步驟。它應當和本文檔的其他章節,手冊,以及其它隨發布包一起發放的資料(比如INSTALL文檔)或者OpenLDAP站點上的資料(尤其是FAQ)一起使用。

如果你打算嚴肅地運行OpenLDAP,你應當在準備安裝之前參看本文檔的全部章節。

-------------------------------------------------------------------------------------------
注意:快速入門沒有提及強類型身份認證,也沒有提及數據的完整和保密措施。這些都將在本文檔的其它章節中詳細講述
-------------------------------------------------------------------------------------------


1. 獲取軟體包
你可以按照OpenLDAP下載頁面(http://www.openldap.org/software/download/).上的說明獲得該軟體的一個拷貝。推薦新手使用最新版本。

2. 解壓發布包
選擇一個目錄存放該軟體的源代碼,更改工作目錄到該目錄下,用下列命令解開發布包:
        gunzip -c openldap-VERSION.tgz | tar xvfB -

然後進入發布包目錄:
        cd openldap-VERSION

你需要用你的發布版本來代替VERSION。

3. 參看文檔
現在你應該先參看隨發布包發布的COPYRIGHT, LICENSE, README 和 INSTALL文檔。COPYRIGHT 和 LICENSE 提供了使用,複製OpenLDAP的相關信息。

你也應該參看本文檔的其它章節。特別是,「構建和安裝OpenLDAP軟體」一節提供了預安裝軟體以及安裝過程的細節。

4. 運行configure腳本
你需要運行configure配置腳本來配置發布包以便在你的系統上構建OpenLDAP。configure腳本可以接受很多的命令行選項來啟用或者禁用某些可選的功能。通常默認值就可以了,但你可能會想改變它們。要想得到configure腳本接受的完整選項列表,需要使用--help選項:
        ./configure --help

考慮到你正在參考本文檔,我們就假設你有足夠的勇氣讓configure腳本去決定一切:
        ./configure

如果configure腳本在你系統上沒有出什麼差錯的話,你現在就可以繼續構建整個軟體了。如果configure腳本出了問題的話,你可能就需要前往FAQ的安裝版塊尋求幫助(http://www.openldap.org/faq/),或者是仔細閱讀本文檔的「構建和安裝OpenLDAP軟體」一節了。

5.構建軟體
下一步是構建整個軟體。這一步分為兩部分,首先我們構建依賴關係,然後我們開始編譯:
        make depend
        make

兩部分都應當無差錯的完成。

6. 測試構建是否正確
為了確保構建是正確的,你應當運行test套件(它僅僅會花幾分鐘的時間):
        make test

作用在你確定的配置之上的測試將開始運行並且所有的測試都應該通過。某些測試,比如對複製(replication)的測試,可能會被忽略。

7. 安裝軟體
現在你要準備安裝了,這通常需要超級用戶的許可權:
        su root -c 'make install'

所有的東西都將安裝在/usr/local目錄下(或者在運行configure時你指定的其它位置)。

8. 編輯配置文件
用你喜歡的編輯器編輯slapd.conf樣例(通常位於/usr/local/etc/openldap/slapd.conf)使之包含下列格式的BDB資料庫定義:
        database bdb
        suffix "dc=<MY-DOMAIN>;,dc=<COM>;"
        rootdn "cn=Manager,dc=<MY-DOMAIN>;,dc=<COM>;"
        rootpw secret
        directory /usr/local/var/openldap-data

一定要用你的域名的正確部分取代<MY-DOMAIN>; 和 <COM>;。比如,對於example.com,用:
        database bdb
        suffix "dc=example,dc=com"
        rootdn "cn=Manager,dc=example,dc=com"
        rootpw secret
        directory /usr/local/var/openldap-data

如果你的域名包含其他的成分,比如eng.uni.edu.eu,那麼用:
        database bdb
        suffix "dc=eng,dc=uni,dc=edu,dc=eu"
        rootdn "cn=Manager,dc=eng,dc=uni,dc=edu,dc=eu"
        rootpw secret
        directory /usr/local/var/openldap-data

配置slapd的相關細節可以在slapd.conf手冊和本文檔的」slapd的配置文件「一節當中找到。

--------------------------------------------------------------------------------------
注意:啟動slapd時指定的目錄需要預先存在。
--------------------------------------------------------------------------------------

1. 啟動slapd
現在你需要運行下面的命令以啟動LDAP伺服器slapd:
        su root -c /usr/local/libexec/slapd

要檢查伺服器是否在運行並且配置是否正確,你可以在伺服器上運行ldapsearch命令。默認情況下,ldapsearch工具的位置是/usr/local/bin/ldapsearch:
        ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts

注意用單引號括起來的命令參數將會取消shell字元的特殊解釋。這應當返回:
        dn:
        namingContexts: dc=example,dc=com

有關運行slapd的細節可以在slapd手冊和本文檔的」運行slapd「一節中找到。

2. 添加初始條目到目錄中
你可以用ldapadd工具添加條目到你的LDAP目錄中。ldapadd需要LDIF格式的輸入。我們將通過兩步來完成它:
        1. 創建LDIF文件
        2. 運行ldapadd

使用你喜歡的編輯器創建一個包含下面內容的LDIF文件:
        dn: dc=<MY-DOMAIN>;,dc=<COM>;
        objectclass: dcObject
        objectclass: organization
        o: <MY ORGANIZATION>;
        dc: <MY-DOMAIN>;

        dn: cn=Manager,dc=<MY-DOMAIN>;,dc=<COM>;
        objectclass: organizationalRole
        cn: Manager

一定要用你的域名的正確部分取代<MY-DOMAIN>; 和 <COM>;。<MY ORGANIZATION>;應該用你所在組織的名稱來代替。在你剪切和粘貼的時候一定要記得包含前導或者後跟的空格。
        dn: dc=example,dc=com
        objectclass: dcObject
        objectclass: organization
        o: Example Company
        dc: example

        dn: cn=Manager,dc=example,dc=com
        objectclass: organizationalRole
        cn: Manager

現在,你可以運行ldapadd來把這些條目添加到你目錄當中了。
        ldapadd -x -D "cn=Manager,dc=<MY-DOMAIN>;,dc=<COM>;" -W -f example.ldif

一定要用你的域名的正確部分取代<MY-DOMAIN>; 和 <COM>;。你將被提示輸入slapd.conf中指定的」secret「。比如,對於example.com,用:
        ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f example.ldif

其中,example.ldif是你在上面創建的文件。

有關目錄創建的其它信息可以在本文檔的」資料庫創建和維護工具「一節中找到。

3. 觀察它是否工作
現在你將添加的條目是不是在你的目錄當中。你可以用任何LDAP客戶端工具來這樣做,但是在我們的示例中使用的是ldapsearch工具。切記要用你的站點的正確值取代dc=example,dc=com:
        ldapsearch -x -b 'dc=example,dc=com' '(objectclass=*)'

這條命令將搜索並且取得資料庫中的每一個條目。

現在你可以用ldapadd或者其它的客戶端工具添加更多的條目,嘗試各種配置選項,資料庫參數或者諸如此類的了。

注意,在默認情況下,slapd允許非超級用戶擁有對每個條目的讀取許可權(超級用戶由rootdn配置指令指定)。推薦的方式是對授權用戶建立嚴格的訪問控制。訪問控制在」slapd的配置文件「章節的」訪問控制「一節中討論。我們鼓勵你閱讀」安全考慮「,「使用SASL」,「使用TLS」章節。

接下來的章節將給出更多關於編譯,構建,運行slapd的詳細信息。


3.縱覽 - 配置選項

本節給出了LDAP目錄服務的各種配置模式的一個縱覽,以及如何讓你的LDAP伺服器slapd適合世界的其他地方。

3.1 本地目錄服務

在這種配置模式下,你的slapd只為你的本地域提供目錄服務。它不會以任何方式與別的目錄伺服器交互。這種配置模式如圖3.1所示。


圖3.1:本地配置模式

如果你是剛剛開始接觸LDAP(也就是「快速入門」教你做的),或者如果你只想提供本地的目錄服務而不想與外部世界發生瓜葛,那麼就應該使用這種模式。只要你願意,它可以很容易的升級到其它模式。

3.2 帶有指針(Referrals)的本地目錄服務

在這種配置模式下,你為你的本地域運行一個LDAP伺服器,並且將它配置成為當客戶的請求超出你的本地域的處理能力的時候能夠返回一個指針,該指針指向一個具備處理客戶請求能力的更高級的伺服器的地址。你可以自己運行這一服務,也可以使用已提供給你的一個。這種配置模式如圖3.2所示。


圖3.2:帶指針的本地模式

如果你想運行本地目錄服務並且參與全局的目錄,那麼運行這種模式。

3.3 拷貝(Replicated)的目錄服務

slurpd守護程序是用來將主slapd上的改變傳播到一個或多個從屬的slapd上。一個master-slave 類型的配置示例如圖3.3所示。


圖3.3:複製模式的目錄服務

這種配置模式可以和前面的兩種配置模式之一和起來使用,在前面的兩種情況中,單獨的slapd不能提供足夠的可用性和可靠性。

3.4 分散式(Distributed)的目錄服務

在這種配置模式下,本地的服務被分割成為多個更小的服務,每一個都可能被複制,並且通過上級(superior)或者下級(subordinate)指針(referral)粘合起來。


4.構建和安裝OpenLDAP軟體

本節詳細講解了如何構建和安裝OpenLDAP,這包括slapd和slurpd。構建和安裝OpenLDAP需要經過幾個步驟:安裝支撐軟體,配置,編譯,最後是安裝。以下的幾節將詳細說明這一過程。

4.1 獲取和解壓縮

你可以從OpenLDAP的官方站點http://www.openldap.org/software/download/ 或者該項目的FTP站點ftp://ftp.openldap.org/pub/OpenLDAP/ 獲取到OpenLDAP的一份拷貝。

有兩類包(package)可以使用。releases包含了新功能,同時對bug做了修復。儘管項目組採取了相關的的措施保證releases的穩定性,但問題往往還是會在release中出現。stable發布版是被認為穩定的最新版本。

用戶可以根據他對新功能或者穩定性的要求自己選擇使用的版本。

將OpenLDAP軟體包下載到你的本地機器上之後,你需要將它們從存檔的壓縮文件中解壓出來並更改你的當前工作目錄到解壓后的目錄:

gunzip -c openldap-VERSION.tgz | tar xf -
cd openldap-VERSION

你需要用你版本號代替VERSION。

現在你應該先參看隨發布包發布的COPYRIGHT, LICENSE, README 和 INSTALL文檔。COPYRIGHT 和 LICENSE 提供了使用,複製OpenLDAP的相關信息。

4.2 預安裝(Prerequisite)

OpenLDAP需要幾個第三方軟體的支持。根據你要實現的功能,你可能需要下載並安裝一些相關的軟體包。本節給出了通常你可能要用到的一些軟體包的一些細節。需要注意的是這些第三方軟體包可能還需要一些額外的軟體的支持。請按照軟體包中的安裝說明安裝好需要的每一個包。

4.2.1 傳輸層安全

OpenLDAP客戶和伺服器需要安裝OpenSSL TLS庫來提供傳輸層的安全服務。雖然一些操作系統可能把OpenSSL作為基本系統的一部分或者作為可選的組件。OpenSSL仍然需要單獨安裝。

OpenSSL可從http://www.openssl.org/ 獲得。

沒有使用OpenSSL的OpenLDAP算不上真正的LDAPv3版本。

4.2.2 Kerberos認證服務

OpenLDAP客戶和伺服器可以支持基於Kerberos的認證服務。特別是,通過使用Heimdal 或者 MIT Kerberos V,OpenLDAP還可以支持SASL/GSSAPI 認證機制。如果你需要使用基於Kerberos的SASL/GSSAPI 認證,那麼你需要安裝Heimdal 或者 MIT Kerberos V。

Heimdal可從http://www.pdc.kth.se/heimdal/獲得。 MIT Kerberos V可從http://web.mit.edu/kerberos/www/獲得。

強烈推薦使用諸如Kerberos這樣的軟體來提供強類型認證服務。

4.2.3 簡單認證和安全層

OpenLDAP客戶和伺服器需要安裝Cyrus的SASL庫來提供簡單認證和安全層服務。雖然一些操作系統可能把Cyrus SASL作為基本系統的一部分或者作為可選的組件。Cyrus SASL通常還是需要單獨安裝。

Cyrus SASL可從http://asg.web.cmu.edu/sasl/sasl-library.html獲得。Cyrus SASL 將會用到已安裝的OpenSSL和Kerberos/GSSAPI 庫。

不使用Cyrus SASL 的OpenLDAP算不上真正的LDAPv3版本。

4.2.2 資料庫軟體

OpenLDAP的首選後端資料庫是BDB,要求4.2版本的Sleepycat Software Berkeley DB。如果配置安裝的時候還沒有安裝BDB的話,你是不能用首選後端資料庫構建slapd的。

你的操作系統可能把4.2版本的Berkeley DB作為基本系統的一部分或者作為可選的組件。否則的話你需要自己下載並安裝它。

Berkeley DB可從http://www.sleepycat.com/download/獲得。它有幾個不同的版本可用。在寫作本文檔的時候,其最新版本,即4.2版本,是我們推薦使用的。如果你想使用BDB作為後端資料庫的話,這個包是必須的。

slapd的LDBM支持很多種不同的資料庫管理系統,包括Berkeley DB 和 GDBM。GDBM可從自由軟體基金會(FSF)的站點ftp://ftp.gnu.org/pub/gnu/gdbm/獲得。

4.2.5 線程

OpenLDAP可以利用線程。OpenLDAP 支持 POSIX pthreads, Mach CThreads,以及其它的一些變種。如果找不到一個合適的線程系統的話,configure會給出警告。如果這發生的話,請參照FAQ(http://www.openldap.org/faq/)的Software|Installation|Platform Hints一節。

4.2.6 TCP包裝器(wrapper)

如果已安裝的話,slapd支持TCP包裝器(IP級別的過濾控制)。對於不包含公共信息的伺服器推薦使用TCP包裝器或者其它的IP級別的訪問過濾器(比如一些IP級別的防火牆提供的這樣的功能)。

4.3 運行configure命令

現在你可能需要運行帶--help參數的configure腳本。這將給出一個你在構建OpenLDAP時可做的改變的選項的清單。OpenLDAP的很多功能都可以通過這種方式起用或者禁用。

./configure --help

configure腳本也會通過查看環境變數做某些設置。這些環境變數包括:

表4.1: 環境變數
Variable          Description  
CC                  Specify alternative C Compiler  
CFLAGS          Specify additional compiler flags  
CPPFLAGS          Specify C Preprocessor flags  
LDFLAGS          Specify linker flags  
LIBS                  Specify additional libraries  

現在運行帶有所需配置選項或者環境變數的configure腳本。

[ settings] ./configure

作為一個示例,假設我們想安裝一個以BDB為後端資料庫且帶有TCP包裝器的OpenLDAP。默認情況下,BDB是起用的,而TCP包裝器不是。所以,我們需要指定--with-wrappers 來包含對TCP包裝器的支持:

./configure --with-wrappers

然而,如果所依賴的軟體不是安裝在系統目錄下面的話,這將會失敗。比如,如果TCP包裝器的頭文件和庫文件是分別安裝在/usr/local/include 和 /usr/local/lib 下面的話,configure腳本應該是像這樣:

env CPPFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib" \
                ./configure --with-wrappers

---------------------------------------------------------------------------------------------
注意:有些shell,比如源自Bourne sh的shell,不需要使用env命令。在有些情況下,環境變數需要通過其它語法來指定。
---------------------------------------------------------------------------------------------

4.4 構建

一旦你已運行configure腳本,那麼configure腳本輸出的最後一行應當是:

Please "make depend" to build dependencies

如果不是上面的這行的話,則說明configure腳本失敗了,你需要參看它的輸出來決定是在什麼地方出了點問題。除非configure完全成功了,否則你不能進入到下一步。

要構建依賴關係,運行命令:

make depend

現在構建整個系統,這一步將實際編譯OpenLDAP。

make

你應當小心地檢查該命令的輸出來確保所有的東西都已經正確構建了。注意這個命令構建LDAP庫,相應的客戶端和slapd以及slurpd。

4.5 測試

一旦配置和編譯都正確完成之後,你應當運行測試套件(suite)來驗證構建過程是正確的。

make test

作用在你確定的配置之上的測試將開始運行並且所有的測試都應該通過。某些測試,比如對複製(replication)的測試,可能會被忽略。

4.6 安裝

一旦你成功地測試了軟體之後,你就要安裝它了。你需要擁有對你在configure時指定的安裝目錄有寫許可權。默認情況下OpenLDAP是安裝在/usr/local目錄下的。如果你用--prefix配置選項改變了該設置,它將被安裝在你指定的位置。

典型的,安裝需要你有超級用戶許可權。在OpenLDAP源代碼的頂層目錄,鍵入:

su root -c 'make install'

然後會給出提示讓你輸入正確的密碼。

你應當小心地檢查該命令的輸出來確保所有的東西都已經正確安裝了。默認情況下你會在/usr/local/etc/openldap 目錄下找到slapd的配置文件。參看「slapd的配置文件」一節以獲得更多信息。


5.slapd的配置文件

一旦OpenLDAP被正確構建並安裝了之後,你就得準備配置slapd以便在你的站點上使用了。slapd的運行時配置文件主要是slapd.conf,通常是安裝在/usr/local/etc/openldap 目錄下面。

也可以通過slapd或者slurpd的命令行選項指定另一個配置文件。本節將描述配置文件的通用格式,之後是對常用的配置文件指令的一個詳細的敘述。

5.1 配置文件格式

slapd.conf文件包含三中類型的配置信息:全局的,特定後端(backend)的,特定資料庫的。全局的信息首先被指定,緊接著是與特定後端相關的信息,之後是與特定資料庫實例相關的信息。全局的指令可以被後端的和/或資料庫的指令重寫(override),而後端的指令也可以被資料庫的指令重寫。

空行和以「#」開頭的註釋行將被忽略。如果一行以空格開頭,它將被認為是接著前一行的(即使前一行是註釋)。

slapd.conf的通用格式如下:

         # global configuration directives
        <global config directives>;

        # backend definition
        backend <typeA>;
        <backend-specific directives>;

        # first database definition & config directives
        database <typeA>;
        <database-specific directives>;

        # second database definition & config directives
        database <typeB>;
        <database-specific directives>;

        # second database definition & config directives
        database <typeA>;
        <database-specific directives>;

        # subsequent backend & database definitions & config directives
        ...

一個配置指令可能會有參數。如果是這樣的話,它們用空格進行分隔。如果一個參數要包含空格,那麼這個參數應當用雙引號「像這樣」引起來。如果一個參數包含一個雙引號或者一條斜線「 \」,那麼這個字元應該用斜線字元「\」進行轉義。

本發布版附帶有一個安裝在/usr/local/etc/openldap目錄下的配置文件示例。包含模式(schema)定義(屬性類型和對象類,attribute types and object classes)的幾個文件放在/usr/local/etc/openldap/schema目錄下。

5.2 配置文件指令

本節詳細講解了常用的配置指令的一些細節。要得到完整的內容,請參閱slapd.conf的手冊。本節將把配置文件指令分成全局的,特定後端的,特定資料庫的三類,給出每個指令及其默認值(如果有的話),並且給出它的使用示例。

5.2.1 全局指令

本節所給出的指令將作用於所有的後端和資料庫,除非它們在後端和資料庫的定義中被重寫。需要用實際文本來替換的參數用<>;表示。

5.2.1.1 access to <what>; [ by <who>; <accesslevel>; <control>; ]+

該指令允許一個或者多個請求提交者(由<who>;指定)在一定的訪問級別下(由<accesslevel>;指定)訪問一組指定的條目和/或屬性(由<what>;指定)。參看本章節的「訪問控制」一節以獲得基本用法的一個總結。

----------------------------------------------------------------------------------------------------------
注意:如果不指定access指令,默認的訪問控制策略,access to * by * read,將會允許所有通過驗證的和匿名的用戶擁有讀許可權。
----------------------------------------------------------------------------------------------------------

5.2.1.2 attributetype <RFC2252 Attribute Type Description>;

該指令定義了一個屬性類型。請參看「模式規範」一節獲得有關該指令的信息。

5.2.1.3. idletimeout <integer>;

指定一個等待的秒數,如果超過這個時間客戶都沒有請求提交就關掉與客戶的連接。默認情況下,idletimeout為0,表示禁用該功能。

5.2.1.4. include <filename>;

該指令指定slapd讀入所給文件中的內容。被包含文件應該遵從slapd配置文件的通用格式。往往是將包含有模式定義的文件包含近來。

-----------------------------------------------------------------------------------------------------------
注意:你在使用這個指令的時候千萬要小心--因為include指令對嵌套的層數沒有做限制。而且也沒有一種機制能夠發現死循環。
-----------------------------------------------------------------------------------------------------------

5.2.1.5. loglevel <integer>;

該指令指定了debug聲明和統計數據應當被記入日誌文件的級別(currently logged to the syslogd(8) LOG_LOCAL4 facility)。你必須將OpenLDAP配置為--enable-debug (默認)該指令才會工作(except for the two statistics levels, which are always enabled)。log levels是可以相加的。要想知道數字與debuglevel的對應關係,可以用-? 為參數啟動slapd,你也可以參考下面的這個表。<integer>;的可能值是:

表5.1: Debugging Levels
Level  Description  
-1          nable all debugging  
0         no debugging  
1         trace function calls  
2        debug packet handling  
4         heavy trace debugging  
8         connection management  
16         print out packets sent and received  
32         search filter processing  
64         configuration file processing  
128         access control list processing  
256         stats log connections/operations/results  
512         stats log entries sent  
1024         print communication with shell backends  
2048         print entry parsing debugging  

示例:

loglevel -1

這將導致大量的調試信息被記入日誌文件。

默認:

loglevel 256

5.2.1.6. objectclass <RFC2252 Object Class Description>;

該指令定義了一個對象類。請參看「模式規範」一節獲得有關如何使用該指令的信息。

5.2.1.7. referral <URI>;

該指令指定了一個指針,當伺服器的slapd找不到一個本地的資料庫來處理一個請求的時候,它把該指針回傳給客戶。

示例:

referral ldap://root.openldap.org

這將把非本地的請求「推」到OpenLDAP的根伺服器上。「聰明的」LDAP客戶會向反饋回來的指針所指的伺服器重新發出請求。但是得注意大多數客戶僅僅知道怎麼樣處理簡單的LDAP的URL,其中包含主機部分和可選的DN部分。

5.2.1.8. sizelimit <integer>;

該指令指定了一次搜索操作所能獲得的最大條目數。

默認:

sizelimit 500

5.2.1.9. timelimit <integer>;

該指令指定了slapd花在回答一個搜索請求上的最大秒數(實時)。如果在這段時間內請求沒有完成,伺服器端將返回一個超時給客戶端。

默認:

timelimit 3600

5.2.2. 通用後端指令

本節中的指令將只應用在定義它們的後端之上。每一種後端都支持它們。後端指令作用到所有相同類型的資料庫實例上面,對於具體的指令,也可能在資料庫指令中被重寫。

5.2.2.1. backend <type>;

該指令標誌著後端聲明的開始。<type>;應當是在表5.2中列出的後端類型之一。

表5.2: 後端資料庫類型
Types                  Description  
bdb                  Berkeley DB transactional backend  
dnssrv          DNS SRV backend  
ldap                  Lightweight Directory Access Protocol (Proxy) backend  
ldbm                  Lightweight DBM backend  
meta                  Meta Directory backend  
monitor          Monitor backend  
passwd          Provides read-only access to passwd(5)  
perl                  Perl Programmable backend  
shell                  Shell (extern program) backend  
sql                  SQL Programmable backend  

示例:

backend bdb

這標誌著一個新的BDB後端定義的開始。

5.2.3. 通用資料庫指令

本節中的指令只會作用到定義它們的資料庫上面。他們被每一種資料庫支持。

5.2.3.1. database <type>;

該指令標誌著資料庫實例聲明的開始。<type>;應該是列在表5.2中的被支持的後端類型之一。

示例:

database bdb

這標誌著一個新的BDB資料庫實例聲明的開始。

5.2.3.2. readonly { on | off }

該指令將資料庫置為「只讀」模式。任何企圖修改資料庫的操作都將返回「無法完成」("unwilling to perform")錯誤。

默認:

readonly off

5.2.3.3. replica
        replica uri=ldap://<hostname>;[:<port>;] | host=<hostname>;[:<port>;]
               
                ["binddn=<DN>;"]
               
               
               
               
               

This directive specifies a replication site for this database. The uri= parameter specifies a scheme, a host and optionally a port where the slave slapd instance can be found. Either a domain name or IP address may be used for <hostname>;. If <port>; is not given, the standard LDAP port number (389 or 636) is used.

host is deprecated in favor of the uri parameter.

uri allows the replica LDAP server to be specified as an LDAP URI such as ldap://slave.example.com:389 or ldaps://slave.example.com:636.

The binddn= parameter gives the DN to bind as for updates to the slave slapd. It should be a DN which has read/write access to the slave slapd's database. It must also match the updatedn directive in the slave slapd's config file. Generally, this DN should not be the same as the rootdn of the master database. Since DNs are likely to contain embedded spaces, the entire "binddn=<DN>;" string should be enclosed in double quotes.

The bindmethod is simple or kerberos or sasl, depending on whether simple password-based authentication or Kerberos authentication or SASL authentication is to be used when connecting to the slave slapd.

Simple authentication should not be used unless adequate integrity and privacy protections are in place (e.g. TLS or IPSEC). Simple authentication requires specification of binddn and credentials parameters.

Kerberos authentication is deprecated in favor of SASL authentication mechanisms, in particular the KERBEROS_V4 and GSSAPI mechanisms. Kerberos authentication requires binddn and srvtab parameters.

SASL authentication is generally recommended. SASL authentication requires specification of a mechanism using the saslmech parameter. Depending on the mechanism, an authentication identity and/or credentials can be specified using authcid and credentials respectively. The authzid parameter may be used to specify an authorization identity.

See the chapter entitled Replication with slurpd for more information on how to use this directive.

5.2.3.4. replogfile <filename>;
This directive specifies the name of the replication log file to which slapd will log changes. The replication log is typically written by slapd and read by slurpd. Normally, this directive is only used if slurpd is being used to replicate the database. However, you can also use it to generate a transaction log, if slurpd is not running. In this case, you will need to periodically truncate the file, since it will grow indefinitely otherwise.

See the chapter entitled Replication with slurpd for more information on how to use this directive.

5.2.3.5. rootdn <DN>;

該指令指定一個不受當前資料庫的訪問控制和操作限制的的DN。<DN>;不必是一個當前資料庫或者當前目錄中的條目。<DN>;也可能一個SASL身份證(identity)。

基於條目的示例:

rootdn "cn=Manager,dc=example,dc=com"

基於SASL的示例:

rootdn "uid=root,cn=example.com,cn=digest-md5,cn=auth"

參看」SASL認證「一節獲得更多關於SASL認證身份的信息。

5.2.3.6. rootpw <password>;

該指令用來為rootdn(當rootdn被設置為資料庫中的一個條目時)設定一個密碼。

示例:

rootpw secret

將密碼設為RFC 2307中的格式也是可以的。slapdpasswd可以用來產生哈希密碼。

示例:

rootpw {SSHA}ZKKuqbEKJfKSXhUbHG3fG8MDn9j1v4QN

哈希密碼用命令slappasswd -s secret產生。

5.2.3.7. suffix <dn suffix>;

該指令指定了將傳遞給後端資料庫的請求的DN的後綴。一個資料庫可以有多個後綴,但是每個資料庫定義中至少要有一個。

示例:

suffix "dc=example,dc=com"

只有當發出的請求是以"dc=example,dc=com"為DN的後綴的時候這個請求才可以傳遞給這個後端。

-----------------------------------------------------------------------------------------------------------
注意:當請求傳遞的對象,即後端選定之後,slapd在每個資料庫定義中順序查找suffix行。因此,如果一個資料庫後綴是另一個的前綴的話,在配置文件中它必須出現在另一個之後。
Note: When the backend to pass a query to is selected, slapd looks at the suffix line(s) in each database definition in the order they appear in the file. Thus, if one database suffix is a prefix of another, it must appear after it in the config file.
-----------------------------------------------------------------------------------------------------------

5.2.3.8. syncrepl
        syncrepl rid=<replica ID>;
                provider=ldap://<hostname>;[]
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               
               

This directive specifies the current database as a replica of the master content by establishing the current slapd(8) as a replication consumer site running a syncrepl replication engine. The master database is located at the replication provider site specified by the provider parameter. The replica database is kept up-to-date with the master content using the LDAP Content Synchronization protocol. See draft-zeilenga-ldup-sync-xx.txt (a work in progress) for more information on the protocol.

The rid parameter is used for identification of the current syncrepl directive within the replication consumer server, where <replica ID>; uniquely identifies the syncrepl specification described by the current syncrepl directive. <replica ID>; is non-negative and is no more than three decimal digits in length.

The provider parameter specifies the replication provider site containing the master content as an LDAP URI. The provider parameter specifies a scheme, a host and optionally a port where the provider slapd instance can be found. Either a domain name or IP address may be used for <hostname>;. Examples are ldap://provider.example.com:389 or ldaps://192.168.1.1:636. If <port>; is not given, the standard LDAP port number (389 or 636) is used. Note that the syncrepl uses a consumer-initiated protocol, and hence its specification is located at the consumer site, whereas the replica specification is located at the provider site. syncrepl and replica directives define two independent replication mechanisms. They do not represent the replication peers of each other.

The content of the syncrepl replica is defined using a search specification as its result set. The consumer slapd will send search requests to the provider slapd according to the search specification. The search specification includes searchbase, scope, filter, attrs, attrsonly, sizelimit, and timelimit parameters as in the normal search specification. The syncrepl search specification has the same value syntax and the same default values as in the ldapsearch(1) client search tool.

The LDAP Content Synchronization protocol has two operation types: refreshOnly and refreshAndPersist. The operation type is specified by the type parameter. In the refreshOnly operation, the next synchronization search operation is periodically rescheduled at an interval time after each synchronization operation finishes. The interval is specified by the interval parameter. It is set to one day by default. In the refreshAndPersist operation, a synchronization search remains persistent in the provider slapd. Further updates to the master replica will generate searchResultEntry to the consumer slapd as the search responses to the persistent synchronization search.

The schema checking can be enforced at the LDAP Sync consumer site by turning on the schemachecking parameter. If it is turned on, every replicated entry will be checked for its schema as the entry is stored into the replica content. Every entry in the replica should contain those attributes required by the schema definition. If it is turned off, entries will be stored without checking schema conformance. The default is off.

The updatedn parameter specifies the DN in the consumer site which is allowed to make changes to the replica. This DN is used locally by the syncrepl engine when updating the replica with the entries received from the provider site by using the internal operation mechanism. The update of the replica content is subject to the access control privileges of the DN. The DN should have read/write access to the replica database. Generally, this DN should not be the same as rootdn.

The binddn parameter gives the DN to bind as for the syncrepl searches to the provider slapd. It should be a DN which has read access to the replication content in the master database.

The bindmethod is simple or sasl, depending on whether simple password-based authentication or SASL authentication is to be used when connecting to the provider slapd.

Simple authentication should not be used unless adequate integrity and privacy protections are in place (e.g. TLS or IPSEC). Simple authentication requires specification of binddn and credentials parameters.

SASL authentication is generally recommended. SASL authentication requires specification of a mechanism using the saslmech parameter. Depending on the mechanism, an authentication identity and/or credentials can be specified using authcid and credentials, respectively. The authzid parameter may be used to specify an authorization identity.

The realm parameter specifies a realm which a certain mechanisms authenticate the identity within. The secprops parameter specifies Cyrus SASL security properties.

The syncrepl replication mechanism is supported by the three native backends: back-bdb, back-hdb, and back-ldbm.

See the LDAP Sync Replication chapter of the admin guide for more information on how to use this directive.

5.2.3.9. updatedn <DN>;
This directive is only applicable in a slave slapd. It specifies the DN allowed to make changes to the replica. This may be the DN slurpd(8) binds as when making changes to the replica or the DN associated with a SASL identity.

Entry-based Example:

        updatedn "cn=Update Daemon,dc=example,dc=com"

SASL-based Example:

        updatedn "uid=slurpd,cn=example.com,cn=digest-md5,cn=auth"

See the Replication with slurpd chapter for more information on how to use this directive.

5.2.3.10. updateref <URL>;
This directive is only applicable in a slave slapd. It specifies the URL to return to clients which submit update requests upon the replica. If specified multiple times, each URL is provided.

Example:

        updateref       ldap://master.example.net

5.2.4. BDB資料庫指令

這一類指令只會作用於BDB資料庫上。也就是說,它們必須跟在一個"database bdb"行之後並且出現在任何隨後的"backend" 或者 "database"行之前。要想獲得BDB配置指令的完整參考,請參閱slapd-bdb。

5.2.4.1. directory <directory>;

該指令指定包含數據和索引的BDB文件所在的目錄。

默認:

directory /usr/local/var/openldap-data

5.2.4.2. sessionlog <sid>; <limit>;

This directive specifies a session log store in the syncrepl replication provider server which contains information on the entries that have been scoped out of the replication content identified by <sid>;. The first syncrepl search request having the same <sid>; value in the cookie establishes the session log store in the provider server. The number of the entries in the session log store is limited by <limit>;. Excessive entries are removed from the store in the FIFO order. Both <sid>; and <limit>; are non-negative integers. <sid>; has no more than three decimal digits.

The LDAP Content Synchronization operation that falls into a pre-existing session can use the session log store in order to reduce the amount of synchronization traffic. If the replica is not so outdated that it can be made up-to-date by the information in the session store, the provider slapd will send the consumer slapd the identities of the scoped-out entries together with the in-scope entries added to or modified within the replication content. If the replica status is outdated too much and beyond the coverage of the history store, then the provider slapd will send the identities of the unchanged in-scope entries along with the changed in-scope entries. The consumer slapd will then remove those entries in the replica which are not identified as present in the provider content.

5.2.5. LDBM資料庫指令

這一類指令只會作用於LDBM資料庫上。也就是說,它們必須跟在一個"database ldbm"行之後並且出現在任何隨後的"backend" 或者 "database"行之前。要想獲得LDBM配置指令的完整參考,請參閱slapd-ldbm。

5.2.5.1. cachesize <integer>;

該指令指定LDBM後端資料庫實例在緩存中維護的條目的大小。

默認:

cachesize 1000

5.2.5.2. dbcachesize <integer>;

該指令指定了與每個打開的索引文件相關聯的緩存的位元組大小。如果不被下層的資料庫方法支持的話,該指令將會不給出任何提示地被忽略。增加這個值會佔用更多的內存但是卻會帶來性能上的大幅提升,尤其是在修改或者建立索引的時候。

默認:

dbcachesize 100000

5.2.5.3. dbnolocking

這個選項,如果出現,將會禁止鎖定資料庫。啟用這個選項可能會提高性能,但付出的代價是增大了數據安全的風險。

5.2.5.4. dbnosync

這個選項作用在磁碟上。當內存中的數據發生改變之後,磁碟上的資料庫內容並不立即與之保持同步。啟用這個選項可能會提高性能,但付出的代價是增大了數據一致性上的風險。

5.2.5.5. directory <directory>;

該指令指定包含數據和索引的LDBM文件所在的目錄。

默認:

directory /usr/local/var/openldap-data

5.2.5.6. index {<attrlist>; | default}

該指令指定了為所給屬性所維護的索引。如果僅給出一個<attrlist>;,默認的索引也會被維護。

示例:

         index default pres,eq
        index uid
        index cn,sn pres,eq,sub
        index objectClass eq

The first line sets the default set of indices to maintain to present and equality. The second line causes the default (pres,eq) set of indices to be maintained for the uid attribute type. The third line causes present, equality, and substring indices to be maintained for cn and sn attribute types. The fourth line causes an equality index for the objectClass attribute type.

By default, no indices are maintained. It is generally advised that minimally an equality index upon objectClass be maintained.

        index objectClass eq

5.2.5.7. mode <integer>;

該指令指定了新近創建的資料庫索引文件所應具有的文件保護模式。

默認:

mode 0600

5.3 訪問控制

對slapd的條目和屬性的訪問是由訪問配置文件指令控制的。通用的訪問控制格式是這樣的:

        <access directive>; ::= access to <what>;
                +
        <what>; ::= * |
                =<regex>; | dn.<scope-style>;=<DN>;]
               
        <basic-style>; ::= regex | exact
        <scope-style>; ::= base | one | subtree | children
        <attrlist>; ::= <attr>; =<regex>;] | <attr>; , <attrlist>;
        <attr>; ::= <attrname>; | entry | children
        <who>; ::= * | [anonymous | users | self
                        | dn[.<basic-style>;]=<regex>; | dn.<scope-style>;=<DN>;]
               
                [.<basic-style>;]]=<regex>;]
                =<regex>;]
                =<regex>;]
                =<regex>;]
                =<regex>;]
               
               
        <access>; ::= {<level>;|<priv>;}
        <level>; ::= none | auth | compare | search | read | write
        <priv>; ::= {=|+|-}{w|r|s|c|x|0}+
        <control>; ::=

這裡的<what>;選擇條目和/或屬性並在其上應用訪問控制,<who>;則指定什麼樣的實體可以訪問條目和屬性,<access>;指定訪問級別。多個<who>; <access>; <control>;是受支持的,以允許多種實體可以有不同的訪問級別訪問相同的條目和屬性。不是所有的訪問控制選項都在這裡描述;更多信息可參見slapd.access手冊。

5.3.1. 控制對什麼的訪問(What to control access to)

<what>;決定了將要應用訪問控制的條目和屬性。條目通常通過兩種方式選定:通過DN或者通過過濾器。下面的示例通過DN選擇條目:

        to *
        to dn[.<basic-style>;]=<regex>;
        to dn.<scope-style>;=<DN>;

第一種格式用於選擇所有的條目。第二種格式用於選擇標準化的DN與所給正則表達式相匹配的條目(第二種格式不會在本文檔中深入討論)。第三種格式用語選擇在所請求的DN範圍之內的條目。<DN>;是一個標識名的字元串表示,如RFC2253中所述。

DN範圍可以是以下四種之一:base, one, subtree, 或者 children。這裡的base只與所給的DN相匹配,one只與父條目是所給DN的條目相匹配,subtree只與根為所給DN的子樹下是所有條目相匹配,而children匹配所有位於DN之下的條目(除了以DN為標識名的條目以外)。

比如,如果目錄包含以如下方式命名的條目:

        0: o=suffix
        1: cn=Manager,o=suffix
        2: ou=people,o=suffix
        3: uid=kdz,ou=people,o=suffix
        4: cn=addresses,uid=kdz,ou=people,o=suffix
        5: uid=hyc,ou=people,o=suffix

那麼:

dn.base="ou=people,o=suffix" 匹配 2;
dn.one="ou=people,o=suffix" 匹配 3, 和 5;
dn.subtree="ou=people,o=suffix" 匹配 2, 3, 4, 和 5;
dn.children="ou=people,o=suffix" 匹配 3, 4, 和 5。

條目也可以通過過濾器收集起來:

        to filter=<ldap filter>;

這裡的<ldap filter>;是LDAP搜索過濾器的一個字元串表示,如RFC2254所述。比如:

        to filter=(objectClass=person)

注意到條目可以同時通過DN和過濾器來搜集,只需要同時把兩者都包含在<what>;子句中即可:

        to dn.one="ou=people,o=suffix" filter=(objectClass=person)

條目的屬性通過在<what>;搜集器中包含用逗號分隔的屬性名列表指定:

        attrs=<attribute list>;

一個屬性的具體取值通過單個的屬性名和值選取器來指定:

        attrs=<attribute>; val[.<style>;]=<regex>;

有兩個特殊的的偽屬性entry 和 children。要讀取(也就是得到)一個條目,必須要有對目標條目的entry屬性的讀許可權。要添加或者刪除一個條目,必須要有對目標條目的entry屬性的寫許可權,並且還必須要有對條目的父條目的children屬性的寫許可權。要重命名一個條目,必須要同時擁有對目標條目的entry屬性的寫許可權,對原父條目的children屬性的寫許可權,以及對新的父條目的children屬性的寫許可權。本節末尾的完全示例將會把所有這一切將清楚的。

最後要說明一點,選取器「*」是一個特殊的條目選取器,用來選取所有的條目。在沒有其他的<what>;選取器給出的情況下它將被使用。等價於"dn=.*"。

5.3.2. 誰可以訪問(Who to grant access to)

<who>;用於確定允許進行訪問的一個或多個實體。注意訪問許可權是被授權給「實體」(entities)而非「條目」(entries)。下面的表格總結了代表實體的符號(specifier):

表 5.3: 訪問實體符號
Specifier                                  Entities  
*                                          All, including anonymous and authenticated users  
anonymous                                  Anonymous (non-authenticated) users  
users                                  Authenticated users  
self                                          User associated with target entry  
dn[.<basic-style>;]=<regex>;          Users matching a regular expression  
dn.<scope-style>;=<DN>;                  Users within scope of a DN  

此處的DN符號表現得非常像<what>;子句中的DN符號:

其他的控制因素也被支持。比如,a <who>; can be restricted by an entry listed in a DN-valued attribute in the entry to which the access applies:

        dnattr=<dn-valued attribute name>;

dnattr用來授權給一個條目,而該條目的DN是在所列的條目的屬性當中(比如,可以給一個條目組的擁有者所在的條目授權)。

一些因素可能不是在所有的環境下都是正確的。比如,域名因素依賴於域名查詢。因為這些很容易spoofed,所以域名因素不可避免。

5.3.3. 訪問許可權(The access to grant)

允許的<access>;可以是以下所列之一:

表 5.4: 訪問級別
Level          Privileges                  Description  
none                  =0                          no access  
auth                  =x                          needed to bind  
compare          =cx                          needed to compare  
search          =scx                          needed to apply search filters  
read                  =rscx                  needed to read search results  
write          =wrscx                  needed to modify/rename  

每一個級別都暗含著所有更低級別的訪問許可權被允許。所以,如果允許某人都一個條目有寫許可權也就給了他讀取,搜索,比較,驗證(auth)的許可權。然而,可以使用優先順序來批准某些特權。

5.3.4. 訪問控制評估(Access Control Evaluation)

在評估某個請求者是否具有對一個條目和/或屬性的訪問許可權時,slapd將條目和/或屬性與配置文件中的<what>;選取器進行比較。對每一個條目,資料庫級的訪問控制首先生效,跟著生效的是全局訪問控制指令。按照這樣的先後順序,訪問控制指令以它們在配置文件中出現的先後次序被檢查。slapd在碰到第一個匹配條目和/或屬性的<what>;選取器時終止。對應的訪問控制指令就是slapd將要用來評估訪問控制許可權的。

接下來,slapd把提出訪問的實體與訪問控制指令中的<who>;選取器依次比較。當它遇到第一個匹配請求實體的<who>;選取器是它將停止。這也就決定了實體能夠擁有的對條目和/或屬性的訪問許可權。

最後,slapd將訪問控制指令中的<access>;與客戶的請求許可權相比較。如果它允許大於或等於的訪問許可權,訪問就被批准。否則,訪問將被拒絕。

訪問控制指令的評估順序使它們在配置文件中的位置變得很重要。如果一個訪問控制指令就它所選的條目而言比另一個更具體,那麼它應當出現在配置文件的前面。類似地,如果一個<who>;選取器比另一個更具體,它也應該在配置文件的前面出現。下面給出的訪問控制示例將會使這一切變得更清晰。

5.3.5. 訪問控制示例(Access Control Examples)

上面所提到的訪問控制的措施是相當強大的。本節將給出一些它的使用示例。首先,舉幾個簡單的例子:

        access to * by * read

這個指令允許所有人具有讀許可權。

        access to *
                by self write
                by anonymous auth
                by * read

這條指令允許用戶修改他們自己的條目,允許匿名用戶鑒定這些條目,允許所有其他的用戶讀取這些條目。注意,僅僅第一個匹配<who>;子句的才起作用。因此,匿名用戶可以auth,而不是read。最後的子句也可以寫成"by users read"。

經常需要對不同的保護級別執行不同的受限操作。以下顯示了security strength factors (SSF)可以怎樣被使用。

        access to *
                by ssf=128 self write
                by ssf=64 anonymous auth
                by ssf=64 users read

這條指令允許用戶修改他們自己的條目,如果安全保護強度為128或者更高的話;允許匿名用戶擁有auth許可權,一般用戶擁有讀許可權,如果確定了級別為64或者更高的安全保護強度的話。如果客戶沒有確定足夠的安全保護強度的話,暗含的by * none字據將會起作用。

下面的例子顯示了通過style specifiers 在兩個訪問指令中通過DN選擇條目的用法,其中,訪問指令的順序是很重要的。

        access to dn.children="dc=example,dc=com"
                by * search
        access to dn.children="dc=com"
                by * read

所有用戶都擁有對dc=com 子樹下的條目的讀許可權,例外的是,對那些dc=example,dc=com 子樹下的條目,用戶僅僅有搜索的許可權。dc=com 是不可訪問的,因為沒有訪問指令匹配該條DN。如果這裡的指令順序顛倒了的話,那麼尾部的指令將永遠不會被用到,因為所有dc=example,dc=com 下的條目也都是dc=com 下的條目。

同時要注意到如果沒有與指令相匹配的訪問許可權或者沒有by <who>;子句的話,訪問將被拒絕。也就是說,每一個access to 指令都是以一個暗含的by * none 子句結尾的,並且每一個訪問列表都以一個暗含的access to * by * none 指令結尾。

下面的示例再一次說明了對access指令和by <who>;子句而言出現順序的重要性。它也顯示了屬性選取器和各種<who>;選取器的用法。

        access to dn.subtree="dc=example,dc=com" attr=homePhone
                by self write
                by dn.children="dc=example,dc=com" search
                by peername=IP:10\..+ read
        access to dn.subtree="dc=example,dc=com"
                by self write
                by dn.children="dc=example,dc=com" search
                by anonymous auth

本例對"dc=example,dc=com"子樹中的條目起作用。除了homePhone之外,一個條目可以寫它所有的屬性,example.com 下的條目可以被它自己搜索,其他任何人都沒有許可權訪問(暗含by * none),例外是經過認證/授權的用戶可以(總是匿名進行)。homePhone屬性對條目自身而言是可寫的,對example.com下的條目是可搜索的,對來自10網路的客戶總是可讀的,否則就是不可讀的(暗含by * none)。所有其他的訪問都將被拒絕,因為暗含有access to * by * none子句。

有時允許一個特定的DN可以從一個屬性添加或者刪除它自身是很有用的。比如,如果你想創建一個組並且允許人們從member屬性添加和刪除自己的DN,你可以通過一個訪問指令來實現這個目的:

        access to attr=member,entry
                by dnattr=member selfwrite

<who>;選取器dnattr表明訪問應用到member屬性所列的條目上。selfwrite訪問選取器表明這些成員僅僅能從屬性中添加或者刪除他們自己的DN,不能是別人的。額外的條目屬性是必須的,因為對條目的訪問要求能訪問條目的任何屬性。

5.4 配置文件示列

下面是一個配置文件示例,被文中的說明分隔問幾段。它定義了兩個資料庫對立X.500目錄信息樹的不同部分;兩個資料庫都是BDB資料庫實例。行號僅僅是為了參考,並不是包含在實際文件當中的。首先,全局的配置部分:

  1.    # example config file - global configuration section
  2.    include /usr/local/etc/schema/core.schema
  3.    referral ldap://root.openldap.org
  4.    access to * by * read

行1是註釋。行2把核心模式定義文件包含到了本配置文件當中。行3的referral指令意味著不能在本地資料庫上完成的請求將會被重定向到在root.openldap.org主機的389埠上運行的LDAP伺服器上。

行4是一個全局的訪問控制指令。它對所有的條目都起作用(在特定資料庫的訪問控制指令之後)。

配置文件的下一節定義了一個BDB後端來處理針對目錄樹中"dc=example,dc=com"部分的請求。這個資料庫將被複制到兩個從屬的slapd上,一個位於truelies,另一個位於judgmentday。其中幾個屬性的索引會被維護,並且userPassword屬性被保護起來防止未經授權的訪問。

  5.    # BDB definition for the example.com
  6.    database bdb
  7.    suffix "dc=example,dc=com"
  8.    directory /usr/local/var/openldap-data
  9.    rootdn "cn=Manager,dc=example,dc=com"
10.    rootpw secret
11.    # replication directives
12.    replogfile /usr/local/var/openldap/slapd.replog
13.    replica uri=ldap://slave1.example.com:389
14.            binddn="cn=Replicator,dc=example,dc=com"
15.            bindmethod=simple credentials=secret
16.    replica uri=ldaps://slave2.example.com:636
17.            binddn="cn=Replicator,dc=example,dc=com"
18.            bindmethod=simple credentials=secret
19.    # indexed attribute definitions
20.    index uid pres,eq
21.    index cn,sn,uid pres,eq,approx,sub
22.    index objectClass eq
23.    # database access control definitions
24.    access to attr=userPassword
25.            by self write
26.            by anonymous auth
27.            by dn.base="cn=Admin,dc=example,dc=com" write
28.            by * none
29.    access to *
30.            by self write
31.            by dn.base="cn=Admin,dc=example,dc=com" write
32.            by * read

行5是註釋。資料庫定義的開始以行6的關鍵字database為標誌。行7指定了傳給此資料庫的請求的DN的後綴。行8指定了資料庫文件所在的目錄。

行9和行10指定資料庫的超級用戶條目和相應的口令。該條目不受訪問控制,大小,時間的限制。

行11到行18是為複製操作服務。行12指定了複製的日誌文件(對資料庫的改動都由slapd登記到這裡並且被slurpd讀取)。行13到行15指定複製主機的主機名和埠號,以及在進行更新的時候要綁定到的DN,還有綁定的方式(simple)以及綁定DN的信任方式(credential,即口令password)。行16到行18指定了第二個複製站點。參看「用slurpd進行拷貝」章節以獲得更多有關該指令的信息。

行20到行22表明需要維護索引的各種屬性。

行24到行32指定對本資料庫中的條目的訪問控制。因為是第一個資料庫,這裡的控制信息也會作用到不由任何資料庫保存的條目上面(比如Root DSE)。對所有應用型的條目,userPassword屬性對條目自身和「admin」條目是可寫的。它可能用於認證/授權之類的目的,否則對其他用戶就應該不可讀。所有其他的屬性都可以被條目自身和「admin」條目所寫,但可以被所有的用戶讀(可能是通過認證的用戶也可能是沒有通過認證的用戶)。

本配置文件的下一節定義了另外一個BDB資料庫。這個資料庫處理涉及到dc=example,dc=net子樹的請求但是由相同的實體管理。注意到如果沒有行39,因為行4中定義的全局訪問策略將允許讀許可權。

33.    # BDB definition for example.net
34.    database bdb
35.    suffix "dc=example,dc=net"
36.    directory /usr/local/var/openldap-data-net
37.    rootdn "cn=Manager,dc=example,dc=com"
38.    index objectClass eq
39.    access to * by users read
《解決方案》

[翻譯]OpenLDAP管理員指南(僅前七章)

6.運行slapd

slapd被設計為以獨立的伺服器運行。這允許伺服器利用緩存,管理下層資料庫的同步,並且節約系統資源。通過inetd來運行是不行的。

6.1 命令行選項

slapd支持許多命令行選項,這些選項在操作手冊中都有詳細的描述。本節將講述一些常用的選項。

        -f <filename>;

這個選項給slapd指定了另外一個配置文件。默認的配置文件通常是/usr/local/etc/openldap/slapd.conf。

        -h <URLs>;

這個選項指定了一個替代的監聽器(listener)。默認的是ldap:///,意味著LDAP伺服器監聽所有網路介面上的來自LDAP默認埠389的TCP連接。你可以指定一個具體的主機-埠對或者其他的協議方案(比如ldaps:// 或者 ldapi://)。例如,-h "ldaps:// ldap://127.0.0.1:666"將會創建兩個監聽器:一個監聽所有網路介面上通過默認的LDAP/SSL埠636的SSL連接,另一個監聽來自本地主機(loopback)上的666埠的TCP連接。主機可以用IPv4的點分十進位形式或者主機名來指定。埠值必須是數值。

        -n <service-name>;

這個選項指定用於日誌記錄和其他目的的服務的名稱。默認的服務名是slapd.

        -l <syslog-local-user>;

這個選項指定了syslog的本地用戶。可以取LOCAL0, LOCAL1, LOCAL2, ..., 到 LOCAL7的值。默認值是LOCAL4。這個選項可能不被所有的系統所支持。

        -u user -g group

這兩個選項分別指定了運行slapd的用戶和用戶組。user可以是用戶名,也可以是uid。group可以是組名,也可以是gid。

        -r directory

這個選項指定了一個運行時目錄。slapd將會在打開監聽器並且準備讀取任何配置文件或者初始化任何後端之前chroot到這個目錄。

        -d <level>; | ?

這個選項將slapd的調試(debug)級別設為<level>;。當級別是「?」的時候,slapd將列印出全部的調試級別並終止,無論你除此之外還給出了其他什麼選項。目前的調試級別有下面的這些:

表 6.1: 調試級別
Level          Description  
-1                  enable all debugging  
0                  no debugging  
1                  trace function calls  
2                  debug packet handling  
4                  heavy trace debugging  
8                  connection management  
16                  print out packets sent and received  
32                  search filter processing  
64                  configuration file processing  
128                  access control list processing  
256                  stats log connections/operations/results  
512                  stats log entries sent  
1024                  print communication with shell backends  
2048                  print entry parsing debugging  

你可以啟用多個調試級別,通過為每個需要的級別指定一次調試選項。或者,因為調試級別是可加的,你也可以自己去做這樣的數學運算。也就是說,如果你想跟蹤函數調用並且查看正在處理的配置文件,你可以把調試級別設為這兩個級別之和(在這種情況下是,-d 65)。或者,你也可以讓slapd來做這個數學運算,(比如,-d 1 -d 64)。更多細節可諮詢<ldap_log.h>;頭文件。

-----------------------------------------------------------------------------------------------------------
注意:要得到兩種狀態級別之外的其他調試信息,必須在編譯slapd的時候指定-DLDAP_DEBUG。
-----------------------------------------------------------------------------------------------------------

6.2 啟動slapd

通常,slapd是像這樣啟動的:

        /usr/local/etc/libexec/slapd [<option>;]*

這裡的/usr/local/etc/libexec是由configure決定的,<option>;是上面所給出的選項中的一個(或者參考slapd的使用手冊)。除非你指定了一個調試級別(包括0級別也是這樣),否則slapd將fork自身並且將它自己從控制終端轉到後台運行。

6.3 停止slapd

要安全地終止slapd,你應該使用下面這樣的命令:

        kill -INT `cat /usr/local/var/slapd.pid`

這裡的/usr/local/var是由configure決定的。

其他的殺死slapd進程的方法過於激烈,可能會造成信息丟失或者資料庫崩潰。



7.資料庫創建和維護工具

本節將告訴你如何從草稿創建slapd資料庫,以及如何在遇到問題的時候解決問題。有兩種方式創建資料庫。首先,你可以使用LDAP在線創建資料庫。如果使用的是這種方式,你只需要簡單的啟動slapd並且用你的客戶端添加條目就行了。這種方式對相對比較小的資料庫是很合適的(根據你的需要,可能是幾百或者幾千條)。這種方式僅僅工作在支持更新操作的資料庫之下。

第二種創建資料庫的方式是用slapd自帶的特殊工具離線創建。這種方式最適合於當你有好幾千個條目要創建的情況,--如果你用前一種方式來創建所需要的時間無法接受,或者是因為你想確保資料庫在創建的時候不能被訪問。注意不是所有的資料庫都支持這種方式。

7.1 在LDAP上創建資料庫

使用這種方式,你可以通過你喜歡的客戶端(比如,ldapadd)來添加條目,這和你在資料庫創建好之後添加條目的操作是一樣的。你應當在啟動slapd之前確保下列選項已經在配置文件中做了設置。

        suffix <dn>;

如「通用資料庫指令」一節中所述,這個選項定義了由這個資料庫保存的條目。你應該把這個選項設置為你準備創建的目錄子樹的根DN。比如:

        suffix "dc=example,dc=com"

你應當確保指定了一個索引文件所在的目錄。

        directory <directory>;

比如:

        directory /usr/local/var/openldap-data

你需要擁有足夠的許可權創建該目錄以使slapd可以寫入它。

你需要配置slapd以便你能夠以一個有許可權添加條目的目錄用戶連接到這個伺服器上面。你可以把目錄配置成支持超級用戶或者根用戶的形式。這是通過資料庫定義中的下面兩個選項來實現的:

        rootdn <dn>;
        rootpw <passwd>;

比如:

        rootdn "cn=Manager,dc=example,dc=com"
        rootpw secret

這兩個選項指定了一個DN和口令來驗證超級用戶條目(也就是說,這個條目可以做任何事)。無論條目和口令是否在資料庫中實際存在,這裡指定的條目和口令都會起作用。這解決了「雞和蛋的問題」--也就是如果條目還不存在的話如何驗證有權添加條目的根用戶條目。

最後,你要確保資料庫定義當中包含了你想要的索引定義:

        index {<attrlist>; | default}

比如,要為cn, sn, uid 和 objectclass屬性建立索引,應當使用下面的index指令:

        index cn,sn,uid pres,eq,approx,sub
        index objectClass eq

這將為cn, sn, 和 uid屬性創建presence, equality, approximate, 和 substring索引,為objectClass屬性創建equality索引。注意到不是對任何屬性類型都有全部的索引類型可用。參看「slapd配置文件」一節可獲得有關該選項的更多信息。

一旦你已經按照你的要求完成了配置,就啟動slapd,同時用你的LDAP客戶端連接到伺服器上,開始添加條目。比如,要用ldapadd工具添加一個組織的條目和其內一個成員的條目,你可以創建一個名為entries.ldif的LDIF文件如下:

        # Organization for Example Corporation
        dn: dc=example,dc=com
        objectClass: dcObject
        objectClass: organization
        dc: example
        o: Example Corporation
        description: The Example Corporation

        # Organizational Role for Directory Manager
        dn: cn=Manager,dc=example,dc=com
        objectClass: organizationalRole
        cn: Manager
        description: Directory Manager

然後使用類似下面的命令實際創建資料庫:

        ldapadd -f entries.ldif -x -D "cn=Manager,dc=example,dc=com" -w secret

上面的這個命令假定所有的選項都是按照上面的示例進行設置的。

7.2 離線創建資料庫

第二中創建資料庫的方式是使用下面所列的slapd資料庫工具離線創建資料庫。這種方式最適合於有好幾千個條目需要創建的情況,因為如果還是按照上面所描述的方式來添加的話,花費的時間將是不可接受的。這些工具讀取slapd配置文件和一個輸入文件,這個輸入文件包含著要添加的資料庫條目的文本表示。對支持這些工具的資料庫,它們將直接生成資料庫文件(否則你就必須要用在線方式添加)。你要首先確保下面幾個重要的配置選項在配置文件的資料庫定義部分做了設置:

        suffix <dn>;

如「通用資料庫指令」一節中所述,這個選項定義了由這個資料庫保存的條目。你應該把這個選項設置為你準備創建的目錄子樹的根DN。比如:

        suffix "dc=example,dc=com"

你應當確保指定了一個索引文件所在的目錄。

        directory <directory>;

比如:

        directory /usr/local/var/openldap-data

最後,你要確保資料庫定義當中包含了你想要的索引定義:

        index {<attrlist>; | default}

比如,要為cn, sn, uid 和 objectclass屬性建立索引,應當使用下面的index指令:

        index cn,sn,uid pres,eq,approx,sub
        index objectClass eq

這將為cn, sn, 和 uid屬性創建presence, equality, approximate, 和 substring索引,為objectClass屬性創建equality索引。注意到不是對任何屬性類型都有全部的索引類型可用。參看「slapd配置文件」一節可獲得有關該選項的更多信息。

7.2.1. slapadd程序

一旦你已經按照你的要求完成了配置,你就應當運行slapadd程序創建主(primary)資料庫和相應的索引:

        slapadd -l <inputfile>; -f <slapdconfigfile>;
                [-d <debuglevel>;] [-n <integer>;|-b <suffix>;]

各項參數的意義如下:

        -l <inputfile>;

指定了LDIF輸入文件,這個文件包含了要以文本格式添加到資料庫中的條目(在」LDIF文本條目格式「一節有詳細描述)。

        -f <slapdconfigfile>;

指定了slapd的配置文件,該配置文件指明了在什麼地方創建什麼樣的索引,等等。

        -d <debuglevel>;

打開調試開關,調試級別由<debuglevel>;指定。調試級別和slapd的調試級別是一樣的。詳情請參看「運行slapd」章節的「命令行選項」小節。

        -n <databasenumber>;

一個可選的參數,用來指定修改哪一個資料庫。在配置文件中最先出現的資料庫編號為1,第二個為2,以此類推。默認情況下,會使用配置文件中的第一個資料庫。注意該選項不應該和-b選項同時使用。

        -b <suffix>;

一個可選的參數,用來指定修改哪一個資料庫。通過把所給的後綴和資料庫定義中的suffix指令匹配來決定資料庫的序號。注意該選項不應該和-n選項同時使用。

7.2.2. slapindex程序

有時候可能需要重新生成索引(比如在修改了slapd.conf之後)。這可以通過slapindex程序來完成。slapindex是這樣用的:

        slapindex -f <slapdconfigfile>;
                [-d <debuglevel>;] [-n <databasenumber>;|-b <suffix>;]

這裡的-f, -d, -n 和 -b選項和slapadd程序當中的是一樣的。slapindex在當前資料庫內容的基礎上重建所有索引。

7.2.3. slapcat程序

slapcat程序是用來將資料庫轉儲(dump)到LDIF文件中。當你想把資料庫以直觀可讀的方式進行備份或者你想離線編輯資料庫的時候,這都會是很有用的。這個是程序是像下面這樣用的:

        slapcat -l <filename>; -f <slapdconfigfile>;
                [-d <debuglevel>;] [-n <databasenumber>;|-b <suffix>;]

這裡的-n 或者 -b是用來選取slapd.conf中定義的資料庫的。對應的LDIF輸出到標準輸出上或者輸出到-l選項指定的文件中。

7.3 LDIF文本的條目格式

LDAP數據交換格式(LDIF)是用來簡單的文本格式來表示LDAP條目的。本節將給出LDIF條目格式的一個簡短描述,LDIF格式的詳細情況在ldif手冊和RFC2849技術手冊中有更詳盡的補充說明。

條目的基本格式是這樣的:

        # comment
        dn: <distinguished name>;
        <attrdesc>;: <attrvalue>;
        <attrdesc>;: <attrvalue>;

        ...

以'#'開頭的行是註釋。屬性類型可以是像cn 或者 objectClass 或者 1.2.3(與屬性類型相對應的OID)或者可以包含像cn;lang_en_US 或者 userCertificate;binary這樣的選項。

一個以單個空格或者製表符開頭的新行是接著上一行的。比如:

        dn: cn=Barbara J Jensen,dc=example,dc=
         com
        cn: Barbara J
          Jensen

等價於:

        dn: cn=Barbara J Jensen,dc=example,dc=com
        cn: Barbara J Jensen

多個屬性值可以在不同的行上指定。比如,

        cn: Barbara J Jensen
        cn: Babs Jensen

如果屬性值<attrvalue>;包含不可列印字元或者以空格,冒號(':'),,小於號('<')開頭的話,那麼屬性描述<attrdesc>;後跟的將是兩個冒號與所給值的base64編碼。比如,值" begins with a space"將會被編碼成下面這樣:

        cn:: IGJlZ2lucyB3aXRoIGEgc3BhY2U=

你也可以指定一個包含屬性值的URL。比如,下面的示例指定jpegPhoto應該來源於/path/to/file.jpeg。

        cn:< file:///path/to/file.jpeg

相同的LDIF文件中的多個條目是用空行分隔開的。這裡有一個包含三個條目的LDIF文件示例。

        # Barbara's Entry
        dn: cn=Barbara J Jensen,dc=example,dc=com
        cn: Barbara J Jensen
        cn: Babs Jensen
        objectClass: person
        sn: Jensen

        # Bjorn's Entry
        dn: cn=Bjorn J Jensen,dc=example,dc=com
        cn: Bjorn J Jensen
        cn: Bjorn Jensen
        objectClass: person
        sn: Jensen
        # Base64 encoded JPEG photo
        jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALD
         A4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQ
         ERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG

        # Jennifer's Entry
        dn: cn=Jennifer J Jensen,dc=example,dc=com
        cn: Jennifer J Jensen
        cn: Jennifer Jensen
        objectClass: person
        sn: Jensen
        # JPEG photo from file
        jpegPhoto:< file:///path/to/file.jpeg

注意到Bjorn條目中的jpegPhoto是base 64編碼而Jennifer條目中的jpegPhoto是從URL指定的位置獲取的。

-----------------------------------------------------------------------------------------------------------
注意:在LDIF文件中行末的空格是沒有被截去的。行間的多個空格也不被壓縮。如果你本意不是想讓她們出現在那兒,那就不要把它們放進去。
-----------------------------------------------------------------------------------------------------------
《解決方案》

[翻譯]OpenLDAP管理員指南(僅前七章)

厲害!!!
《解決方案》

[翻譯]OpenLDAP管理員指南(僅前七章)

這裡有完整版的
http://i18n.linux.net.cn/others/OpenLDAP2.htm
《解決方案》

[翻譯]OpenLDAP管理員指南(僅前七章)

恕在下愚鈍,不知道如何刪貼,斑竹刪掉吧。
《解決方案》

這麼好的文章為啥要刪除掉呢?
《解決方案》

dddddddddddddddd

[火星人 ] [翻譯]OpenLDAP管理員指南(僅前七章)已經有963次圍觀

http://coctec.com/docs/service/show-post-30730.html