歡迎您光臨本站 註冊首頁

openldap學習筆記(使用openldap-2.3.32)(詳細)

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

openldap學習筆記(使用openldap-2.3.32)(詳細)

本文系作者原創,轉載請保留出處:http://marion.cublog.cn
其中理解可能也有不當之處,歡迎各位指正。

第一部分:openldap介紹

一、Directory Services(目錄服務)能做什麼?

    我們知道,當區域網的規模變的越來越大時,為了方便主機管理,我們使用DHCP來實現IP地址、乙太網地址、主機名和拓撲結構等的集中管理和統一分配。同樣,如果一個區域網內有許多的其它資源時,如印表機、共享文件夾等等,為了方便的定位及查找它們,一種集中定位管理的方式或許是較好的選擇,DNS和NIS都是用來實現類似管理的方法。
   
    對於區域網內的一個用戶來講,工作等其它應用需要,我們必須憑帳號登錄主機、用帳號收發E-mail,甚至為了管理需要公司還需要維護一個電子號碼簿來存儲員工的姓名、地址、電話號碼等信息。隨著時間的增長,我們會為這些越來越多的帳號和密碼弄的頭暈腦脹。同時,如果一個員工離開,管理員就不得不翻遍所有的記錄帳號信息的文件把離職員工的信息刪除。這些將是一個繁瑣而效率低下的工作。那麼,如果能將此些帳號信息等統一到一個文件中進行管理,無疑會大大提高員工及管理員的工作效率。目錄服務(LDAP是其實現的一種)正是基於這些應用實現的。

二、什麼是LDAP?
   
    LDAP是Lightweight Directory Access Protocol的縮寫,顧名思義,它是指輕量級目錄訪問協議(這個主要是相對另一目錄訪問協議X.500而言的;LDAP略去了x.500中許多不太常用的功能,且以TCP/IP協議為基礎)。目錄服務和資料庫很類似,但又有著很大的不同之處。資料庫設計為方便讀寫,但目錄服務專門進行了讀優化的設計,因此不太適合於經常有寫操作的數據存儲。同時,LDAP只是一個協議,它沒有涉及到如何存儲這些信息,因此還需要一個後端資料庫組件來實現。這些後端可以是bdb(BerkeleyDB)、ldbm、shell和passwd等。

    LDAP目錄以樹狀的層次結構來存儲數據(這很類同於DNS),最頂層即根部稱作「基準DN」,形如"dc=mydomain,dc=org"或者"o=mydomain.org",前一種方式更為靈活也是Windows AD中使用的方式。在根目錄的下面有很多的文件和目錄,為了把這些大量的數據從邏輯上分開,LDAP像其它的目錄服務協議一樣使用OU(Organization Unit),可以用來表示公司內部機構,如部門等,也可以用來表示設備、人員等。同時OU還可以有子OU,用來表示更為細緻的分類。

    LDAP中每一條記錄都有一個唯一的區別於其它記錄的名字DN(Distinguished Name),其處在「葉子」位置的部分稱作RDN;如dn:cn=tom,ou=animals,dc=mydomain,dc=org中tom即為RDN;RDN在一個OU中必須是唯一的。

三、什麼是LDIF?

    LDIF(LDAP Interchange Format)是指存儲LDAP配置信息及目錄內容的標準文本文件格式,之所以使用文本文件來格式來存儲這些信息是為了方便讀取和修改,這也是其它大多數服務配置文件所採取的格式。LDIF文件常用來向目錄導入或更改記錄信息,這些信息需要按照LDAP中schema的格式進行組織,並會接受schema的檢查,如果不符合其要求的格式將會出現報錯信息。LDIF文件樣例如下:

#LDIF file example
dn: dc=mydomain,dc=org
objectClass: domain
dc: mydomain

    其中,以「#」號開頭的為註釋行;第二行起的行中,冒號左邊為屬性,右邊是屬性的值,這類同於編程中的變數及為其所賦的值,但屬性可以被重複賦值。

