LDAP技术报告

LDAP技术报告
  一、目录和目录服务
       LDAP(Lightweight Directory Access Protocol)轻型目录访问协议是目录访问协议的一种。因此下面首先介绍什么是目录和目录服务。
       目录是一个以一定规则排列的对象的属性集合,是一个存储着关于对象各种属性的特殊数据库,这些属性可以供访问和管理对象时使用,类似电话簿和图书馆卡片分类系统。这里,我们所谈的目录服务是指网络目录服务。目录服务是指一个存储着用于访问、管理或配置网络资源信息的特殊数据库(also called data repository),它把网络环境中的各种资源都作为目录信息,在目录树结构中分层存储,对这些信息可以存储、访问、管理并使用。网络中的这些资源包括用户、各个应用系统、硬件设备、网络设备、数据、信息等。目录服务是为有效的集成管理网络目录中的信息提供服务,是支持网络系统的重要底层基础技术之一。
目录服务将分布式系统中的用户、资源和组成分布式系统的其它对象统一的组织起来,提供一个单一的逻辑视图,允许用户和应用透明地访问网络上的资源。一个由目录服务支持的网络系统是一个集成的、网络化的、统一的系统,而不是各个独立功能部分的简单聚合。在目录服务系统中对象可以根据名字或功能、属性访问,而不是根据机器地址、文件服务器名字和mail地址等访问。在目录服务的基础上开发的应用,易于使用、功能增强和易于管理,目录信息的共享为应用的开发提供了方便。下一代分布式网络的信息模型和模式是一种基于目录的,当我们进入网络时,是登录到一个基于目录的网络中,而不是登录到某个机器上。
目录服务可以存储信息种类:
用户帐户信息(登入名、口令、权限)
用户个人信息(电话号码、地址、雇员ID号)
外围设备配置信息(打印机、调制借调器、传真)
应用程序配置信息
安全信息
网络基础设施配置信息(路由器、代理服务器、INTERNET访问设置)
人们可以想得到的,网络目录中都可以存储
这些信息集中在一个标准数据库中,就可以有多种不同的使用方法。其中,最普通的是供系统管理员用于网络访问控制和网络资源访问控制。目录将成为对许多网络活动进行集中控制的地方。

       控制的例子:
用户登入进入一个网络,系统进行认证和权限判定;
用户进入网络后,访问网络中的资源,系统向目录服务查询该用户是否具有使用该资源的权限,并返回所请求资源的物理地址。
个人用户可以使用目录服务存储个人设置信息,并可以对其所有环境进行集中存储和控制。
随着目录服务技术的成熟,人们可以使用该技术通过一些网络设备监视和控制网络传输情况。

    目录服务的基本功能:
资源信息的目录式表示、分布存储、资源定位和查找、用户的统一认证、系统资源的统一授权、系统资源信息的共享、系统资源的单点统一管理、安全传输的保证、资源的统一监控等。
目录服务的主要优点:
网络管理工作大大减轻,包括管理网络上的各个应用;
网络的集中管理点;
访问用户信息的集中控制点;
存储在其它条件下很难处理的管理信息
系统资源信息的利用率高、管理的可扩展性好
简单地说,目录的发展经历了书面目录(电话目录、医士列表)——基于计算机的目录(PIM,不易共享、必须访问到响应的软件和计算机)——网络目录(公共的、共享的、统一的)。
传统的目录是计算机或网络基础结目录的一个构件,它向其它应用程序提供服务,但没有提供集成管理的机制,网络上的计算和服务需要一种公共的、分布式的目录,能够跨平台地对应用程序和用户提供集中、统一的服务。目录服务将使网络上的系统资源管理朝着单一的、全网络的目标发展,并能够让用户、管理员以更容易的方式来管理网络环境。目录服务作为一种工具来减少大型网络的管理负担,提供了集中的单点管理和适应复杂环境所必须的灵活性,减轻了非目录服务系统中存在的冗余管理。
通过网络资源逻辑接口,目录服务(ADS)减少了人们为了利用网络功能而必须对网络掌握的程度。也就是说,普通用户只需要很少的网络知识,就可以通过复杂网络访问和使用资源。用户不需要再了解资源的物理分布,访问本地打印机的方法和访问远程网络资源的方法相同。目录服务(ADS)提供了逻辑表示与资源的网络上的物理位置的连接,从用户的角度看,这可能是转移到基于目录的网络操作系统具有的最大优点。)
目录服务和数据库的区别:
读多于写
一般不支持事务处理
信息访问方式不同(一个是SQL、一个是LDAP的API)
目录中的信息一般不要求严格的一致性
传统的数据库是平面的,无法表示资源之间及资源使用控制的复杂逻辑关系而远远不能满足当前资源信息管理的各种要求。
目录服务与DNS系统的相同之处和不同之处
相同之处:
分布存储
树型层次结构
容错
不同之处:
DNS的功能和目录服务不同,DNS功能单一,本质上是将主机名解析成IP地址。目录服务是可以为多个应用提供网络资源的信息存储和管理,具有广泛的应用特性;
DNS是以一系列文本文件为基础,是一种纯文本式的数据库,无法进行扩展,适应其它功能的要求;
与分布式文件系统的相同在于采用了准树型层次结构,具有一定的授权功能,区别在于:
目录服务表示资源的各种属性信息,可为各种应用提供服务,文件不能表示;
目录服务有很强的逻辑表示和分类,文件的组织逻辑性单一,主要按存储位置;
文件系统的认证功能较差
独立性强
目录服务的应用举例
C4ISR系统:由多个大的子系统构成,管理问题更为复杂和严重
新的应用:电子商务(IBM)、操作系统(WINDOWS2000)
网络的监控管理
会议系统和PIM
搜索功能
太多的应用——基于目录的应用
原有应用的资源管理的重新开发
二、  LDAP协议的特点
X.500协议是为了便于建立全局、分布式的目录信息而设计的一套协议。它是一种C---S(Client—Server)结构的应用协议,支持用户通过网络访问和维护资源信息,另外还具有几个突出的特点:
支持分布式的目录信息维护,所以每一个运行X.500的服务器都只需负责自己所管辖的资源信息,只需在本地就可完成信息的更新;
提供强大查询能力,可以让用户随心所欲的设计查询方式;
全局的信息标示,通过这种标示可以唯一的定位信息位置,获取内容;
结构化的信息模式,支持开发者的本地扩展;
遵循统一的标准,所以可以通过标准的方式访问任何一个X.500服务器,获取信息;
X.500协议中包含了这诸多的强大功能,可以说在很大的程度上满足了用户和开发者的要求,但是在用户和开发制的使用过程中却逐渐暴露出其许多的不足之处,阻碍了它的应用和推广,主要集中在使用方式和性能开销上这两个方面,由于X.500是在OSI协议栈上实现的,虽然X.500提供了强大的信息查询功能,但是协议所要求的访问格式却十分复杂,往往难以掌握;其次在运行X.500服务器时对系统的开销要求较高。为了兼顾保留协议的优点和克服这些不尽人意的地方,推出了由X.500目录服务协议延伸发展而来的轻型目录访问协议(Lightweight Drectory Access Protocol,简称LDAP)。LDAP协议继承了X.500的90%左右的功能,同时兼容所有使用X.500协议建立的服务端数据库,避免了重复开发的浪费;在运行开销上却只是X.500的10%。正是由于LDAP具有巨大的优越性,它从一开始仅仅是作为X.500客户层的另一种实现方式,到现在在许多应用中完全替代了X.500协议,成为一个完整实用的应用开发协议。
LDAP在以下四个方面对X.500进行了简化:
传输 :   LDAP直接运行在TCP上,避免了OSI多层通信的高层开销;
功能:    LDAP简化了X.500的功能,抛弃了较少用到的功能和冗余的操作;
数据表示:X.500的数据表示结构复杂,LDAP采用简单的字符串对数据进行表示;
编码:    LDAP用于网络传输的编码规则比 X.500的编码规则更加简单。
总到来说,基于LDAP的目录服务有以下特点。
目的是存储网络资源的信息
结构化的信息框架(面向对象的信息存储方法),采用树型层次式结构表示
在系统中的单点集中(不指物理位置)管理资源,可实现单一登入点
读多于写
基于TCP 协议
Client/Server逻辑结构
标准的访问协议LDAP
强大的搜索功能,允许用户组织复杂的查询要求
维护的分散性(信息可分布存储,具有集中式数据库无可比拟的优越性)
可全球唯一的命名
动态添加和修改信息
容错功能
自动更新和维护存储的信息
方便的备份和恢复功能
安全访问和信息传输的安全
易对资源进行授权管理
三、  LDAP协议的内容
        LDAP定义了四种基本模型:
信息模型说明了LDAP目录中可以存储哪些信息;
命名模型说明了如何组织和引用LDAP目录中的信息;
功能模型说明了LDAP目录中的信息处理,特别是如何访问和更新信息;
安全模型说明如何保护LDAP目录中的信息不受非授权访问和修改。
信息模型
       LDAP的信息模型是以模式(Schema)为基础的,以项目(Entry)为核心的。模式由若干项目组成,项目是描述客观实体的基本单位,项目(如图3)由描述客观实体具体信息的一组属性(Attribute)构成。属性(如图3)只能有一种类型(Type),可以有一个或多个值(Value)。属性的类型具体说明属性值可以存储哪些信息,以及这些信息的行为特性。例如,属性cn的类型是caseIgnoreString,它意味着属性值是按照词典排序的字符串,并且在比较时忽略大小写,如BEIJING和Beijing是相同的;属性tele的类型是telephoneNumber,它具有caseIgnoreString的全部特性,另外在比较时忽略空格和破折号,如0731-4573670和07314573670是相同的。每个项目都有一个属性objectClass,用于说明项目的类型,以及项目中的必选属性和可选属性。属性objectClass的取值可以是一个或多个,其中必须有一个用于说明项目的基本结构的结构对象类(Structural object class),结构对象类不能轻易改变;除此之外,还可以有若干个对项目结构进行辅助说明的辅助对象类(Auxiliary object class),在访问控制允许的范围内可以新增或删除辅助对象类。

命名模型
        在LDAP目录中,项目是按照树形结构组织的,根据项目在树形结构中的位置对项目进行命名,这样的命名通常称为标识(Distinguished name),简称DN。DN由若干元素构成,每个元素称为相对标识(Relative distinguished name),简称RDN。RDN由项目的一个或多个属性构成。

       LDAP的命名模型(如图4)与我们熟悉的文件系统有很多相似之处,RDN与文件系统中的文件名很相似,DN与文件的绝对路径名很相似。另外,与文件系统一样,兄弟项目(即,具有相同父项目的子项目)必然具有不同的RDN。LDAP的命名模型与文件系统之间的区别主要有:
在LDAP目录中,位于叶节点和非叶节点的项目都拥有各自的属性;在文件系统中,只有位于叶节点的文件拥有较丰富的内容,而位于非叶节点的目录的内容相对简单。
在LDAP目录中,DN中各元素的排序是从叶到根;在文件系统中,文件绝对路径名中各元素的排序是从根到叶。
在LDAP目录中,DN中各元素之间的分隔符是“,”;在文件系统中,文件绝对路径名中各元素之间的分隔符是“/”或“/”。
在LDAP目录中,允许超越树形结构的别名项目(Alias entry),它指向其它项目。

功能模型
        LDAP的功能模型涉及以下三个方面:
询问(Interrogation)
LDAP在信息询问方面主要定义了查找(Search)和比较(Compare)两个操作。在查找操作中,根据选取标准在指定范围内选择项目,这个选取标准通常称作查找过滤器(Search filter),并且可以规定一组需要返回的属性。另外,还可以规定查找结果的大小和客户端等待结果的时间。比较操作主要是判断指定项目是否包含指定属性(包括类型和值)。
更新(Update)
LDAP在信息更新方面定义了新增(Add)、删除(Delete)、修改(Modify)和修改RDN(Modify RDN)等四个操作。新增操作主要是在LDAP目录中插入一个新的项目。删除操作主要是从LDAP目录中删除已有项目。修改操作主要是修改已有项目的属性,具体地说,可以增加、删除、修改属性或属性值。修改RDN操作主要是修改项目的名字。
身份验证(Authentication)
LDAP在身份验证方面定义了连接(Bind)、断接(Unbind)和作废(Abandon)等三个操作。连接操作主要是客户端向服务器提供身份信息,包括DN和口令,以便于服务器验证客户端的身份,身份验证成功即建立客户端与服务器之间的会话(session)。断接操作主要是结束客户端与服务器的会话。作废操作主要是中止正在执行的操作。
       
        安全模型
