LDAP是light weight Directory Access Protocol (轻量级目录访问协议)的缩写,其前身是更为古老的DAP协议。基于X.500标准的,但是很简单,并且可以根据需要定制。与X.500不同,LDAP支 持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,大体上讲,LDAP协议定义了和后台数据库通信的方法、客户 端软件和LDAP协议之间的通信标准,如后图。
QQ交流群:41405569
LDAP Client是指各种需要身份认证的软件,例如Apache、ProFTPD和Samba等。LDAP Sever指的是实现LDAP协议的软件,例如OpenLDAP等。DataStorage指的是OpenLDAP的数据存储,如关系型数据库 (Mysql)或查询效率更高的嵌入式数据库(BerkeleyDB),甚至是平面文本数据库(一个TXT的文本文件)。可见OpenLDAP软件只是 LDAP协议的一种实现形式,并不包括后台数据库存储,但在很多时候管理员经常将LDAPServer和DataStorage放在同一服务器中,这样就 产生了常说的LDAP数据库,虽然后台数据库可以多种多样,但LDAP协议还规定了数据的存储方式。LDAP数据库是树状结构,与DNS类似。

webldap架构
 
在图右中,以这种方式存储数据最大的一个好处就是查询速度块,LDAP数据库专门对读操作进行了优化,OpenLDAP配合Berkeley DB 可使其读操作的效率得到很大提高,LDAP数据库的树状结构的另一个好处是便于分布式的管理。
 
实现思路
同 一身份认证是改变原有的认证策略,使需要认证的软件都通过LDAP进行认证,如下图。在同一身份认证之后,用户的所有信息都存储在LDAP Server中。终端用户在需要使用公司内部服务的时候都需要通过LDAP服务器的认证。每个员工只需记住一个密码,在需要修改用户信息的时候可以通过管 理员提供的Web界面直接修改LDAP Server中的信息。

webldap
目前大部分主流软件都对LDAP有很好地支持,但由于各类软件对LDAP的支持程度不同,在做实施的时候也要区别对待。软件对LDAP的支持可以分为两大类:
1、 一类是完全支持,也就是在软件的配置文件中加入和LDAP有关的选项就可以完成。这种方式的好处是不需要借助其他的工具或软件,由软件的开发团队直接完成 对LDAP的支持。可能的缺陷也在此,由于各个软件开发团队的水平和开发者经验有所差异,虽然同样是支持了LDAP,但稍微复杂一些的高级功能就无法提 供,有的时候甚至出现运行错误导致整个软件出现问题。
2、另一类软件由于很多原因并不直接支持LDAP,而是通过PAM做身份认证,由于 PAM本身支持LDAP,这样也同样可以实现使用LDAP做身份验证,这种方式对LDAP的支持同样尤其优势,软件开发人员不需要修改代码支持LDAP协 议,减少了软件本身产生安全漏洞的可能,缺点是一些不希望使用PAM的系统中这样的软件就无法通过LDAP进行用户认证,俄日全额虽然PAM对LDAP的 支持已经很完善,但一些高级、复杂的功能还是无法实现,正是由于这些原因,这类软件为数不多,比较典型的就是VSFTPD和CVS。
 