四、objectClass

    LDAP中,一條記錄必須包含一個objectClass屬性,且其需要賦予至少一個值。每一個值將用作一條LDAP記錄進行數據存儲的模板;模板中包含了一條記錄中數個必須被賦值的屬性和一系列可選的屬性。如上述LDIF文件中的記錄所示,objectClass的值為domain。

    objectClass有著嚴格的等級之分,最頂層的類是top和alias。例如,organizationalPerson這個objectClass隸屬於Person,而Person又是top的子類。

    objectClass大致分為三類:結構型的(如:person和organizationUnit)、輔助型的(如:extensibeObject)和抽象型的(這類不能直接使用)。官方定義的objectClass,如下所示:

alias
applicationEntity
dSA
applicationProcess
bootableDevice
certificationAuthority
certificationAuthority-V2
country
cRLDistributionPoint
dcObject
device
dmd
domain
domainNameForm
extensibleObject
groupOfNames
groupOfUniqueNames
ieee802Device
ipHost
ipNetwork
ipProtocol
ipService
locality
dcLocalityNameForm
nisMap
nisNetgroup
nisObject
oncRpc
organization
dcOrganizationNameForm
organizationalRole
organizationalUnit
dcOrganizationalUnitNameForm
person
organizationalPerson
inetOrgPerson
uidOrganizationalPersonNameForm
residentialPerson
posixAccount
posixGroup
shadowAccount
strongAuthenticationUser
uidObject
userSecurityInformation

五、Attribute介紹

    如上文所述,Attribute類同於編程語言中的變數,它可以被賦值,就像是可以存放一個單一類型信息的容器。官方聲明了許多常用的Attribute,如果其中沒有你所需要的,你可以自己定義,但要避免重名。objectClass是一種特殊的Attribute,它包含其它用到的Attribute以及它自身。常見的Attribute如:givenName、l、objectClass、dc、ou、cn、c、mail、telephoneNumber、sn、uid等。分別介紹如下:

c:國家;
cn:common name,指一個對象的名字;如果指人,需要使用其全名;
dc:domain Component,經常用來指一個域名的一部分,如:dc=mydomain,dc=org;
givenName:指一個人的名字,不能用來指姓或者middle name;
l:指一個地名,如一個城市或者其它地理區域的名字;
mail:電子信箱地址
o:organizationName,指一個組織的名字;
objectClass:一個LDAP server要想啟用必須能夠識別每一個對象的Attribute,objectClass Attribute正是用來描述一個對象應該具有的Attribute及可選Attribute。因此,每個objectClass「模板」的Attribute中必然含有一條objectClass Attribute,我不知道用「自包含」稱呼這個算不算合適。
ou:organizationalUnitName,指一個組織單元的名字。
sn:surname,指一個人的姓;
telephoneNumber:電話號碼,應該帶有所在的國家的代碼;
uid:userid,通常指一個人的登錄名,這個不同於Linux系統中用戶的uid;

    如果可以這樣類比的話,我想,我們不妨把objectClass理解為關係資料庫的表,而attribute則類同為表中的欄位。而下面即可介紹的schema或許可以類比作一個資料庫,但它的這個類比或許從邏輯上說更合適些。

六、什麼是schema

        好了,現在可以說說到底什麼是schema了。LDAP中,schema用來指定一個目錄中所包含的objects的類型(objectClass)以及每一個objectClass中的各個必備(mandatory)和可選(optional)的屬性(attribute)。因此,Schema是一個數據模型,它被用來決定數據怎樣被存儲,被跟蹤的數據的是什麼類型,存儲在不同的Entry下的數據之間的關係。schema需要在主配置文件slapd.conf中指定,以用來決定本目錄中使用到的objectClass。管理員可以自己設計制定schema,一般包括屬性定義(AttributeDefinition)、類定義(ClassDefinition)以及語法定義(SyntaxDefinition)等部分。  

    LDAP V3中在x.500標準的基礎上定義了一個包含了網路中大多常見對象的schema,這些對象包括國家、所在地、組織、人員、小組以及設備等。同時,LDAP V3中可以很方便的從目錄中提取出schema,它正是一條記錄中關於屬性的聲明部分。

