当前位置: 首页 > 图文教程 > 服务器 > Linux服务器 > ldap大容量邮件系统数据库应用指南

Linux服务器
Linux上双网卡绑定方法(Suse9SP3)
Linux操作系统调优参数的意义
Linux下使用SSH客户端及其Sftp文件传送
教你恢复被误删除的Linux文件
SQL Server注入大全及防御
Linux无法解析域名的解决办法
Linux系统下安装和配置MyEclipse的方法
Ubuntu下VirtualBox 1.4.0设置文件共享
Windows与Linux系统共享StarDict字典文件
修改Linux下相关的登陆信息
Windows通过SecureCRT远程登录Linux主机
Linux操作系统如何修改SWAP交换区的大小
Linux操作系统下为Apache目录添加密码
Linux时间设置与同步(NTP)
Linux内核补丁AMD旁路转换缓冲(TLB)错误
Linux架设DHCP服务器的方法
Fedora 8下Apache配置与管理
Linux操作系统下用单网卡捆绑双IP的方法
Ubuntu Linux系统环境变量配置文件
SUSE Linux中将Tomcat作为Service运行

Linux服务器 中的 ldap大容量邮件系统数据库应用指南


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-18   浏览: 50 ::
收藏到网摘: n/a

如今网上的ldap的文档,多半是相互抄袭的,千篇一律。其实ldap主要应用在大容量邮件系统上。几乎所有的文档对这个问题避而不谈,总是在地址簿上兜圈子,可恶!

ldap其实就是一个数据库,不是数据库怎么存放资料呢?不过跟我们平常的关系数据库有所不同。关系数据库是有一张一张的二维表格来存放数据的。ldap类似我们的dns系统,是树状的。用节点来存放数据。当然一个树枝可以有n个节点,每个节点上存放的数据,都是以key=>value的形式。就像我们的dns系统。.是根,下面是com,org,net,cn等等一些树枝,这些树枝下面还有abc.com,bcd.com等等树枝。在每个树枝下面都可以放节点,其实就是域名下面的主机:www,ftp,mail等等。所有的这些内容,组成了一个dns树,在ldap里面叫数据库。这下应该很形象了吧。