如何控制从网络上来的各种访问请求,防止非授权的访问发生?这对于一个系统而言,也是十分重要的,因为许多的用户信息(如密码、费用)以及许多系统的配置数据等都属于敏感信息,它们不希望被随便一个普通的使用者访问,而只允许管理员拥有查询和修改的权限。LDAP的安全模型是以客户端的身份信息为基础的。客户端的身份信息通过连接操作提供给服务器,服务器根据身份信息对客户端提出的访问请求进行控制。在LDAP中存在一个被称为访问控制列表(Access Control List,以下简称ACL)的文件,控制各类访问请求具有的权限。ACL文件中的控制方式具有极大的弹性:即可以在大范围上控制某一类资源可以被某类甚至某个用户访问,还可以具体到资源类中的任何一个属性。其授权的种类有读、搜索、比较、写这几种,可以单独,也可以组合使用。一般的格式是
access to “cn=*,ou=nudt,o=cs,c=cn”
by    “cn=tom,ou=nudt,o=cs,c=cn”   write
上面的控制设置就赋予了Tom对NUDT部门下的所有资源信息写的权利,当然也就有了读等这些权利了。详细的定制和完善ACL文件,可以使目录服务系统提供较好的安全性。此外,开发者还可以根据安全程度的需要,在LDAP中集成其它的安全工具,如KERBOUS, SSL等应用广泛的安全技术,适用不同层次用户的需要。

四、 LDAP如何工作以及如何开发LDAP的应用
LDAP是以服务器—客户端方式工作的,目录服务将数据库软件的逻辑结构分为前端(客户端)和后端(服务端和仓库)(图1)                                            


       客户端是直接面对一般开发者和用户的;服务端是用于接收和解释客户请求,然后以客户的身份完成请求,并将完成结果返回给用户;仓库则是真正存储信息的地方。在LDAP中,服务端和仓库之间的连接采用了ODBC机制,所以可以使用任何支持和具有ODBC驱动程序的数据库软件,简单的可以是Linux系统中自带的GDBM或Alpha中的NDBM等数据库管理系统;也可以选用在功能和性能上更优越的Oracle和Sybase等系统,这样,可以提高系统的可移植性。
       现在已经有了许多基于LDAP协议开发出的资源管理系统和工具,如Openldap、NDS(Novell Directory Service)和ADS(Active Directory Service)等。它们已经逐渐的被使用在了各个需要目录服务的领域,并且应用的趋势在增强。
      Openldap是Michigan大学发布的免费软件,实现了LDAP v2的功能,并部分支持LDAP v3。它提供原代码,可以在大多数的Unix和Linux系统中安装。开发者能够直接利用它所附带的一些SHELL工具开发简单的应用,这些SHELL包括了查询(ldapsearch)、修改(ldapmodify)、删除(ldapdelete)、增加(ldapadd)等,关于他们的使用方法可以参照帮助文件;也可以调用它提供的程序接口(API)来开发应用,接口包括了查询(ldap_search)、修改(ldap_modify)、增加(ldap_add)、删除(ldap_delete)等。从模版的定制到资源信息的组织和输入都可以按照用户的要求进行,开发出满足你要求的应用软件。
我们以openldap1.2.7为例,进一步说明LDAP的工作方式。也就是如何使用openldap1.2.7来建立一个基于LDAP应用开发。Openldap1.2.7的后台数据库选用gdbm 1.8.0,Openldap实现了与gdbm的接口ldbm。SLAPD是Openldap实现的独立的LDAP服务的守护进程,SLURPD是Openldap实现的独立的LDAP更新和复制的守护进程。gdbm 是GNU发布的免费dbm,使用哈希排序的数据库例程集,与标准的UNIX下的dbm例程一样工作。gdbm有比Berkeley dbm更快的快速排序,并且它是可重入的。
进行开发前,先要安装gdbm和openldap。
得到gdbm1.8.0.tar,tar xvf gdbm1.8.0.tar
cd ./gdbm
./configure
make
make install
然后安装openldap:
tar xvf openldap.tar
cd ./ldap
./configure - - with-ldbm-api=gdbm,使ldap服务进程在后端使用gdbm数据库
make depend
make
make install
        接下来,进行基于LDAP协议的应用开发,大致分为四个步骤,这四个步骤同时也分别对应了建立协议中四种基本模型的过程:信息模型、命名模型、功能模型和安全模型。
       首先是建立信息模型,既计划需要管理的资源范围,在LDAP中所建立的信息以“实体”(entry)为单位,数据库的框架被称为“模版”(schema),每个实体的属性范围都会在模版中说明。模版的内容可以根据你的需要随意定制,可以将具有类似属性范围的信息归为一类,对于一类实体的说明采用了基于面向对象的机制,将模版中的每一个信息框架称为一个类“class”,而可以用这个类定义出你需要的事例,也就是一个个信息实体。