七、對象標識符(Object Identifiers)

     對象標識符(OID)是被LDAP內部資料庫引用的數字標識。Attribute的名字是設計為方便人們讀取的,但為了方便計算機的處理,通常使用一組數字來標識這些對象,這類同於SNMP中的MIB2。例如,當計算機接收到dc這個Attribute時,它會將這個名字轉換為對應的OID:1.3.6.1.4.1.1466.115.121.1.26。


八、使用LDAP做身份驗正

    驗正主要是用來確定一次會主中客戶端用戶所具有的權利,即用來確立用戶能否登錄以及登錄具有使用哪些資源以及如何使用資源的許可權。驗正過程中的修改、查詢等操作由認證級別來控制。

    objectClass中的person可以用來作linux系統中用戶登入的身份驗正,此時需要指定userPassword屬性的值,即指定用戶登入時使用的密碼。密碼可以使用的加密方式有MD5、CRYPT、SHA、SSHA等。在LDAP V3中,驗正客戶端時可以使用的驗正機制有匿名驗正、簡單驗正、基於SSL/TLS的驗正和基於SASL的驗正等四種方式。

第二部分:安裝配置Openldap-2.3.32

    目前有許多種軟體可以實現LDAP,如Windows AD,Openldap等。我們要實現的是在RedHat9.0上安裝Openldap來實現其應用。

    為了讓openldap支持ssl/tls和sasl,我們這次的安裝將首先安裝openssl0.98e和cyrus-sasl-2.0.22這兩個軟體包。

一、安裝openssl0.98e

1.1 下載相關軟體包至/usr/local/src目錄

http://www.openssl.org/source/openssl-0.9.8e.tar.gz

1.2 安裝openssl

#cd /usr/local/src
#tar zxvf openssl-0.9.8e.tar.gz
#cd openssl-0.9.8e
#./config shared zlib
#make
#make test
#make install
mv /usr/bin/openssl /usr/bin/openssl.OFF
mv /usr/include/openssl /usr/include/openssl.OFF
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl

1.3 配置庫文件搜索路徑

#echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
#ldconfig -v

1.4 查看openssl的版本號,以驗正是否安裝正確

#openssl version -a
OpenSSL 0.9.8e 17 Apr 2007
built on: Sat Mar 24 21:24:41 CST 2007
platform: linux-elf
options:  bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) idea(int) blowfish(idx)
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DSHA1_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM
OPENSSLDIR: "/usr/local/ssl"


二、安裝cyrus-sasl-2.0.22

2.1 下載cyrus-sasl-2.1.22到/usr/local/src
http://ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-2.1.22.tar.gz

2.2 編譯安裝

#tar zxvf cyrus-sasl-2.1.22.tar.gz
#cd  cyrus-sasl-2.1.22
# ./configure --prefix=/usr/local/sasl2 --enable-login --with-openssl=/usr/local/ssl
#make
#make install

2.3配置庫文件搜索路徑

#echo "/usr/local/sasl2/lib" >> /etc/ld.so.conf
#echo "/usr/local/sasl2/lib/sasl2" >> /etc/ld.so.conf
#ldconfig -v

2.4 把Redhat9.0原有的sasl庫文件改名或刪除,並將相關符號鏈接指向新安裝SASL的庫文件

#cd /usr/lib
# mv libsasl2.a libsasl2.a.OFF
# mv libsasl2.la libsasl2.la.OFF
# mv libsasl2.so libsasl2.so.OFF
# mv libsasl2.so.2.0.10 libsasl2.so.2.0.10.OFF
# mv lIbsasl2.so.2 libsasl2.so.2.OFF

# ln -s /usr/local/sasl2/lib/* /usr/lib
# ln -s /usr/local/sasl2/lib/sasl2 /usr/lib/sasl2