使用LDAP做身份认证
为 什么需要使用LDAP数据库?用传统的关系型数据库不可以吗?从上述说明中可以看到LDAP服务器就是起到了一个认证Server的作用,从技术本身而言 这个认证Server具体使用何种数据库并不重要,如果使用一个关系型数据库也可以达到统一身份认证的目的,但LDAP自身的优势使得很多公司最终选择 它,以下是一些选择LDAP的重要原因:
1、LDAP是一个开放的标准协议,不同于SQL数据库,LDAP的客户端是跨平台的,并且对几乎 所有的程序语言都有标准的API接口,即使是改变了LDAP数据产品的提供厂商,开发人员也不用担心需要修改程序才能适应新的数据库产品,这个优势是使用 SQL语言进行查询的关系型数据库难以达到的。
2、由于LDAP数据库存储是树状结构,整棵树的任何一个分支都可以单独放在一个服务器中进行分布式管理,不仅有利于做服务器的负载均衡,还方便了跨地域的服务器部署,这个优势在查询负载大或企业在不同地域都设有分公司的时候尤为明显。
3、LDAP支持强认证方式,可以达到很高的安全级别,在国际化方面,LDAP使用了UTF-8编码来存储各种语言的字符。
4、 更灵活的添加数据类型,LDAP是根据Schema的内容定义各种属性之间的从属关系及匹配模式,例如在关系型数据库中如果要为用户增加一个属性,就要在 用户表中增加一个字段,这在拥有庞大数量用户的情况下是十分困难的,需要改变表结构。但LDAP只需要在Schema中加入新的属性,不会由于用户的属性 增多而影响查询性能。
5、LDAP数据库是对读操作进行优化的一种数据库,在读写比例大于7比1的情况下,LDAP会体现出极高的性能。这个特征正适合了身份认证的需要。
 
目前,很多公司都把LDAP和自己的产品、技术结合在一起,增加LDAP在各个领域中的有效性,这一切都来源于LDAP是一个开放的协议,很容易与其他标准协议共存。
 
LDAP软件的选择
几 乎所有大的IT厂商都有自己的商用LDAP产品,每个厂商的LDAP产品都有其特点,现在已经有了许多基于LDAP协议开服出的资源管理系统和工具,如 OpenLDAP、NDS(Novell Directory Service)和ADS(Active Directory Service)等。它们已经逐渐的被使用在各个需要目录服务的领域,并且应用的趋势在增强。OpenLDAP是Michjgan大学发布的免费软件,实 现了LDAP v2、LDAPv3的功能并且提供源代码,可以在大多数的Unix和Linux系统中安装。OpenLADP与其他的商用软件相比有很多优势,如商用的软 件版本更新很慢,对Bug的反映速度比开源软件差许多,OpenLDAP还包含了很多有创造性的新功能,能满足大多数使用者的要求。OpenLDAP是开 源软件,近年来国内很多公司开发的LDAP产品都是基于OpenLDAP开发,开发者能够直接利用它所附带的Shell工具开发应用。这些Shell包括 了查询(ldapsearch)、修改(ldapmodify)、删除(ldapdelete)、增加(ldapadd)等,也可以调用它提供的API来 开发应用。
 
OpenLDAP的安装和配置
OpenLDAP可以采用多种数据库作为后台,包括 Berkeley DB、GDBM、Mysql、Oracle等,这里采用Berkeley DB,由于OpenLDAP需要Berkeley DB来存放数据,所以需要安装Berkeley DB 5.2.36。Berkeley DB是一个高性能,嵌入数据库编程库,它由美国Sleepycat Software 公司开发的一套开放源码的嵌入式数据库的程序库(database library),它为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务,有时也简称DBD。
[root@chenyi ldap]# tar zxf db-5.2.36.tar.gz
[root@chenyi dist]# cd db-5.2.36/build_unix/
[root@chenyi build_unix]# ../dist/configure --prefix=/software/BerkeleyDB.5.2
[root@chenyi build_unix]# make && make install
安装openldap
[root@chenyi ldap]# tar zxf openldap-stable-20100719.tgz 
[root@chenyi ldap]# cd openldap-2.4.23/
[root@chenyi openldap-2.4.23]# vi /etc/profile		#添加环境变量
PATH="$PATH:/software/BerkeleyDB.5.2/lib/"
echo $PATH
CPPFLAGS="-I/software/BerkeleyDB.5.2/include/"
export CPPFLAGS
LDFLAGS="-L/usr/local/lib -L/software/BerkeleyDB.5.2/lib/"
export LDFLAGS
LD_LIBRARY_PATH="/software/BerkeleyDB.5.2/lib/"
export LD_LIBRARY_PATH
CFLAGS="-I/software/BerkeleyDB.5.2/include/ -I/usr/local/include -I/usr/include"
export CFLAGS 
LIBS="-ldb -lgcc_s"
export LIBS
[root@chenyi openldap-2.4.23]# su - root
[root@chenyi openldap-2.4.23]# ./configure --prefix=/software/openldap --enable-ldbm
[root@chenyi openldap-2.4.23]# make depend
[root@chenyi openldap-2.4.23]# make
[root@chenyi openldap-2.4.23]# make test		#此处需要较长的时间测试
[root@chenyi openldap-2.4.23]# make install
通过上面的配置命令可以看出,已将OpenLDAP安装到/software/openldap目录下,建议以源码安装的软件都放到独立的目录下。别整默认,好处是方便管理及控制,这样在卸载的时候删除真个目录就好了。
 