例如在模版文件中写入这样内容:
                        objectclass  person
{
requires
account,
userpassword
allows
sex,
……
}
        其中requires所包含的属性是每一个登记的用户都必须填写的属性范围,而allows所包含的则是可有可无的内容,这也给信息的存储控制增添了许多灵活性;其中,象系统管理员这种资源可以与一般用户合并,只是需要在属性中加入“类型”这样的属性用以区分是用户还是,为了安全,也可以将管理员单独设置为一类资源,在他的属性范围中包括帐号名、密码、管辖的范围(机器等设备的标示)、和联系方式等。对于其它的资源则根据实际情况分别设计,最后生成一个完整的模版文件。在openldap中,模版文件包括编辑yourname.oc.conf(定义信息对象类的文件)和yourname.at.conf(定义对象类中属性的文件)。
        对照上面的信息模型所建立的信息库还仅仅是一个个零散的资源记录,为了表现出它们之间的逻辑联系,需要完成LDAP中的命名模型。在平面式数据库中定位信息记录是通过每一条记录前面的标号或通过某些域的关键字匹配来完成的,实现过程大多是通过轮询,这在提高处理性能上就造成了许多障碍。LDAP中采用了更加合理的树形存储方式,将资源信息记录分别放置在树的根到叶的位置上,这种方式总是从不同的方面表现出了信息记录之间的某种从属的逻辑关系。
    对于每一个信息实体的定位使用全球唯一的命名方式既“可区分的名字”(DN:Distinguished Name),信息间的逻辑关系同时从DN中得到体现。可以参照Internet中的域名来理解DN的表示方法,如果你将所管理的信息按照地域进行分类,那么DN中就回包含你的分类标准,如从国家,到地区,在具体到某个部门中的人或者机器等等,格式是“cn=  ,ou=  ,o=  ,c=  ”。(其中的cn、ou、o、c都是一些标示关键字,分别表示用户名字、部门、地区和国家)这样当用户需要寻找某人的一些信息(如电话号码、Email地址等),如果知道他的工作地址,那么可以查找这个单位中所有符合条件的人员信息,如果查找的条件较具体,那么可以直接找到这个人的信息实体,即使是给的查找条件比较模糊,也可以找出单位中所有符合条件的人员信息,然后由用户从中挑选出需要的,信息的逻辑结构见(图2)
  cn            中国
 
  o             长沙              上海     北京
 
  ou           国防科大      市政府
 
 cn           张三               李四
        当然,分类方式完全可以按照你的需要进行选择,将所有的信息组织在数据库中。建立了信息模版之后,就可以开始生成数据库本身了。添加数据库信息可以是先写一个LDIF(Ldap Data Information Format)格式的文档,(每个ldif文件对应一个数据库,在LDAP中可以有多个数据库,)这种格式是与模版是对应的,将一个个信息实体罗列在文件中,然后使用SHELL工具“ldif2ldbm”将其转换为当前使用的数据库软件的格式,并且在启动服务端时告诉这些数据库文件的存储路径;
         如何真正的访问LDAP信息库中的记录则是在其功能模型中定义的内容,在应用开发中即开发一个LDAP的客户端和该客户端如何访问LDAP服务器。Openldap提供的仅仅是一系列的shell命令和API,我们要依靠这些底层调用来建立一个完整的用户访问和显示环境。如果不进行这方面的开发,可以使用普通的浏览器或者直接通过shell命令来操作,不过这种操作方式需要对LDAP的环境,配置情况,存储内容都有相当详细的了解,还要记住LDAP中复杂而又繁琐命令格式。普通用户根本不可能掌握。
         一个完整的访问过程包括四个步骤:初始化、绑定服务器、访问资源信息和断开连接。其中初始化是分配一个操作句柄;绑定服务器是向服务端提供自己的身份标示(含用户名和密码等);访问资源信息则是提出自己的访问请求(如查询和更新,他们分别有对应的标准API),等待并获取访问结果;断开连接是在所有的访问工作完成之后断开与服务端的连接,释放占用的资源。LDAP是简化了X.500中的许多操作,它在访问资源的方式中主要提供与“读”和“写”相关的操作手段。与“读”相关的有查找(search)和比较(compare),在查找时可以通过设置不同的“过滤器”(filter)达到获得自己需要的结果,过滤器中的内容可以涉及到任何相关属性的名称及取值范围等,并且支持与、或、非等关系表达式;“比较”则是将特定记录中某属性的值取出与自己的设定进行关系比较。与“写”相关的操作有增加、删除、修改和更名。增加是在信息库中增加新的信息记录,当然不能有相同唯一标示的记录存在;删除是将被认定为无用的信息记录从库中删除;修改是对于库中资源信息的某些属性值进行修改;更名则是更替唯一标示中最后一部分的内容,往往使用在仅仅这个资源的名称有了改变的情况下。
        如何防止资源信息的非授权访问和处理数据备份以及恢复是在安全模型中解决的问题。我们在下一章进行详细说明。