#ln -s /usr/local/sasl2/lib/libsasl2.so.2.0.22 /usr/lib/libsasl2.so.2
#ln -s /usr/local/sasl2/lib/libsasl2.so /usr/lib/libsasl2.so

2.5 創建運行時需要的目錄並調試啟動

#mkdir -pv /var/state/saslauthd      

# ./saslauthd -a pam shadow -d
saslauthd :main            : num_procs  : 5
saslauthd :main            : mech_option: NULL
saslauthd :main            : run_path   : /var/state/saslauthd
saslauthd :main            : auth_mech  : pam
saslauthd :ipc_init        : using accept lock file: /var/state/saslauthd/mux.accept
saslauthd :detach_tty      : master pid is: 0
saslauthd :ipc_init        : listening on socket: /var/state/saslauthd/mux
saslauthd :main            : using process model
saslauthd :get_accept_lock : acquired accept lock     (此處使用"ctrl+c"退出)
saslauthd :have_baby       : forked child: 3534
saslauthd :have_baby       : forked child: 3535
saslauthd :have_baby       : forked child: 3536
saslauthd :have_baby       : forked child: 3537

2.6 啟動並測試驗正

#/usr/local/sasl2/sbin/saslauthd -a pam shadow

#/usr/local/sasl2/sbin/testsaslauthd -u root -p root的密碼
0: OK "Success."

三、安裝BerkeleyDB

3.1 下載相關軟體至/usr/local/src

http://www.oracle.com/technology/software/products/berkeley-db/htdocs/popup/db/4.5.20/db-targz.html

3.2 編譯安裝

#tar zxvf db-4.5.20.tar.gz
#cd db-4.5.20/build_unix
#../dist/configure --prefix=/usr/local/BerkeleyDB
#make
#make install

四、安裝openldap-2.3.32

4.1 下載相關軟體至/usr/local/src

http://www.openldap.org/software/download/OpenLDAP/openldap-stable/openldap-stable-20070110.tgz

4.2 編譯安裝

#tar zxvf openldap-stable-20070110.tgz
#cd openldap-2.3.32
#env CPPFLAGS="-I/usr/local/BerkeleyDB/include -I/usr/local/sasl2/include" LDFLAGS="-L/usr/local/BerkeleyDB/lib -L/usr/local/sasl2/lib -L/usr/local/sasl2/lib/sasl2"  ./configure --prefix=/usr/local/openldap --sysconfdir=/etc/openldap --enable-passwd --enable-wrappers --disable-ipv6 --enable-spasswd --enable-crypt --enable-modules  --enable-accesslog=yes
#make depend
#make
#make test
#make install
#cp /usr/local/openldap/var/openldap-data/DB_CONFIG.example /usr/local/openldap/var/openldap-data/DB_CONFIG

4.3 測試啟動

# /usr/local/openldap/libexec/slapd -d 256
@(#) $OpenLDAP: slapd 2.3.32 (Apr 17 2007 00:44:16) $
        root@localhost.localdomain:/usr/local/src/openldap-2.3.32/servers/slapd
Expect poor performance for suffix dc=my-domain,dc=com.
slapd starting

4.4 啟動及關閉服務

啟動
#/usr/local/openldap/libexec/slapd

查看監聽的埠
# netstat -tunlp |grep :389
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      10111/slapd

查看能否正常查詢
# /usr/local/openldap/bin/ldapsearch -x -b '' -s base '(objectclass=*)' (此行為命令,以下為結果)
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectclass=*)
# requesting: ALL
#

#
dn:
objectClass: top
objectClass: OpenLDAProotDSE

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1


關閉
#kill -INT `cat /usr/local/openldap/var/run/slapd.pid`


五、主配置文件slapd.conf介紹

安全起見,slapd.conf文件應該只讓運行此進程的用戶可讀寫。下面是安裝完畢后的一個slapd.conf示例。

#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include         /etc/openldap/openldap/schema/core.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral       ldap://root.openldap.org

