LDAP技术总结(本文档由廖武锋编写)第一章LDAP有关技术介绍第一节X.500目录服务OSLX.500目录是基于OSI网络协议的目录服务协议,也是LDAP的前身。但是X.500的缺点是不支持TCP/IP,而是支持OSI协议,显然,在Windows等个人电脑上不可以使用OSI协议,在此前提下,也就产生了访问X.500目录的网关-LDAP。第二节什么是LDAP?LDAP英文全称是LightWeightDirectoryAccessProtocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPmanRFC网页中找到。现在LDAP技术不仅发展得很快而且也是激动人心的。在企业范围内实现LDAP可以让运行在几乎所有计算机平台上的所有的应用程序从LDAP目录中获取信息。LDAP目录中可以存储各种类型的数据:电子邮件地址、邮件路由信息、人力资源数据、公用密匙、联系人列表等等。通过把LDAP目录作为系统集成中的一个重要环节,可以简化员工在企业内部查询信息的步骤,甚至连主要的数据源都可以放在任何地方。第三节SunOneDirectoryServer目录服务第四节WindowsActiveDirectory活动目录ActiveDirectory(AD)是微软为.net中的对象访问定义的目录服务,包括目录服务本身,以及客户端API(ADSI)。AD并不是LDAP在.net中的实现,而是X.500在.net中的实现,但AD前端支持并主要以LDAP形式进行访问。完整地说,AD是基于微软自身定义的X.500扩展的一系列Schema实现的X.500目录服务及相关的访问控制工具的集合,其前端支持LDAP的查询,目的是对.net中涉及的所有网络对象提供目录服务。各个schema在一个树森林中是唯一的。普通的LDAP客户端工具与AD并不兼容。Windows2000自带有一些LDAP客户端工具,包括ldifde.exe,ldp.exe。并提供专门的LDAP程序接口ASDI。同时,可以在WINDOWS管理台上添加AD管理snap-in,配合已有的AD基本管理工作。使用以上工具可以得到微软样式的详情,但总的来说,Windows2000原则上不鼓励用户在AD的基础上进一步的开发,没有更多的开发资料。Windows2000中,访问AD记录的API被集成到了内核,服务于Windows2000从主机权限和对象管理,直接网络的权限和对象管理,同时API细节没有对外公开。因此,某种程度上,AD是一个只对Windows2000有用的目录服务,AD连同访问API,形成一个基于X.500-LDAP的孤岛,从一开始就没有打算与其他厂商产品有兼容的余地,这也是微软的一贯风格。参考:=/windows2000/en/server/help/sag_ADschema_Intro.htm=/library/en-us/netdir/ad/schema_implementation.aspAD在Windows2000中注册表中的位置是:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NTDS\使用AD时,用户可以自行在微软样式的基础上添加新的类和属性,微软称这个就是schema的增添,这与UNIX环境下有一些不同,用户余地较少。如果真的需要添加,可以使用按:的指示一步步做,也可以预先做好ldif文件,使用ldifde.exe一次性地进行添加,效果是一样的。在默认的状况下,Windows2000的AD初始具备三个上下文对象:dc=domainname;微软定义domainname必须是examples.com格式,即dc=example,dc=com;这是定义域名;cn=Configuration,dc=example,dc=com;这一上下文的条目存储设置信息;cn=schema,cn=configuration,dc=example,dc=com;这一上下文的条目存储schema设计信息;第五节LDAP目录服务的优势如果需要开发一种提供公共信息查询的系统一般的设计方法可能是采用基于WEB的数据库设计方式,即前端使用浏览器而后端使用WEB服务器加上关系数据库。后端在Windows的典型实现可能是WindowsNT+IIS+Acess数据库或者是SQLServer服务器,IIS和数据库之间通过ASP技术使用ODBC进行连接,达到通过填写表单查询数据的功能;后端在Linux系统的典型实现可能是Linux+Apache+postgresql,Apache和数据库之间通过PHP3提供的函数进行连接。使用上述方法的缺点是后端关系数据库的引入导致系统整体的性能降低和系统的管理比较繁琐,因为需要不断的进行数据类型的验证和事务的完整性的确认;并且前端用户对数据的控制不够灵活,用户权限的设置一般只能是设置在表一级而不是设置在记录一级。目录服务的推出主要是解决上述数据库中存在的问题。目录与关系数据库相似,是指具有描述性的基于属性的记录集合,但它的数据类型主要是字符型,为了检索的需要添加了BIN(二进制数据)、CIS(忽略大小写)、CES(大小写敏感)、TEL(电话型)等语法(Syntax),而不是关系数据库提供的整数、浮点数、日期、货币等类型,同样也不提供象关系数据库中普遍包含的大量的函数,它主要面向数据的查询服务(查询和修改操作比一般是大于10:1),不提供事务的回滚(rollback)机制,它的数据修改使用简单的锁定机制实现All-or-Nothing,它的目标是快速响应和大容量查询并且提供多目录服务器的信息复制功能。现在该说说LDAP目录到底有些什么优势了。现在LDAP的流行是很多因数共同作用的结果。可能LDAP最大的优势是:可以在任何计算机平台上,用很容易获得的而且数目不断增加的LDAP的客户端程序访问LDAP目录。而且也很容易定制应用程序为它加上LDAP的支持。LDAP协议是跨平台的和标准的协议,因此应用程序就不用为LDAP目录放在什么样的服务器上操心了。实际上,LDAP得到了业界的广泛认可,因为它是Internet的标准。产商都很愿意在产品中加入对LDAP的支持,因为他们根本不用考虑另一端(客户端或服务端)是怎么样的。LDAP服务器可以是任何一个开发源代码或商用的LDAP目录服务器(或者还可能是具有LDAP界面的关系型数据库),因为可以用同样的协议、客户端连接软件包和查询命令与LDAP服务器进行交互。与LDAP不同的是,如果软件产商想在软件产品中集成对DBMS的支持,那么通常都要对每一个数据库服务器单独定制。不象很多商用的关系型数据库,你不必为LDAP的每一个客户端连接或许可协议付费大多数的LDAP服务器安装起来很简单,也容易维护和优化。LDAP服务器可以用“推”或“拉”的方法复制部分或全部数据,例如:可以把数据“推”到远程的办公室,以增加数据的安全性。复制技术是内置在LDAP服务器中的而且很容易配置。如果要在DBMS中使用相同的复制功能,数据库产商就会要你支付额外的费用,而且也很难管理。LDAP允许你根据需要使用ACI(一般都称为ACL或者访问控制列表)控制对数据读和写的权限。例如,设备管理员可以有权改变员工的工作地点和办公室号码,但是不允许改变记录中其它的域。ACI可以根据谁访问数据、访问什么数据、数据存在什么地方以及其它对数据进行访问控制。因为这些都是由LDAP目录服务器完成的,所以不用担心在客户端的应用程序上是否要进行安全检查。LDAP(LightweightDirectoryAcessProtocol)是目录服务在TCP/IP上的实现(RFC1777V2版和RFC2251V3版)。它是对X.500的目录协议的移植,但是简化了实现方法,所以称为轻量级的目录服务。在LDAP中目录是按照树型结构组织,目录由条目(Entry)组成,条目相当于关系数据库中表的记录;条目是具有区别名DN(DistinguishedName)的属性(Attribute)集合,DN相当于关系数据库表中的关键字(PrimaryKey);属性由类型(Type)和多个值(Values)组成,相当于关系数据库中的域(Field)由域名和数据类型组成,只是为了方便检索的需要,LDAP中的Type可以有多个Value,而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不相关的。LDAP中条目的组织一般按照地理位置和组织关系进行组织,非常的直观。LDAP把数据存放在文件中,为提高效率可以使用基于索引的文件数据库,而不是关系数据库。LDAP协议集还规定了DN的命名方法、存取控制方法、搜索格式、复制方法、URL格式、开发接口等。LDAP对于这样存储这样的信息最为有用,也就是数据需要从不同的地点读取,但是不需要经常更新。例如,这些信息存储在LDAP目录中是十分有效的:1公司员工的电话号码簿和组织结构图2客户的联系信息3计算机管理需要的信息,包括NIS映射、email假名,等等4软件包的配置信息5公用证书和安全密匙什么时候该用LDAP存储数据大多数的LDAP服务器都为读密集型的操作进行专门的优化。因此,当从LDAP服务器中读取数据的时候会比从专门为OLTP优化的关系型数据库中读取数据快一个数量级。也是因为专门为读的性能进行优化,大多数的LDAP目录服务器并不适合存储需要需要经常改变的数据。例如,用LDAP服务器来存储电话号码是一个很好的选择,但是它不能作为电子商务站点的数据库服务器。如果下面每一个问题的答案都是“是”,那么把数据存在LDAP中就是一个好主意。第一需要在任何平台上都能读取数据吗?第二每一个单独的记录项是不是每一天都只有很少的改变?第三可以把数据存在平面数据库(flatdatabase)而不是关系型数据库中吗?换句话来说,也就是不管什么范式不范式的,把所有东西都存在一个记录中(差不多只要满足第一范式)。第四最后一个问题可能会唬住一些人,其实用平面数据库去存储一些关系型的数据也是很一般的。例如,一条公司员工的记录就可以包含经理的登录名。用LDAP来存储这类信息是很方便的。一个简单的判断方法:如果可以把保数据存在一张张的卡片里,就可以很容易地把它存在LDAP目录里。第六节LDAP安全和访问控制LDAP提供很复杂的不同层次的访问控制或者ACI。因这些访问可以在服务器端制,这比用客户端的软件保证数据的安全可安全多了。用LDAP的ACI,可以完成:第一给予用户改变他们自己的电话号码和家庭地址的权限,但是限制他们对其它数据(如,职务名称,经理的登录名,等等)只有“只读”权限。第二给予“HR-admins组中的所有人权限以改变下面这些用户的信息:经理、工作名称、员工号、部门名称和部门号。但是对其它域没有写权限。第三禁止任何人查询LDAP服务器上的用户口令,但是可以允许用户改变他或她自己的口令。第四给予经理访问他们上级的家庭电话的只读权限,但是禁止其他人有这个权限。第五给予“host-admins组中的任何人创建、删除和编辑所有保存在LDAP服务器中的与计算机主机有关的信息第六通过Web,允许“foobar-sales组中的成员有选择地给予或禁止他们自己读取一部分客户联系数据的读权限。这将允许他们把客户联系信息下载到本地的笔记本电脑或个人数字助理(PDA)上。(如果销售人员的软