在处理好以上四个方面后 ,我们就可以启动LDAP服务了,在openldap中,启动服务器端的SLAPD(LDAP服务器进程),就可以响应用户的访问了。
 LDAP中的访问控制
        LDAP通过安全控制列表ACL(Access Control List)可以对信息库中的所有资源进行访问控制,甚至可以具体到一个资源记录中的某个属性。在openldap中,是在slapd.conf中定义的。Slapd.conf是LDAP最主要的配置文件,它说明了LDAP中使用的模板文件、日志文件、数据库位置、系统管理员帐号、系统管理员口令和各种安全机制等,其中主要是定义用户访问权限和建立LDAP的主从和主备关系。
对于用户访问权限,举例说明,我们可以将用户信件信息只授权给收件人,那么当该用户在绑定服务器并提供正确的帐号名和密码之后可以访问所有寄给他的信件,而其他用户试图超越自身的权限,获取其他用户的信件信息时会被立即拒绝。可以这样来描述权限的设置:
access to dn=”.*, User=Tom, o=XY, c=A”   by  dn=”User=Tom, o=XY, c=A”。
通过这条限制就将信件的访问权限完全的赋给了信件的收取者。同样,设备的访问权限是授予了相应的设备管理员,而用户这类资源则只能由系统管理员来控制。
对于用户密码这个属性,可以这样定义。
access to dn=".*,grp=general,ou=nudt,o=cs,c=cn" attr=userpassword
        by self                                       write
        by *                                         none

在slapd.conf中还可以定义referral配置,它的值应是另一个LDAP服务器或多个LDAP服务器的 URL,当用户进行查询时,没在本地找到,就会去referral指定的其它LDAP服务器进行查找。openldap直接在服务器上实现了referral,而是返回给客户referral地址,如图1。①向server发出请求;需要指向其它server时,②返回referral地址;③客户需重新向referral地址发出请求;④返回结果。为了网格用户的方便,需要屏蔽掉信息所在地址即referral,实现Chaining,即在服务器上自动支持referral,如图2。①向server发出请求;需要指向其它server时,②自动指向referral地址;③自动向referral地址发出请求;④返回结果。

图1
图2
有了referral的功能,我们就可以把网络内的LDAP服务器都建立这样一种联系,使得用户不必记住每个LDAP服务器都存储些什么内容以及它们的地址,只要记住离自己最近的LDAP服务器就可以了,如果用户要操作的内容不在该服务器上,会自动地寻找直到找到正确的服务器,得到正确的内容为止。
六、LDAP的主从备份功能
       安全机制中一个重要的内容就是备份和恢复,在LDAP中提供了主从备份服务器的机制,它方便和经济地实现了备份和恢复的功能。下面介绍主从服务器的配置方法和运行过程。
主服务器为了表明当前所运行服务进程的身份,必须在其配置文件(slapd.conf)中注明,并且还标明所有从(备份)服务进程的地址(IP或域名);从(备份)服务进程中需要标明它所面对的主服务进程的地址(IP或域名)。
主服务进程配置文件:
# Just show the necessary portion for replicate, ‘389’ is the port number
replica          host=172.26.20.98:389
               binddn=“adm=replica99,ou=nudt,o=cs,c=cn”
               bindmethod=simple      credentials=passwd