pidfile         /usr/local/openldap/var/run/slapd.pid
argsfile        /usr/local/openldap/var/run/slapd.args

# Load dynamic backend modules:
# modulepath    /usr/local/openldap/libexec/openldap
# moduleload    back_bdb.la
# moduleload    back_ldap.la
# moduleload    back_ldbm.la
# moduleload    back_passwd.la
# moduleload    back_shell.la

# Sample security restrictions
#       Require integrity protection (prevent hijacking)
#       Require 112-bit (3DES or better) encryption for updates
#       Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64

# Sample access control policy:
#       Root DSE: allow anyone to read it
#       Subschema (sub)entry DSE: allow anyone to read it
#       Other DSEs:
#               Allow self write access
#               Allow authenticated users read access
#               Allow anonymous users to authenticate
#       Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
#       by self write
#       by users read
#       by anonymous auth
#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn.  (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!

#############################################################
# BDB database definitions
#############################################################

database        bdb
suffix          "dc=my-domain,dc=org"
rootdn          "cn=Manager,dc=mydomain,dc=org"
# Cleartext passwords, especially for the rootdn, should
# be avoid.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw          secret
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 reorgmended.
directory       /usr/local/openldap/var/openldap-data
# Indices to maintain

index   objectClass     eq

接下來我們對上述部分進行一些介紹:

include         /etc/openldap/openldap/schema/core.schema

此句是用來將目錄所用到的schema文件包含進來;openldap一般默認帶有幾個schema,在我們的配置文件安裝目錄下的schema目錄中存放。本句中的core.schema是LDAP V3中必須的,它給出了LDAP V3中最基本的attribute和objects的定義。其它的還有:corba.schema、dyngroup.schema、java.schema  nis.schema、openldap.schema、cosine.schema、inetorgperson.schema、misc.schema、ppolicy.schema


pidfile         /usr/local/openldap/var/run/slapd.pid

此句用來定義slapd進程運行時的pid文件,需要使用絕對路徑。

argsfile        /usr/local/openldap/var/run/slapd.args

此句用來定義包含當前正在運行的slapd進程所用到的命令行參數的文件,需要使用絕對路徑。

# Load dynamic backend modules:
# modulepath    /usr/local/openldap/libexec/openldap
# moduleload    back_bdb.la
# moduleload    back_ldap.la
# moduleload    back_ldbm.la
# moduleload    back_passwd.la
# moduleload    back_shell.la

以上用來指定動態載入的後端模塊。

# Sample security restrictions
#       Require integrity protection (prevent hijacking)
#       Require 112-bit (3DES or better) encryption for updates
#       Require 63-bit encryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64

以上是安全相關的聲明語句。常用到的參數有五類,除了Require和security外還有Allow、Disallow和password-hash等。
Require參數用來使管理員指定訪問目錄時必須遵循的規則和條件;這種指定可以是全局的,也可以僅用來限制對某個後端資料庫的訪問限制。
security參數用來讓管理員指定加強安全性的一般規則。

# Sample access control policy:
#       Root DSE: allow anyone to read it
#       Subschema (sub)entry DSE: allow anyone to read it
#       Other DSEs:
#               Allow self write access
#               Allow authenticated users read access
#               Allow anonymous users to authenticate
#       Directives needed to implement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
#       by self write
#       by users read
#       by anonymous auth
#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn.  (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!

以上主要是用來定義訪問控制列表。

#######################################################################
# BDB database definitions
#######################################################################

database        bdb

定義使用的後端數據存儲方式。其後可以跟的值有bdb、ldbm、passwd、config、dnssrv、ldif、perl、hdb和shell等。bdb指使用Berkley DB 4資料庫。

suffix          "dc=my-domain,dc=org"

定義suffix,以上部分可以改作你的域名中相關的部分,如"dc=example,dc=com"。

rootdn          "cn=Manager,dc=mydomain,dc=org"

定義此目錄的超級管理員帳號,類同於系統中的root。由於訪問控制對此用戶是不生效的,因此存在很大的安全隱患。建議安裝配置及調試完成以後移除此帳號。

