陈云川的OPENLDAP系列前言本来,我应该准备一篇精彩的演说辞,从LDAP应用的方方面面讲起,细数LDAP在各种场合应用的成功案例,大肆渲染LDAP应用的辉煌前景,指出有多少机构和组织的关键业务是建立在LDAP的基础上的,同时从面向对象的角度分析LDAP所具有的无可比拟的优势。但是,我没有。因为,一是,这个东西已经提上日程很多时候了,而我依然没有能够给出一个完整的解决方案,甚至也还没有深入到LDAP的API,所以实在不好意思再准备这样一篇演说辞,尽管原因是多方面的,但是主要的原因还是因为我琐事缠身,人在江湖,身不由己之故;二是,如果仅仅从最基本的应用而言,LDAP协议本身并不是非常的难,但是,要深入理解LDAP的核心思路,谈何容易,君不见,RFC文档,动辄洋洋洒洒数万言;三是,在基础数据库领域,中国已无法与国外的技术抗衡,而新兴的LDAP目录协议无疑是一个可以让中国在这方面有所建树的话题,只是,我所学并非计算机专业,所好也并非在各种协议的解读中穷尽一生心血,所谓报国无门者,大概如此。上古贤能葛优曾说过,知我者谓我心忧,不知我者谓我何求,此言不假。还是从最基本的说起吧,我的计划是,先给出一个最基本的框架,在此基础上,构建基本的目录应用;然后将重点放在schema的构建和组织上,说明如何定制自己的schema;最后,我准备以LDAP的API结束LDAP目录服务的讨论。我将会主要关注的对象是,开源社区中的著名项目,OpenLDAP。又因为已经是奔三的人了,各种逆天的课程已经在百般无耻下流地冲着我狞笑了,所以我可能没有足够的时间把这些琐碎的学习笔记或者所谓的学习OpenLDAP的心路历程贴上来,但是,我会尽量保证每个星期有一篇blog保质保量的准时出现在dormblog上;同时因为水平有限,疏漏之处,在所难免,恳请各位兄弟斧正。安装在*nix下安装OpenLDAP的方式有以下几种:1。如果你使用的是RedHat,那么可以通过RPM包安装;2。如果你使用的是debian,那么可以通过apt-get安装;3。如果你使用的是BSD家族的FreeBSD或者OpenBSD,那么我推荐你采用ports方式安装;4。如果你想尝试最新的版本,最前沿的功能,你可能需要按照传统的./configure&&make&&makeinstall三步曲方式安装;说明:不推荐第四种安装方式,因为OpenLDAP不论是其前端对网络层的处理还是后端对数据库的操作,都涉及到*nix下共享库的问题,很容易在make的过程中出现error,给学习和使用OpenLDAP的幼小心灵造成严重的心理创伤。前三种方法很安全,因为所有相关软件的依赖关系已经由一些乐于奉献的人给你构建好了,不会出错。安装完成之后,在/usr目录下会出现下面这些可用的东西(注:具体的布局会因系统而异,比如FreeBSD就会将所有东西都放入/usr/local下,而debian则不然):服务器:slapd,slurpd服务端工具:slapadd,slapcat,slapindex,slappassword服务端配置文件:slapd.conf,slapd.access客户端工具:ldapadd,ldapdelete,ldapmodify,ldapsearch,ldapmodrdn客户端配置文件:ldap.conf如果使用服务端工具操作后端数据库,必须首先把slapd服务进程停下来;而如果采用客户端工具如ldapadd等则不需要先kill掉slapd,因此推荐使用ldap客户端工具进行涉及数据库添加,删除,更新等的操作。OpenLDAP系列之二这一节我们主要关注如何配置基本的LDAP服务以及构建简单的地址簿.1.OpenLDAP的服务器程序是/usr/local/libexec/slapd,相应的配置文件为/usr/local/etc/openldap/slapd.conf,这是OpenLDAP最为重要的一个配置文件,它控制着slapd的各个方面.它和apache服务器的httpd.conf配置文件所起的作用是一样的.slapd.conf的配置选项很多,完整的配置说明请参见manslapd.conf,通常情况下,OpenLDAP安装之后在/usr/local/etc/openldap目录下包含了slapd.conf的一个配置范例,如果不是需要对OpenLDAP的各个方面进行精确控制,那么里面的选项多数情况下对我们来说就已经足够了.以下是我的配置文件,所用的系统是FreeBSD5.3,其他系统与此类似.##Seeslapd.conf(5)fordetailsonconfigurationoptions.#ThisfileshouldNOTbeworldreadable.#include/usr/local/etc/openldap/schema/core.schemainclude/usr/local/etc/openldap/schema/cosine.schemainclude/usr/local/etc/openldap/schema/inetorgperson.schema#DefineglobalACLstodisabledefaultreadaccess.pidfile/var/run/openldap/slapd.pidargsfile/var/run/openldap/slapd.args########################################################################BDBdatabasedefinitions#######################################################################databasebdbsuffixo=dormforce.net,c=cnrootdncn=root,o=dormforce.net,c=cn#Cleartextpasswords,especiallyfortherootdn,should#beavoid.Seeslappasswd(8)andslapd.conf(5)fordetails.#Useofstrongauthenticationencouraged.rootpw{MD5}cZZpqIYIUsmEXc/SuEslTA==#ThedatabasedirectoryMUSTexistpriortorunningslapdAND#shouldonlybeaccessiblebytheslapdandslaptools.#Mode700recommended.directory/var/db/openldap-data#IndicestomaintainindexobjectClasseq下面我对这个简单的配置文件进行解释:首先,以#开头的行都是注释;如果某行的下一行是以空格或者制表键空出前面的几格,并且没有以#注释掉,那么这一行被认为是上一行的延续.slapd.conf文件一般分为三个部分,最前面是globaloptions,其次是backendoptions,之后是databaseoptions;globaloptions指定全局范围的options;backendoptions指定某种后端数据库的options,比如可以对DB后端数据库和LDBM后端数据库分别指定一些选项;databaseoptions对某个具体的数据库指定一些选项.backendoptions可以覆盖globaloptions,databaseoptions可以覆盖backendoptions;一开始是三个include行,是globaloptions的一部分:include/usr/local/etc/openldap/schema/core.schemainclude/usr/local/etc/openldap/schema/cosine.schemainclude/usr/local/etc/openldap/schema/inetorgperson.schema这三行指定了包含的schema文件,需要知道,schema文件对于LDAP服务器而言至关重要.在LDAP服务器上存储的各种数据都可以看做是某种对象,而schema文件指定了每个对象的属性,某些属性是必须要有的,有些属性则是可选的.现在,我们只需要知道,在本文件中,我们必需要包含的就是这三个schema文件.这三个文件限定了我们将要在服务器上存储的数据对象.pidfile/var/run/openldap/slapd.pidargsfile/var/run/openldap/slapd.args这两行指定将slapd的进程ID号保存到/var/run/openldap/slapd.pid文件中,把slapd的参数保存到/var/run/openldap/slapd.args文件中.我们没有指定访问控制列表ACL,因此,globaloptions到这里结束.默认情况下,slapd服务器进程允许匿名访问,匿名访问的权限被设置为只读.本配置文件中我们省略了backendoptions,因为我们只使用到了BDB数据库;接下来,我们看一下BDB数据库的配置选项:########################################################################BDBdatabasedefinitions#######################################################################databasebdbsuffixo=dormforce.net,c=cnrootdncn=root,o=dormforce.net,c=cn#Cleartextpasswords,especiallyfortherootdn,should#beavoid.Seeslappasswd(8)andslapd.conf(5)fordetails.#Useofstrongauthenticationencouraged.rootpw{MD5}cZZpqIYIUsmEXc/SuEslTA==#ThedatabasedirectoryMUSTexistpriortorunningslapdAND#shouldonlybeaccessiblebytheslapdandslaptools.#Mode700recommended.directory/var/db/openldap-data#IndicestomaintainindexobjectClasseq这里:databasebdb这一行指定数据库为BDB数据库;suffixo=dormforce.net,c=cn指定BDB数据库保存目录树中的o=dormforce.net,c=cn子树;rootdncn=root,o=dormforce.net,c=cn相当于指定了管理此目录子树的root帐号;rootpw{MD5}cZZpqIYIUsmEXc/SuEslTA==相当于指定了管理此目录子树的root用户的口令,本例中我使用了MD5进行加密;directory/var/db/openldap-data指定了BDB数据库所在的文件系统目录;indexobjectClasseq指定了数据库索引(注:这个我也没弄明白,但是知道它是用来提高数据库访问速度的).整个slapd.conf配置文件到此结束.下面我对suffixo=dormforce.net,c=cn这一行做一下解释:这里的o表示组织名,我们的组织名是dormforce.net,而c表示国家名,中国表示为cn.关于目录中识别名DN的命名,RFC并没有规定标准的方法,但是通常使用的有三种方法:(1)传统方式,顶层为国家名,次顶层为组织名,如:suffixo=dormforce,c=cn(2)域名方式,按照DNS命名方式