# The second slave server
replica          host=172.26.20.97:389
               。
               。
               。
(注):
binddn是主server向该从server发出操作命令时使用的身份。
    Bindmethod是标明使用的身份验证的方法,可以是“用户名+密码”也可以是kerberos方法。
    Credentials分别为密码和认证书

从server配置文件:
# Just show the necessary portion for replicate,98 is the IP of the master server
referral          ldap://172.26.20.98
updatedn        “adm=replica99,ou=nudt,o=cs,c=cn”
# Give updatedn the right to write the Directory Tree
access  to “.*,o=cs,c=cn”
       by “cn=replica99,ou=nudt,o=cs,c=cn”  write

(注):
referral:是当在本地无法提供信息数据时,提供下一个服务器的地址,可以通过再一次查询获取数据。
在备份服务进程的配置文件中,不必使用referral,因为它不真正的提供索引服务。
启动顺序
将主服务进程上的数据库文件拷贝给各个从(备份)服务进程,达到最初的一致。
启动主服务进程上的slapd进程
启动从服务进程上的slapd进程
启动主服务进程上的slurpd进程
slurpd是可以定时把主服务器上的修改进行备份,依据是由写操作产生的日志,如果由于网络的原因导致了备份失败,slurpd会自动进行重试,直到备份成功。
日志
设置在主服务进程r服务器上,需要修改配置文件:
# For log of the LDAP server ,you can set the file name you like
replogfile         /home/ldap/nhpce.replog
实际此文件只是给slurpd进程使用,作为一个广播操作命令的中转站,真正的日志文件在/var/tmp下,文件名称为slurpd.replog。
一个主服务器的从服务器个数是没有限制的,通过以上设置,可以产生了一个由主服务器进程和一个或几个从服务进程组成的服务机群,主守护进程作为整个服务机群的核心,其始终维持系统信息的一致性,因为除了查询以外的请求都首先由它操作自己的信息库,然后再将该操作广播给各个从服务器,同步更新各自的信息库。而对于查询请求,由于不会造成信息内容的改变,所以可以由各个从服务器完成,这样的方式特别适用于象目录服务这样查询请求远远多于修改等请求的应用。

下面是一个主服务器和多个从服务器组成的服务机群处理访问的步骤:
客户向服务机群发出请求(客户使用的可能是IP或域名),此请求可以被一个前端的域名服务器转给一个从服务进程。
从服务进程将除了搜索以外的请求发向主服务进程。
主服务进程根据请求成功完成相应操作之后,将操作广播给所有的从服务进程。
从服务进程r此时完成主服务进程要求的操作。
从服务进程将操作结果返回给客户。

图3
这样的服务器机群,每个从服务器都有一个主服务器信息的完全备份,当出现主服务器因为各种原因无法提供服务或无法恢复其信息数据时,则可将备份服务器上的数据信息转移到主服务器上,继续提供服务;或者直接将备份服务器的配置文件进行修改,从新启动服务进程,将其身份变为主服务进程。而且这些处理都十分方便。如果在平时就做好准备,那么可以在极短的时间内恢复服务。
实际上,不但一个主服务器可以对应多个从服务器,而且一个从服务器可以从多个主服务器上备份信息,形成一个主备的服务机群。
        采用主备关系服务机群的系统逻辑视图如下:                                        

 

图4
        在上图中,设置了两个主服务信息库,它们平时可以是各不相干的角色,管理各自的域内事务,而后面的两个备份信息库则为了提高使用效率,同时作为了两个主服务信息库的备份库。对于上面两种方式的实现,其配置文件的写法大体相同。
不仅如此,多个LDAP服务器之间可以互为主从关系,即每个服务器都把自己管理部分定义为主服务信息库,而其他所有的LDAP服务器把与之相应的信息库定义为该主信息库的从信息库。这样,实际上每个LDAP服务器的地位是平等的,存储的信息则包括了全局的信息。每个单位只有对本单位的LDAP服务器上本单位的信息具有写和修改的权限。而修改的同时各个单位的LDAP服务器上的相应的信息就都修改了,每个单位的用户都可以在本地的LDAP上访问全局的信息,而且基本上能保证是最新的信息,这种方式有响应时间短,资源利用率高,抗毁能力强的优点。充分地发挥了分布式系统特点。缺点是每一次写操作都要广播到每个LDAP服务器,增加了网络的负担。但因为目录服务的特点是读操作远远大于写操作,实际上对网络负载影响不大。具体逻辑关系见下图。
图5
在配置上需要在每个LDAP服务器上建立相应的slapd.conf文件,在配置文件中声明自那部分是主服务器并定义每个从服务器的位置和权限。自己作为从服务器从那些LDAP服务器中以什么身份取得那些信息。下面举例说明。在国家高性能计算环境中基于LDAP的目录服务采用了这种组织形式,它的LDAP的配置文件如下,本地服务器是国防科大。
下面是slapd.conf简化了的写法。