rootpw          secret

定義超級管理員帳號的密碼,這裡使用的是明文存儲(secret即是其密碼)的方式。這是極不安全的,建議使用加密方式存儲,可以使用的加密方式有:CRYPT、MD5、SMD5、SHA和SSHA。產生加密密碼散列的方法是使用slappasswd命令,用-h選項指明加密時使用的方式。示例如下:
# /usr/local/openldap/sbin/slappasswd -h {SSHA}
New password:
Re-enter new password:
{SSHA}k2H1GPM/95VfgsKg2jZv9hV+2GCH04hC


directory       /usr/local/openldap/var/openldap-data

這一句用來指定目錄相關數據的存放位置。此目錄最好只能由運行slapd進程的用戶所有,推薦許可權為700

index   objectClass     eq

此句用來指定slapd索引時用到的attribute,eq指索引時的匹配規則。主要是用來優化查詢的。常用到的匹配規則有:approx(模糊匹配,approximate)、eq(精確匹配,equality)、pres(現值匹配,若某記錄的此attribute沒有值則不進行匹配,presence)和sub (子串匹配,substring)。

[ 本帖最後由 marion 於 2007-4-20 15:42 編輯 ]
《解決方案》

六、具體應用的實現:建立起始目錄項,並導入數據

6.1 先建立一個創建起始結點所用的ldif文件

#vi init.ldif

輸入以下內容(可以根據自己的需要修改)
dn: dc=mydomain,dc=org  #定義根結點
objectClass: top
objectClass: domain
objectClass: organization
dc: mydomain
o: mydomain.org
description:  Mydomain.org ldap


dn: cn=Manager,dc=mydomain,dc=org    #定義目錄管理員
objectClass: organizationalRole
cn: Manager
description: Directory Manager

dn: ou=people,dc=mydomain,dc=org  #定義一個OU
ou: people
objectClass: organizationalUnit

注意:ldif文件中,每一行中冒號後有一個空格,行尾一定不能有空格。切記!

6.2使用離線import命令導入到目錄中,需要離線進行(要先關閉slapd進程)

#kill -INT `cat /usr/local/openldap/var/run/slapd.pid`
# /usr/local/openldap/sbin/slapadd -v -l ./init.ldif
bdb_db_open: Warning - No DB_CONFIG file found in directory /var/openldap/data-3: (2)
Expect poor performance for suffix dc=mydomain,dc=org.
added: "dc=mydomain,dc=org" (00000001)
added: "ou=people,dc=mydomain,dc=org" (00000002)

命令中:
-v選項表示啟用verbose模式,即輸出執行中的具體信息;
-l表示後面附加ldif文件。
其它常用的選項還有:
-d  指定debug向日誌文件輸出信息,後面跟日誌級別
-f  指定要讀取的配置文件

6.3 啟動服務進程

#/usr/local/openldap/libexec/slapd

6.4 建立要導入的具體信息記錄的ldif文件

#vi users.ldif

dn: cn=Tom Black,ou=people,dc=mydomain,dc=org   定義人員1
cn: Tom Black
sn: Black
mail: tom@126.com
telephoneNumber: 371-6338-3522
objectClass: inetOrgPerson

dn: cn=Jerry Smith,ou=people,dc=mydomain,dc=org    定義人員2
cn: Jerry Smith
sn: Smith
mail: jerry@sina.com
telephoneNumber: 371-6338-3521
objectClass: inetOrgPerson

6.5 導入ldif文件

# /usr/local/openldap/bin/ldapadd -D "cn=Manager,dc=mydomain,dc=org" -W -x  -f users.ldif
Enter LDAP Password:
adding new entry "cn=Tom Black,ou=people,dc=mydomain,dc=org"

adding new entry "cn=Jerry Smith,ou=people,dc=mydomain,dc=org"

命令中:
-D選項表示指定綁定到LDAP的DN;
-W表示提示用戶輸入密碼;
-x表示使用簡單身份驗正方式,默認的是使用sasl進行驗正;
-f用來指定ldif文件;