下面说说我的ldap的实现。我主要用ldap来存放邮件系统里面的用户信息,包括username,clearpw,maildir,等一些,这样postfix在投递邮件的过程中可以通过检索ldap来知道把邮件投递到硬盘的什么位置。
先去把berkeley-DB的源代码拉过来(http://www.sleepycat.com/),我的是4.1.25,openldap需要这东西,这东西其实也没什么不好的,所以我就把它装到/usr下去了。
#tarzxvfdb-4.1.25.tar.gz
#cddb-4.1.25
#cddist
#./configure--prefix=/usr
#make
#makeinstall

然后就可以开始安装openldap了,我用的是2.1.22,原码是从
http://www.openldap.org/上拉的。
#tarzxvfopenldap-2.1.22.tgz
#cdopenldap-2.1.22
#./configure--prefix=/usr/local/openldap
#makedepend
#make
#maketest
#makeinstall

这部分安装应该没什么问题,有问题的话就去看看网上的文档,虽然说不到重点,这方面说的还算详细。接下来就是配置。


schema

schema类似关系数据库的字段说明,包括字段名,数据类型,数据长度等等。系统有一些默认的schema,我的默认schema文件在/usr/local/openldap/etc/openldap/schema下面,最重要的是core.schema。它定义了一些最基本的字段。

为了适应我们的应用,我们要创建自己的schema文件。我创建的shema文件如下:(文件名:kunmail.schema)

#
#kunmail-ldapv3directoryschema
#
#[email protected]
#
#AttributeTypeDefinitions

attributetype(1.3.6.1.4.1.7914.1.2.1.1NAME'username'
DESC'nameoftheuseronthemailsystem'
EQUALITYcaseIgnoreIA5Match
SYNTAX1.3.6.1.4.1.1466.115.121.1.26
SINGLE-value)

attributetype(1.3.6.1.4.1.7914.1.2.1.2NAME'vuid'
DESC'UIDoftheuseronthemailsystem'
EQUALITYintegerMatch
SYNTAX1.3.6.1.4.1.1466.115.121.1.27
SINGLE-value)

attributetype(1.3.6.1.4.1.7914.1.2.1.3NAME'vgid'
DESC'GIDoftheuseronthemailsystem'
EQUALITYintegerMatch
SYNTAX1.3.6.1.4.1.1466.115.121.1.27
SINGLE-value)

attributetype(1.3.6.1.4.1.7914.1.2.1.4NAME'maildir'
DESC'Pathtothemaildir/mboxonthemailsystem'
EQUALITYcaseExactMatch
SYNTAX1.3.6.1.4.1.1466.115.121.1.15
SINGLE-value)

attributetype(1.3.6.1.4.1.7914.1.2.1.5NAME'forwardAddr'
SUBSTRcaseIgnoreSubstringsMatch
DESC'Forwardmailaddress'
EQUALITYcaseIgnoreIA5Match
SYNTAX1.3.6.1.4.1.1466.115.121.1.26)

attributetype(1.3.6.1.4.1.7914.1.2.1.6NAME'quota'
DESC'Theamountofspacetheusercanuseuntilallfurthermessagesgetbounced.'
SYNTAX1.3.6.1.4.1.1466.115.121.1.44
SINGLE-value)

attributetype(1.3.6.1.4.1.7914.1.2.1.7NAME'storeHost'
DESC'Onwhichkunmailserverthemessagestoreofthisuserislocated.'
EQUALITYcaseIgnoreIA5Match
SYNTAX1.3.6.1.4.1.1466.115.121.1.26
SINGLE-value)

attributetype(1.3.6.1.4.1.7914.1.2.1.8NAME'delivery'
DESC'Programtoexecuteforallincomingmails.'
SYNTAX1.3.6.1.4.1.1466.115.121.1.15
SINGLE-value)

attributetype(1.3.6.1.4.1.7914.1.2.1.9NAME'clearpw'
DESC'nameoftheuseronthemailsystem'
EQUALITYcaseIgnoreIA5Match
SYNTAX1.3.6.1.4.1.1466.115.121.1.26
SINGLE-value)

attributetype(1.3.6.1.4.1.7914.1.2.1.10NAME'home'
DESC'Programtoexecuteforallincomingmails.'
SYNTAX1.3.6.1.4.1.1466.115.121.1.15
SINGLE-value)

attributetype(1.3.6.1.4.1.7914.1.2.1.11NAME'mailReplyText'
DESC'Areplytextforeveryincomingmessage'
SUBSTRcaseIgnoreSubstringsMatch
SYNTAX1.3.6.1.4.1.1466.115.121.1.44{4096}
SINGLE-value)

attributetype(1.3.6.1.4.1.7914.1.2.1.12NAME'active'
DESC'Thestatusofauseraccount:active,nopop,disabled'
EQUALITYintegerMatch
SYNTAX1.3.6.1.4.1.1466.115.121.1.27
SINGLE-value)

#ObjectClassDefinitions

objectclass(1.3.6.1.4.1.7914.1.2.2.1NAME'kunmailUser'
DESC'KunMail-LDAPUser'SUPtopSTRUCTURAL
MUST(username$cn$vuid$vgid)
MAY(maildir$home$clearpw$
forwardAddr$quota$
storeHost$delivery$
mailReplyText$active))

现在来说说这个schema文件。开始部分是attributeType的定义,相当于字段定义。最后的objectclass是定义数据所包含的属性。这里kunmailUser这种数据,要包含maildir$home$clearpw$forwardAddr$quota$storeHost$delivery$mailReplyText$active等可选项,还要包括username$cn$vuid$vgid必选项。可选项用MAY()来包含,必选项用MUST()来包含。DESC是说明项。SUP表示父类(有点像面向对象编程啊)top表示没有父类,他自己是顶级。STRUCTURAL是存储方式,不管他(我也说不清楚)
接下来解释attributeType的说明项。

第一个数字是表示序号,至少我是怎么认为的,也许不对,不过。。。管他。NAME是表示属性的名字
DESC是说明
下面表示的是匹配的方式,SUBSTR是字符串匹配,EQUALITY是相等性匹配,这些在openldap的adminguide里面有,不难看懂SYNTAX是表示字段的数据类型。这个adminguide里面也有说明。SINGLE-value表示这个属性只有一个值,有些属性可以有多个值,比如联系地址等。默认的话,是多值的。

schema准备好之后,我们要在配置文件中,把这个schema包含进去,让这个schema生效。在配置文件slapd.conf中间的开始部分加入这样的一句:include/usr/local/openldap/etc/openldap/schema/kunmail.schema

应该注意,上面这句话之前应确保有一句:include/usr/local/openldap/etc/openldap/schema/core.schema
因为kunmail.schema里面有些东西是依赖core.schema的。

然后slapd.conf看起来应该像下面这样:

#$OpenLDAP:pkg/ldap/servers/slapd/slapd.conf,
#v1.23.2.82003/05/2423:19:14kurtExp$
#
#Seeslapd.conf(5)fordetailsonconfigurationoptions.
#ThisfileshouldNOTbeworldreadable.
#
include/usr/local/openldap/etc/openldap/schema/core.schema
include/usr/local/openldap/etc/openldap/schema/kunmail.schema

#DefineglobalACLstodisabledefaultreadaccess.

#DonotenablereferralsuntilAFTERyouhaveaworkingdirectory
#serviceANDanunderstandingofreferrals.
#referralldap://root.openldap.org

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

#################################################
#ldbmdatabasedefinitions
#################################################

databasebdb
suffix"dc=cz8,dc=net"
rootdn"cn=Manager,dc=cz8,dc=net"
#Cleartextpasswords,especiallyfortherootdn,should
#beavoid.Seeslappasswd(8)andslapd.conf(5)fordetails.
#Useofstrongauthenticationencouraged.
rootpwabcd1234

#ThedatabasedirectoryMUSTexistpriortorunningslapdAND
#shouldonlybeaccessiblebytheslapdandslaptools.
#Mode700recommended.
directory/usr/local/openldap/var/openldap-data
#Indicestomaintain
indexobjectClasseq


配置文件没什么好解释的了吧,主要是我配置了一个数据库"dc=cz8,dc=net",如果需要,还可以配置多个数据库,每个都是以database开始的。具体的方法看adminguide。(一般说来,一个公司用一个数据库)可以启动ldap服务了!
#cd/usr/local/openldap/libexec
#./slapd

接下来的事情就是向数据库添加数据。ldap不支持sql,所以要用ldapadd这个程序来添加,添加的时候要用一个ldif文件,把要添加的东西写在里面,ldif的格式在adminguide里面有说明,我在这里只是简要说一下。

首先要添加根,这一步是必要的,不然任何数据都添加不进去。我们编辑一个root.ldif文件:

dn:dc=cz8,dc=net
dc:cz8
description:YuCaNetworkStudio
objectClass:dcObject
objectClass:organization
o:YuCaNetwork



然后用ldapadd命令将它加入ldap。
#./ldapadd-froot.ldif-x-D"cn=Manager,dc=cz8,dc=net"-wabcd1234

然后我准备在数据库里添加一个分支,专门用来存放邮件系统的用户数据,这种分支,据说要做ou(organizationalunit),一般来说,不同的分支,存放不同类型的数据,我给这个ou起名叫mail。且看ldif文件(mail.ldif)
dn:ou=mail,dc=cz8,dc=net
objectClass:organizationalUnit
ou:mail
description:MailDirectory

继续用ldapadd加入。

然后在ou=mail,cd=cz8,dc=net分支下,加入用户数据:(user.ldif)
dn:cn=heyu,ou=mail,dc=cz8,dc=net
objectClass:kunmailUser
cn:heyu
username:[email protected]
vuid:1000
vgid:1000
clearpw:tmd8427
home:/exports/mailhome/system/heyu
maildir:/exports/mailhome/system/heyu/Maildir/
forwardAddr:[email protected]
quota:10000000
active:1

主要解释一下上面的ldif文件,主要是objectClass这一行,意思是这个节点存放kunmailUser这个类型的数据记录。其他的都是kunmailUser这个类型的属性。运行ldapadd,将其加入。现在去下在一个ldapbrowser/editor,登录到我们的ldapserver看看,应该可以看见ldap的树状结构了。