#NHPCE Slapd Configure File
include                /etc/openldap/slapd.oc.conf
include                /etc/openldap/slapd.at.conf
schemacheck        on
pidfile                /var/run/slapd.pid
argsfile        /var/run/slapd.args
access to attr=userpassword
        by self                                                read
        by dn="cn=Manager_nudt,grp=GENERAL,ou=NUDT,o=CS,c=CN"        read
        by *                                                none       

#ldbm definition for the NUDT master database
database        ldbm
suffix                "ou=NUDT,o=CS,c=CN"
directory        /etc/openldap/database/nudt_db
rootdn                "cn=Manager_nudt,grp=GENERAL,ou=NUDT,o=CS,c=CN"
replogfile        /etc/openldap/database/nudt_db/slapd.replog
replica                host=159.226.39.173:389
                binddn="cn=Replicator_nudt,grp=GENERAL,ou=NUDT,o=CS,c=CN"
                bindmethod=simple
                credentials=secret
replica                host=159.226.39.144:389
                binddn="cn=Replicator_nudt,grp=GENERAL,ou=NUDT,o=CS,c=CN"
                bindmethod=simple
                credentials=secret
index                default                none
defaultaccess                                                read
access to dn=".*,grp=general,ou=nudt,o=cs,c=cn"        attr=userpassword
        by self                                                write
        by *                                                none
access to dn=".*,grp=general,ou=nudt,o=cs,c=cn"        attrs=email,telephone,description
        by self                                                write
        by *                                                read       
access to dn="cn=Manager_nudt,grp=GENERAL,ou=NUDT,o=CS,c=CN"
        by *                                                none
access to dn="cn=Replicator_nudt,grp=GENERAL,ou=NUDT,o=CS,c=CN"
        by self                                                write
        by *                                                none
lastmod                                                        on

#ldbm definition for the NUDT slave database
database        ldbm
suffix                "ou=CAS,o=BJ,c=CN"
directory        /etc/openldap/database/cas_db
rootdn                "cn=Replicator_cas,grp=GENERAL,ou=CAS,o=BJ,c=CN"
updatedn        "cn=Replicator_cas,grp=GENERAL,ou=CAS,o=BJ,c=CN"
index                default                none
defaultaccess                                                read       
 
#ldbm definition for the JNICT slave database
database        ldbm
suffix                "ou=JNICT,o=WX,c=CN"
directory        /etc/openldap/database/jnict_db
rootdn                "cn=Replicator_jnict,grp=GENERAL,ou=JNICT,o=WX,c=CN"
updatedn        "cn=Replicator_jnict,grp=GENERAL,ou=JNICT,o=WX,c=CN"
index                default                none
defaultaccess                                                read       
七、 LDAP的应用前景
目录服务系统将在越来越多的网络应用系统中使用,特别是一些大型的网络应用(一些大型网站也会需要)当中,这也是各个大公司为什么要将此作为网络基础软件来看待。
集中单点管理、分布容错和单一登入点(包括合理的认证服务)的功能是具有巨大的诱人优势。
使用LDAP可以开发大的应用软件项目,比如可以应用在C4ISR中,当然会还有其它应用。
小的项目也会需要目录服务的的支持,目录服务是一个在逻辑上集中存储资源信息的特殊数据库,许多数据库开发都可以用LDAP替代,而且LDAP更易于开发,更灵活。
目录服务系统将从现行的V2、V3继续发展,具有目录服务功能的网络DEN(发布、发现和获取)即将出现,不经对网络上的高层资源进行集中管理,而且对网络基础设备的集中管理,例如:具有目录路由器。一句话:就是DEN将网络服务和网络设备的管理更好地继承到普通管理技术中。

发布了13 篇原创文章 · 获赞 2 · 访问量 9万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章