七、配置文件中的高級功能使用方法

1. 開啟日誌功能

啟用日誌功能,需要在編譯時指定--enable-debug 選項,默認是允許的。要打開slapd的日誌功能,需要在slapd.conf中的全局配置段添加loglevel指令,並後跟一個十進位數字錶示的日誌級別,如下所示:

# Added logging parameters
loglevel     256

其日誌級別如下所示:

-1        記錄所有的信息
0        不記錄debug
1        跟蹤功能調用的信息
2        包處理的debug信息
4        豐富的debug信息
8        連接管理信息
16        包的收發信息
32        搜索過濾的處理過程
64        配置文件的處理過程
128        訪問控制列表處理過程
256        連接、操作及其結果的統計數據
512        向客戶端返回的結果的統計信息
1024        與shell後端的通信信息
2048        顯示記錄條目的分析信息
4096        資料庫緩存處理信息
8192        資料庫索引
16384        從伺服器數據同步資源消耗處理信息

若要記錄所有的debug日誌,可以使用LOG_LEVEL4 syslogd系統日誌來記錄,這需要在slapd.conf中添加如下語句實現:

local4.debug        /var/log/slapd.log

2. 為BDB後端資料庫實例指定在內存中的緩存空間大小

在如下句子后
DBDirectory:        /usr/local/openldap/var/openldap-data
后添加:
DBCachesize: 2000

3. 訪問控制列表:

3.1 語法

access to <what>+

其中,access to指示啟用訪問控制,上句大致可以理解為:
access to <對什麼目標進行控制>+


3.2 剖析

3.2.1 控制目標<what>

這一域主要是實現對ACL應用對象的指定,對象可以是記錄和屬性。選擇ACL目標記錄的方法一般有兩種:DN和filter,語法為:

<what> ::= * |
                =<regex> | dn.<scope-style>=<DN>]
               
3.2.1.1 指定所有的記錄

access to *

3.2.1.2 通過DN指定

語法如下:

to dn[.<basic-style>]=<regex>
<basic-style> ::= regex | exact
        
to dn.<scope-style>=<DN>
<scope-style> ::= base | one | subtree | children

第一種方法是使用正則表達式(dn.regex)或精確匹配(dn.style)的方式來匹配符合條件的記錄(這個好像不像想象的那麼簡單,實現起來頗為費腦筋),例如:

access to dn="^.*,uid=([^,]+),ou=users,(.*)$"


第二種方法通過「區域」選擇的方法進行目標記錄的選取,對以指定的DN開始的目錄樹區域進行目標記錄匹配。匹配區域的方式共有四種:
base                只匹配DN本身一條記錄
one                匹配以給定DN為父目錄的所有記錄
subtree                匹配以給定DN為根目錄的所有子樹內的記錄
children        匹配給定DN下的所有記錄,但應該不包括以DN直接命名的那條記錄(參見例子的解釋)

例如:對於

0: dc=mydomain,dc=org
1: cn=root,dc=mydomain,dc=org
2: ou=users,dc=mydomain,dc=org
3: uid=samba,ou=users,dc=mydomain,dc=org
4: cn=Administator,uid=samba,ou=users,dc=mydomain,dc=org
5: uid=guest,ou=users,dc=mydomain,dc=org

規則 dn.base="ou=users,dc=mydomain,dc=org" 只會匹配記錄2
規則 dn.one="ou=users,dc=mydomain,dc=org" 匹配記錄3和記錄5,記錄4是記錄3的子目錄,故不算在內
規則 dn.subtree="ou=users,dc=mydomain,dc=org" 匹配記錄2、3、4、5
規則 dn.children="ou=users,dc=mydomain,dc=org" 匹配記錄3、4、5,因為記錄0、1和2都是以DN直接命名的,故不匹配

3.2.1.3 通過filter匹配記錄

通過filter指定過濾規則進行記錄過慮,語法如下:

access to filter=<ldap filter>

