轻度目录访问协议的分析
张军 颜凯
摘 要 本文详细阐述了轻度目录访问协议,包括该协议数据报的分析以及协议操作中服务器与客户端的处理过程等大量细节。
关键词 目录服务,LDAP,身份认证,Kerberos,SASL
THE ANALYSIS OF THE LIGHT WEIGHT DIRECTORY
ACCESS PROTOCOL
Zhang Jun Yan Kai
Information Center of University of Electronice and Technology, Sichuan.Chengdu 610054
Abstract This article illustrates the Light Weight Directory Access Protocol including the details of the protocol message and the process of the protocol operations between the servers and the clients .
Keywords Directory Service, LDAP,Authentication, Kerberos, SASL
1 概述
随着因特网技术的迅猛发展,网络管理特别是基于用户和应用的网络管理,成为网络进一步有序发展的关键。为此,人们提出了使用目录服务管理网络上的所有 资源,使网络上的所有资源在管理员、用户和应用程序面前都表现为一个有序的目录结构;用户和应用程序可以通过目录授权访问这些资源。
实现通用式目录服务的主要标准是1993年版ITU-T X.500系列建议标准。ISO接受此建议,把它作为ISO9594国际标准。此建议系列规定了信息模型,通信协议,安全认证等各个方面。然而不幸的是,X.500系列协议并不支持TCP/IP协议。
于是,IEIF下的ASID小组制定了轻度目录访问协议(Light Weight Directory Access Protocol,简称LDAP),其目标是用较小的代价在因特网上实现X.500大多数的功能。最终LDAP用相当于X.500标准10%的代价完成了其90%的功能。这使得LDAP成为了因特网目录服务的标准。
2 LDAP协议分析
2.1 协议模型
LDAP协议采用的协议模式是:一个客户端请求服务器代替它执行协议操作并把结果返回。在这一模型中,自始至终都是客户处于主动,客户传送一个协议请 求到服务器,服务器负责在目录中执行该请求必要的操作。执行完这些必要操作之后,服务器向发出请求的客户返回一个响应,响应中包含了执行请求所获得的任何 结果或错误。客户不再需要与服务器联系时,由客户断开连接。
图1 LDAP协议模型示例 在LDAP版本1和版本2中,服务器如果发现了操作所需的参考节点,会继续跟踪执行 协议操作,它只向客户返回最终结果。这种操作模式可能会带来性能上的问题。为了解决这一问题,在版本3中允许服务器向客户端返回指向其它服务器的参考指 针。这就使得服务器可以不用联系其它服务器以继续其操作,而是把这个服务器指针返回给客户,由客户完成操作。这虽然增加了一些客户的复杂度,但是大大提高 了性能和分布式应用的能力。从工程角度看还是值得的。 |
图2 目录信息树示例 图2描述了一个目录信息树。目录信息树的根(root)是一个虚根,并没有实际意义。树中的任意一个节点都是目录信息树的一个入口(Entry)。每一个节点旁的标注指明了该入口的一个或多个属性值,构成了该入口的相关辨识名(Relative Distinguished Name,简称RDN),把该入口与其它同级入口区别开来。从特定入口到根的直接下级入口的相关辨识名序列形成了该特定入口的辨识名(Distinguished Name,简称DN),可以在整个树中标识该入口。 2.3 协议要素 |
messageID | protocolOp | controls |
LDAPMessage的功能是提供一个协议封套,其中包含了所有协议交换所必须的公共域。现在仅有的公共域是数据报标识符Message ID和控制符controls。 . 字符串类型 LDAP协议中的字符串类型包括LDAPString和LDAPOID两种。 LDAPString用于描述LDAP协议中的字符串类型。虽然LDAPString的字符串类型是作为八位组字符串(OCTET STRING)编码的,但是它仍然使用了ISO 10646字符集,其编码算法采用UTF-8。在UTF-8算法中,与ASCII字符(0x0000-0x007F)相同的字符采用与ASCII字符集相 同的单字节表示方式。其它的字节值则被用于形成任意字符的可变长度编码。 LDAPString::= OCTET STRING LDAPOID用于描述LDAP协议中的对象标识符。字符串的允许值是采用点分十进制数值表示法,它也是经过UTF-8编码的。 LDAPOID::= OCTET STRING 例如:1.3.6.1.4.1.1466.1.2.3 . 结果数据报 LDAP协议使用LDAPResult结构从服务器向客户返回成功或失败的指示。为了响应多种请求,服务器返回的响应将包括LDAPResult类型字段以指示协议操作请求的最后状态。LDAPResult数据报是一个队列,队列中元素的格式如下: |
resultCode | matchedDN | errorMessage | referral |
2.3.2 绑定操作 |
version | name | authentication |
. 绑定响应 绑定请求也是一个请求队列,队列中元素的定义为: |
请求结果 LDAPResult | SASL证书 serverSaslCreds |
2.3.3 解绑定操作 |
baseObject | scope | derefAliases | sizeLimit | ||
timeLimit | typesOnly | filter | attributes |
参数说明如下: 基本对象baseObject——是一个辨识名,指明搜索被执行的目录对象。 搜索范围scope——搜索被执行的范围指针。 解别名参考DerefAliases——指示了别名对象在搜索中如何被处理。 大小限制sizeLimit——限制了搜索结果中返回的最大入口数。0值表示没有客户端请求的大小限制。 时间限制timeLimit——允许一个搜索执行的最大时间。0值表示没有客户端请求的时间限制。 只含类型typesOnly——指示搜索结果是包含属性类型和属性值,还是只包括属性类型。 过滤器filter——搜索匹配一个给出的入口时所必须满足的条件。 属性attributes——应当从每一个匹配的入口中返回的属性列表。不管此列表为空还是为“*”,都表示所有的用户属性被返回。 服务器在收到一个搜索请求之后,将执行搜索操作,并把结果放在搜索响应中返回。搜索响应是一些LDAPMessage数据报,每一个数据报中都包含了 SearchResulEntry、SearchResultReference、ExtendedResponse或者 SearchResultDone中的某一个数据类型。 SearchResultEntry是一个队列,其元素定义为: |
objectName | attributes |
参数说明如下: 对象名称objectName——与搜索条件匹配的目录对象名称。 属性attributes——返回的特定属性列表。 SearchResultReference也是一个队列,其中包含了一个或多个LDAPURL指向其它服务器。 SearchResultDone中包含一个LDAPResult包,给出搜索的最终状态。 如果LDAP会晤是在一个面向连接的传输协议上进行,则服务器将向客户返回一个响应队列,这个响应队列被封装在一些分开的LDAPMessage数据 报中。在搜索返回的响应队列中可能存在0个或多个的SearchResultEntry和SearchResultReference,它们之间可以以任 何顺序返回。在这些SearchResultEntry和SearchResultReference返回之后,服务器将返回一个包含 SearchResultDone的响应,指示搜索操作是否成功和发生的错误详情。 下面为一个LDAP搜索示例: 图3是一个含有多个LDAP服务器的目录树实例。 图3 由多服务器组成的一个信息目录树 假设如图3所示的目录树中搜索子树“O=EDU,C=CN”,请求发往已连接服务器HostA,则将有如下返回响应: |
2.3.5 修改操作 |
object | modification |
参数说明如下: 对象object——将被修改的对象,其值为一个LDAPDN类型的值。 修改modificatin——将在入口上执行的修改。其数据格式为: |
operation | modification |
其中操作operation是add、delete和replace中的一个。而此处的修改modification是一个属性类型/值对的列表,提供了入口将被修改成的新值。 2.3.6 增加操作 增加操作允许在目录中添加一个入口。 增加请求的定义为: |
entry | attributes |
参数说明如下: 入口entry——被增加入口的辨识名。 属性列表——构成被增加入口内容的属性。这个列表中必须包含入口的可辨识值(用于形成该入口的RDN),对象类属性以及对象类所强制包含的任何属性。 2.3.7 删除操作 删除操作允许客户请求在目录中删除一个入口。删除请求中包含了要删除入口的LDAPDN值。服务器在删除入口时不会解除别名参考,并且只有叶节点能够被删除。 2.3.8 修改辨识名操作 修改辨识名操作允许客户修改目录中一个入口最左边的成分或者是将入口构成的子树移动到目录中一个新的位置。修改辨识名请求定义为: |
entry | newrdn | deleteoldrdn | newSuperior |
入口entry——将被修改的入口的辨识名。
新的相关辨识名newrdn——用来构成入口新名字最左端成分的相关辨识名。
是否删除旧相关辨识名deleteoldrdn——决定是否删除入口的旧相关辨识名。
新优先级newSuperior——是可选项,其值为LDAPDN类型。如果存在,则表示优先级仅次于现有入口的入口。
在协议要素中还包括比较操作、丢弃操作和扩展操作等协议操作,由于篇幅所限,这里就不再作过多分析,其详情可以参见RFC2251。
2.4 协议要素的编码和传输
LDAP协议要素在交换时使用抽象语法规则1(ASN.1)中的基本编码规则(BER)进行编码。
LDAP协议被设计运行于面向连接,可靠的传输层协议之上。数据流中八位组字符串的任意一位都具有意义。传输控制协议(TCP)
LDAPMessage数据报的协议数据单元直接映射到TCP字节流上。服务器运行监听的TCP端口值建议为389。服务器可以使用替代用的其它端口。客户必须支持在任一合法TCP端口上连接服务器。
2.5 安全考虑
当使用面向连接的传输协议时,LDAPv3提供了与LDAPv2兼容的认证机制:使用明文口令的简单认证和其它一些简单认证和安全层(SASL)机制。LDAPv3安全机制还允许在客户要求时,服务器返回其安全证书。
3 结束语
本文讨论了LDAP协议使用的协议模型、数据模型和协议要素的细节,给出了LDAP协议使用的多种数据报文、请求及响应的详细格式,希望能够对读者掌握LDAP这个下一代因特网服务与应用的基础提供帮助。