LDAP(Lightweight Directory Access Protocol)是一种基于计算模型的客户机/服务器X.500目录服务访问协议。LDAP是从X.500目录访问协议的基础上发展过来的,它是对X.500的简化,它和X.500的主要区别在于:
LDAP客户端和LDAP服务器端交互的一般过程
LDAP和RFC文档
LDAP协议的版本目前是3.0,它是有一系列RFC组成成的:
RFC2251 Light-weight Directory Access Protocol
主要定义了LDAP的操作、在客户端和服务器之间的交换的消息格式。为了更好地支持国际化,它规定数据用UTF-8表示。此外,相对旧版本RFC2251又添加了referral的功能,并把schema本身存放到目录中,使得客户端可以读取schema信息
RFC2252 Light-weight Directory Access Protocol -- Attribute Syntax Definition
RFC2253 Light-weight Directory Access Protocol -- UTF-8 String Representation of Distinguished Names
RFC2254 Light-weight Directory Access Protocol -- The String Representation of LDAP Search Filters
RFC2255 Light-weight Directory Access Protocol -- The LDAP URL format
RFC2256 A summary of X.500 user schema for use with LDAP v3
一些常用的objectClass和属性已经由X.500定义,该RFC对这些在LDAP中使用的objectClass作了总结。
LDAP的四层模型
Information model
目 录条目是LDAP中最基本的表示信息的单元,每个目录条目可以一个以上的属性,和编程语言及数据库类型定义中的属性不同,LDAP中的属性允许多值。每个 属性都属于一种类型,类型规定了属性允许存放的值的约束条件,同时也规定了该类型的数据进行比较时规则,这一点类似于关系数据库中的字符型数据的 collation。LDAP中是用语法(syntax)这一概念来表式属性的取值约束和比较规则的。常用的LDAP Syntax有:
bin 二进制信息
ces 大小写敏感比较,也就是所谓的directory string
cis 大小写不敏感比较
tel 电话号码,字符串中的空格、减号在比较时会被去掉
dn 标识
Generalized Time
Postal Address
属性定义在LDAP中是全局的,属性名称通常有简写形式,常用的属性如下:
commonName, cn cis John Smith
surname, sn cis Smith
telephoneNumber tel 021-34354576
organizationalUnitName, ou cis it
owner dn cn=John Smith, o=SUN, c=CN
organization, o cis SUN
jpegPhoto bin
在 属性的基础上LDAP还用schema进一步约束目录条目。schema是一种类型定义机制,每种类型定义又成为objectClass,它规定一个该类 型的目录条目实例必须的和可选的属性等其它约束。和面向对象的编程语言相似,objectClass支持继承,并且所有的objectClass都是 top的子类型,因为top定义了必须的属性objectClass,所以所有的目录条目实例都有objectClass这个属性。常见的 objectClass有:
InetOrgPerson, OrganizationalUnit, Organization
extensibleObject允许任何属性。
Naming model
DN是无歧义标识一个目录条目的名字。DN的语法如下:
DistinguishedName = [name]
name = name-component *(, name-component)
name-component = attributeTypeAndValue*("+" attributeTypeAndValue)
attributeTypeAndValue = attributeType "=" attributeValue
attributeType = (ALPHA 1*keychar) / oid
keychar = ALPHA / DIGIT / "-"
oid = 1*DIGIT *("." 1*DIGIT)
attributeValue = string
...
由此可见,如果在RDN中有多个属性则需将它们用加号"+"连接。比如,cn=John Smith+l=Shanghai,o=SUN,c=CN。此外,属性也可以用OID来表示,比如cn=John Smith等价于2.5.4.2 = John Smith。
以下是常用的属性名和它代表的意义(在LDAP中属性名大小写不敏感):
CN 常用名称,常常是DN的一部分
L 地名,通常是城市的名称
ST 州或省的名称
O 组织名称
OU 组织单位
C 国家名称
STREET 街道地址
DC 域名成分
UID 用户标识
后缀(suffix)是目录信息树中顶层节点的DN,一个LDAP服务器可以存放多个后缀。
引 用(referral)是一种将分布在不同LDAP服务器中目录信息子树连接成逻辑上的一棵完整树的机制。创建referral将目录条目增加一个值为 "referral"的objectClass,并将属性ref设成引用的目录树的LDAP URL。引用过程的大致步骤是:
LDAP客户端发出查询请求
LDAP服务器发现该请求目录信息不在该服务器上,但服务器保存了这些信息的引用,服务器就返回一个引用,用LDAP URL告诉客户端真正的信息源的位置
LDAP客户端接受到引用后,决定是否根据引用向真正的目录信息源发请求
与referral相对应的是chaining,它和referral的区别在于referral要求客户端解析引用,而chaining是由服务器来完成的。chaining过程的大致步骤是:
LDAP客户端发出查询请求
LDAP服务器发现该请求目录信息不在该服务器上,但服务器保存了这些信息的引用,服务器就信息源发出请求,取得信息并返回给客户端
LDAP客户端响应
referral是LDAP v3定义的,但chaining并不属于LDAP v3的范畴。
LDAP v3规定了LDAP服务器必须将自己的信息存放在一个特殊的DN下(又称root DSE),主要的信息是:
服务器存放的后缀
存放schema的DN
该服务器支持的LDAP的版本
支持的SASL安全机制
Functional model
Functional model是指访问和更新LDAP目录信息的机制。LDAP的操作基本上有三类:查询、更新和认证
查询是LDAP中最复杂的操作,它允许客户端指定查询的起点、查询的深度、属性需要满足的条件以及最终返回的目录条目所包含的属性。
查 询的起点是通过base DN来指定的,查询的深度即范围有三种baseObject, singleLevel, wholeSubtree。baseObject只对base DN指定的目录条目进行查询;singleLevel只对base DN的直接子节点进行查询; wholeSubtree对base DN(包括base DN)的所有子节点查询。属性需要满足的条件是用search filter来表达的。此外,还可以指定别名的解析(Aliase Dereferrencing)和查询的结果集大小限定和查询时间限定。
search filter的基本语法是:
attribute operator value
主要的操作符有:=, >=, <=, =*, ~=其中=*可以表示匹配子字符串,~=近似相等。例子有sn=*表示sn有值的所有目录条目。cn=J*Smi*, sn~=smit。
多个简单filter可以用关系操作符组成复合表达式,基本语法是:
(&(filter1)(filter2)...(filtern))
(|(filter1)(filter2)...(filtern))
(!(filter))
例子有:(|(sn=Miler)(sn=Smith)), (|(sn=Miler)(&(ou=Austin)(sn=Smith)))
更新操作
LDAP定义了以下更新操作:
add 创建新的目录条目到目录树种
delete 删除目录条目,只有叶子节点可以删除,删除别名并不影响被引用的节点
modify 修改目录条目的属性,包括增加、删除属性
modify DN 移动目录树
认证操作
LDAP定义了以下认证操作:
bind 该操作用于在LDAP的客户端和服务器之间建立会话
unbind 该操作用于结束LDAP会话
abandon 该操作用于放弃前一个操作
control和Extended Operation
Control 和Extended Operation用来在不修改LDAP协议本身的前提下扩展LDAP的功能。control用来修改操作的行为,Extended Operation用来增加新的操作。每个control由标识、参数、重要性构成。如果重要性为TRUE,那么服务器要么处理该control,要么完 全不支持该control;如果重要性为FALSE,那么那些无法支持该control的服务器可以忽略该control。Extended Operation由标识、参数构成。
LDIF文件格式
LDAP协议定义LDIF文件格式用于在不同的LDAP实现产品之间交换数据。LDIF的字符编码必须是UTF-8。LDIF文件的基本格式如下:
[ ]
dn:
objectClass:
objectClass:
...
attributeType[;language tag]:attributeValue
attributeType[;language tag]:attributeValue
...
在LDIF文件中表示二进制数据时必须使用base64编码。凡是base64编码的数据用两个冒号开头,例如:jpegPhoto:: 。以&ldquo#&rdquo开头的行是注释行,以单个空格开始的行表示与前一行在逻辑上同一行。
- LDAP是基于TCP/IP的,而X.500是基于OSI网络协议栈,OSI很少有真正的应用
- LDAP删除了X.500中一些繁琐而不常用的功能
- LDAP使用了更简洁的字符串来表示数据,而非比较复杂的结构化语法ASN1 (Abstract Syntax Notation One)
LDAP客户端和LDAP服务器端交互的一般过程
- LDAP客户端发起连接请求与LDAP服务器建立会话,LDAP的术语是绑定(binding)。在建立绑定时客户端通常需要指定访问用户,以便能够访问服务器上的目录信息。
- LDAP客户端发出目录查询、新建、更新、删除、移动目录条目、比较目录条目等操作
- LDAP客户端结束与服务器的会话,即解除绑定(unbinding)
LDAP和RFC文档
LDAP协议的版本目前是3.0,它是有一系列RFC组成成的:
RFC2251 Light-weight Directory Access Protocol
主要定义了LDAP的操作、在客户端和服务器之间的交换的消息格式。为了更好地支持国际化,它规定数据用UTF-8表示。此外,相对旧版本RFC2251又添加了referral的功能,并把schema本身存放到目录中,使得客户端可以读取schema信息
RFC2252 Light-weight Directory Access Protocol -- Attribute Syntax Definition
RFC2253 Light-weight Directory Access Protocol -- UTF-8 String Representation of Distinguished Names
RFC2254 Light-weight Directory Access Protocol -- The String Representation of LDAP Search Filters
RFC2255 Light-weight Directory Access Protocol -- The LDAP URL format
RFC2256 A summary of X.500 user schema for use with LDAP v3
一些常用的objectClass和属性已经由X.500定义,该RFC对这些在LDAP中使用的objectClass作了总结。
LDAP的四层模型
- Information model 描述LDAP目录结构
- Naming model 描述目录条目的唯一标识方法
- Functional model 描述LDAP支持的操作
- Security 描述目录信息的访问控制
Information model
目 录条目是LDAP中最基本的表示信息的单元,每个目录条目可以一个以上的属性,和编程语言及数据库类型定义中的属性不同,LDAP中的属性允许多值。每个 属性都属于一种类型,类型规定了属性允许存放的值的约束条件,同时也规定了该类型的数据进行比较时规则,这一点类似于关系数据库中的字符型数据的 collation。LDAP中是用语法(syntax)这一概念来表式属性的取值约束和比较规则的。常用的LDAP Syntax有:
bin 二进制信息
ces 大小写敏感比较,也就是所谓的directory string
cis 大小写不敏感比较
tel 电话号码,字符串中的空格、减号在比较时会被去掉
dn 标识
Generalized Time
Postal Address
属性定义在LDAP中是全局的,属性名称通常有简写形式,常用的属性如下:
commonName, cn cis John Smith
surname, sn cis Smith
telephoneNumber tel 021-34354576
organizationalUnitName, ou cis it
owner dn cn=John Smith, o=SUN, c=CN
organization, o cis SUN
jpegPhoto bin
在 属性的基础上LDAP还用schema进一步约束目录条目。schema是一种类型定义机制,每种类型定义又成为objectClass,它规定一个该类 型的目录条目实例必须的和可选的属性等其它约束。和面向对象的编程语言相似,objectClass支持继承,并且所有的objectClass都是 top的子类型,因为top定义了必须的属性objectClass,所以所有的目录条目实例都有objectClass这个属性。常见的 objectClass有:
InetOrgPerson, OrganizationalUnit, Organization
extensibleObject允许任何属性。
Naming model
DN是无歧义标识一个目录条目的名字。DN的语法如下:
DistinguishedName = [name]
name = name-component *(, name-component)
name-component = attributeTypeAndValue*("+" attributeTypeAndValue)
attributeTypeAndValue = attributeType "=" attributeValue
attributeType = (ALPHA 1*keychar) / oid
keychar = ALPHA / DIGIT / "-"
oid = 1*DIGIT *("." 1*DIGIT)
attributeValue = string
...
由此可见,如果在RDN中有多个属性则需将它们用加号"+"连接。比如,cn=John Smith+l=Shanghai,o=SUN,c=CN。此外,属性也可以用OID来表示,比如cn=John Smith等价于2.5.4.2 = John Smith。
以下是常用的属性名和它代表的意义(在LDAP中属性名大小写不敏感):
CN 常用名称,常常是DN的一部分
L 地名,通常是城市的名称
ST 州或省的名称
O 组织名称
OU 组织单位
C 国家名称
STREET 街道地址
DC 域名成分
UID 用户标识
后缀(suffix)是目录信息树中顶层节点的DN,一个LDAP服务器可以存放多个后缀。
引 用(referral)是一种将分布在不同LDAP服务器中目录信息子树连接成逻辑上的一棵完整树的机制。创建referral将目录条目增加一个值为 "referral"的objectClass,并将属性ref设成引用的目录树的LDAP URL。引用过程的大致步骤是:
LDAP客户端发出查询请求
LDAP服务器发现该请求目录信息不在该服务器上,但服务器保存了这些信息的引用,服务器就返回一个引用,用LDAP URL告诉客户端真正的信息源的位置
LDAP客户端接受到引用后,决定是否根据引用向真正的目录信息源发请求
与referral相对应的是chaining,它和referral的区别在于referral要求客户端解析引用,而chaining是由服务器来完成的。chaining过程的大致步骤是:
LDAP客户端发出查询请求
LDAP服务器发现该请求目录信息不在该服务器上,但服务器保存了这些信息的引用,服务器就信息源发出请求,取得信息并返回给客户端
LDAP客户端响应
referral是LDAP v3定义的,但chaining并不属于LDAP v3的范畴。
LDAP v3规定了LDAP服务器必须将自己的信息存放在一个特殊的DN下(又称root DSE),主要的信息是:
服务器存放的后缀
存放schema的DN
该服务器支持的LDAP的版本
支持的SASL安全机制
Functional model
Functional model是指访问和更新LDAP目录信息的机制。LDAP的操作基本上有三类:查询、更新和认证
查询是LDAP中最复杂的操作,它允许客户端指定查询的起点、查询的深度、属性需要满足的条件以及最终返回的目录条目所包含的属性。
查 询的起点是通过base DN来指定的,查询的深度即范围有三种baseObject, singleLevel, wholeSubtree。baseObject只对base DN指定的目录条目进行查询;singleLevel只对base DN的直接子节点进行查询; wholeSubtree对base DN(包括base DN)的所有子节点查询。属性需要满足的条件是用search filter来表达的。此外,还可以指定别名的解析(Aliase Dereferrencing)和查询的结果集大小限定和查询时间限定。
search filter的基本语法是:
attribute operator value
主要的操作符有:=, >=, <=, =*, ~=其中=*可以表示匹配子字符串,~=近似相等。例子有sn=*表示sn有值的所有目录条目。cn=J*Smi*, sn~=smit。
多个简单filter可以用关系操作符组成复合表达式,基本语法是:
(&(filter1)(filter2)...(filtern))
(|(filter1)(filter2)...(filtern))
(!(filter))
例子有:(|(sn=Miler)(sn=Smith)), (|(sn=Miler)(&(ou=Austin)(sn=Smith)))
更新操作
LDAP定义了以下更新操作:
add 创建新的目录条目到目录树种
delete 删除目录条目,只有叶子节点可以删除,删除别名并不影响被引用的节点
modify 修改目录条目的属性,包括增加、删除属性
modify DN 移动目录树
认证操作
LDAP定义了以下认证操作:
bind 该操作用于在LDAP的客户端和服务器之间建立会话
unbind 该操作用于结束LDAP会话
abandon 该操作用于放弃前一个操作
control和Extended Operation
Control 和Extended Operation用来在不修改LDAP协议本身的前提下扩展LDAP的功能。control用来修改操作的行为,Extended Operation用来增加新的操作。每个control由标识、参数、重要性构成。如果重要性为TRUE,那么服务器要么处理该control,要么完 全不支持该control;如果重要性为FALSE,那么那些无法支持该control的服务器可以忽略该control。Extended Operation由标识、参数构成。
LDIF文件格式
LDAP协议定义LDIF文件格式用于在不同的LDAP实现产品之间交换数据。LDIF的字符编码必须是UTF-8。LDIF文件的基本格式如下:
[ ]
dn:
objectClass:
objectClass:
...
attributeType[;language tag]:attributeValue
attributeType[;language tag]:attributeValue
...
在LDIF文件中表示二进制数据时必须使用base64编码。凡是base64编码的数据用两个冒号开头,例如:jpegPhoto:: 。以&ldquo#&rdquo开头的行是注释行,以单个空格开始的行表示与前一行在逻辑上同一行。