需要注意的几个地方:
1、在执行Configure之前要确定安装了Berkeley DB,虽然OpenLDAP可以使用很多数据库做back-end,但Berkeley DB 仍然是OpenLDAP开发团队强烈推荐的。
2、如果需要更安全的方式访问OpenLDAP,在配置执行Configure之前要确定已经安装了cyrus-sasl。
3、 有些用户在安装OpenLDAP的时候忽略了最后的make test(总的来说,这个测试时间,我不想去描述了。),经验表明,很多的错误都会在执行make test的过程中暴露出来,OpenLDAP的开发团队很注意维护软件Test Case,整个测试非常全面,很多在日常使用中很少用到的功能都会被测试到。良好的保证了软件投入生产后的稳定性。
 
默认情 况下OpenLDAP的配置文件保存在/etc/openldap、slapd.conf中,配置文件中记录着OpenLDAP的管理员密码,默认情况下 密码是明文表示的,可以用slappasswd命令产生密文来替换配置文件中的明文,配置文件的相关项应该做如下更改:
[root@chenyi openldap]# grep -v "^#" /software/openldap/etc/openldap/slapd.conf | grep -v "^$"
include		/software/openldap/etc/openldap/schema/core.schema
pidfile		/software/openldap/var/run/slapd.pid
argsfile	/software/openldap/var/run/slapd.args
database	bdb
suffix		"dc=itchenyi,dc=com"			#设置目录树的后缀
rootdn		"cn=Manager,dc=itchenyi,dc=com"	#该语句设置LDAP管理员的DN
rootpw		secret				#设置LDAP管理员的口令,明文原因前面已说
directory	/software/openldap/var/openldap-data
index	objectClass	eq
其中Directory参数为数据文件在服务器上的位置,处于稳定性和性能方面的考虑,数据文件最好放在独立的分区或磁盘阵列上。配置文件的访问控制部分也十分重要,很多读取或修改不能正常完成都是由于访问控制的写法错误造成的,下面是供参考的访问控制部分配置:
                  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
设置LDAP使用的Schema
Schema(模式)定义了LDAP中的对象类型、属性、语法和匹配规则等,如用户的电子邮件、联系地址和联系电话等属性,它类似于关系数据库中的表结构。
找到语句:
include /software/openldap/etc/openldap/schema/core.schema
在该语句的后面添加以下语句。
   include         /software/openldap/etc/openldap/schema/corba.schema
   include         /software/openldap/etc/openldap/schema/cosine.schema
   include         /software/openldap/etc/openldap/schema/dyngroup.schema
   include         /software/openldap/etc/openldap/schema/inetorgperson.schema
   include         /software/openldap/etc/openldap/schema/java.schema
   include         /software/openldap/etc/openldap/schema/misc.schema
   include         /software/openldap/etc/openldap/schema/nis.schema
   include         /software/openldap/etc/openldap/schema/openldap.schema
启动OpenLDAP服务器
[root@chenyi openldap]# /software/openldap/libexec/slapd 
[root@chenyi openldap]# netstat -pant | grep slapd
tcp        0      0 0.0.0.0:389                 0.0.0.0:*                   LISTEN      25561/slapd         
tcp        0      0 :::389                      :::*                        LISTEN      25561/slapd
 
QQ交流群:41405569