其中filter指定的為search的過濾規則,這類同於linux系統中grep的匹配方式。如:

access to filter=(objectClass=sambaSamAccount)

也可以結合使用DN和filter進行記錄的匹配,例如:

access to dn.subtree="ou=users,dc=mydomain,dc=org" filter=(objectClass=posixAccount)

3.2.1.4 通過attrs選取匹配記錄

語法:
attrs=<attribute list>

例如:
access to attrs=uid,uidNumber,gidNumber

也可以結合使用DN和attrs進行記錄的匹配,例如:
access to dn.subtree="ou=users,dc=mydomain,dc=org" attrs=uid

3.2.2 被用來授權的訪問者<who>的指定

指定被授權的用戶範圍的方法大致有以下幾種:
*                        所有的訪問者,包括匿名的用戶
anonymous                非認證的匿名用戶
users                        認證的用戶
self                        目標記錄的用戶自身
dn[.<basic-style>]=<regex>        在指定目錄內匹配正則表達式的用戶
dn.<scope-style>=<DN>                指定DN內的用戶

例如:
by dn.subtree="ou=users,dc=domain,dc=org"="^samba*"

3.2.3 被授予的許可權<access>

當選取好ACL作用的目標記錄並選取好用戶範圍后,就該給這些用戶授予他們應該得到的許可權了。大致的許可權(由低到高)有以下幾類:
none        無許可權,即拒絕訪問
auth        訪問bind(認證)設置的許可權;前提是需要用戶提交一個DN形式的用戶名並能通過認證
compare        比較屬性的許可權;(例如:對照查看某用戶的telephoneNumber值是不是158 8888 8888),但並不具有搜索的許可權
search        利用過慮條件進行搜索的許可權,但這並不一定具有可讀取搜索結果的許可權
read        讀取搜索結果的許可權
write        更改記錄屬性值的許可權

可以在slapd.conf文件中通過defaultaccess指定默認的許可權級別,如:
defaultaccess        search

3.2.4 採取什麼樣的匹配控制動作<control>

在進行記錄的匹配時,如果有多條規則存在,那麼在第一次匹配產生后是否還進行後續的匹配或採取其它的動作將取決於此項的設置;控制方式共有以下三種:

stop                這個是默認值,這表示在一次匹配產生后將不再進行下一個匹配,所有後續的匹配將會停止。
continue        無論匹配是否已經發生,繼續進行直到所有的規則全部進行完匹配檢查
break                一個匹配發生后,跳出當前的子句進行后一個子句的檢查

3.2.5 一個例子

access to dn.chilren="ou=users,dc=mydomain,dc=org"
    attrs=userPassword  #指定「密碼」屬性
    by self write       #用戶自己可更改
    by * auth           #所有訪問者需要通過認證
    by dn.children="ou=admins,dc=mydomain,dc=org" write  #管理員組的用戶可更改

待續……

[ 本帖最後由 marion 於 2007-4-21 21:19 編輯 ]
《解決方案》

寫得不錯!思路很清晰,樓主一定花了不少時間。
《解決方案》

有沒有考慮過將openldap跟一些應用服務進行整合?
例如samba和pure-ftpd等,我更關注這個。
《解決方案》

謝謝你的肯定,但還有很多的不足之處,正在完善中!
整合方面的正在做,以後會陸續發出,歡迎關注!
《解決方案》

不錯,好東西
《解決方案》

原帖由 brucewoo 於 2007-4-18 14:53 發表
不錯,好東西
謝謝!

剛又在2樓補充了日誌及訪問控制列表的使用,歡迎關注。
《解決方案》

寫的非常好!希望摟主能不斷完善和補充整個內容,我會置頂此貼,讓更多的人看到。
《解決方案》

謝謝版主的「置頂」鼓勵,原與正在使用以及即將使用openldap的各位朋友一同前進!
《解決方案》

關注,收藏,支持!!!

[火星人 ] openldap學習筆記(使用openldap-2.3.32)(詳細)已經有768次圍觀

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