LDAP - 数据存储的一种思考方式

来源:互联网 发布:庞绍堂 知乎 编辑:程序博客网 时间:2024/05/16 10:31

(1) 什么是LDAP

LDAP, Lightweight Directory Access Protocol, 轻量级目录访问协议,是X.500协议的简化版本。LDAP的规范为RFC 2251(ftp://ftp.isi.edu/in-notes/rfc2251.txt),"The Lightweight Directory Access Protocol (v3)"。Microfost的Active Directory,Lotus的Domino Directory、IBM的WebSphere都是LDAP的实现,LDAP的开源实现是OpenLDAP。

LDAP由以下几部分组成:

LDAP协议,一个标准的、可扩展的Internet目录访问协议;
使用目录的四种模型:信息模型,信息如何存储;命名模型,如何安排和引用目录数据;功能模型,如何操作数据;安全模型,如何进行访问控制;
LDIF,LDAP Data Interchange Format,标准的交换目录数据的文本格式;
LDAP服务软件;
和LDAP服务软件捆绑在一起的命令行工具和基于LDAP的应用程序;
LDAP编程API,用于开发LDAP客户应用程序。

(2) LDAP协议

客户端发起一个请求消息,请求LDAP服务器的某条目录信息,该请求包含唯一的消息ID,如下图。


服务器收到该请求后,返回客户需要的信息,然后在一条独立的消息中返回结果代码。客户端也可以在一条消息中请求多条目录信息,服务器依次返回这些目录条目,并在最后一条消息中返回结果代码,如下图。


客户端还可以同时发出多条请求消息,服务器响应这些请求,响应中包含请求消息ID,如下图。


LDAP协议的操作分为三大类:

查询操作:search, compare
更新操作:add, delete, modify, modify DN(rename)
认证和访问控制:bind, unbind, abandon

下图是一个典型的LDAP协议操作过程。


I. 客户端向LDAP服务器打开TCP连接,提交一个bind操作,该操作包含客户用来炎症的目录条目,以及验证凭据(通常为口令或者证书);
II. 服务器验证成功后返回成功结果给客户;
III. 客户端发起search请求;
IV - V. 服务器处理请求,返回两条结果;
VI. 服务器发送结果代码;
VII. 客户端发起一个unbind请求
VIII. 服务器关闭连接

BER,Basic Encoding Rules,与系统无关的紧凑性数据编码规则,用于编码整数、字符串等数据类型,SNMP采用了这种数据编码规则。LBER,Lightweight BER,LDAP使用的一种简化的BER编码规则。可见,LDAP在网络上传输的数据是非文本的,这和HTTP协议及SMTP协议有所不同。

(3) LDAP命名模型

LDAP有两种命名方式:传统的命名方式和基于Internet的命令方式,下图展示了这两种方式。



传统的命令方式



Internet命名方式

在命令模型中,有两个重要的概念:

DN,Distinguished name,节点引用的唯一名称,比如uid=babs,ou=People,dc=example,dc=com。
RDN,Relative Distinguished Name ,相对的节点名称,比如uid=babs。

(4) LDAP信息模型

LDAP存储信息的基本单位是Entry,一个节点为一个Entry;
每个Entry有一套Attributes;
每个Attribute有Type和一个或者多个Values;
Type有语法规则(哪些值才能赋给这种类型的属性)和匹配规则;
匹配规则由比较规则和排序规则组成,比如caseIgnoreMatch和integerMatch;
Entry的属性是由Schema来定义的。

(5) LDAP功能模型

这里只介绍搜索,其他部分参考后文。在LDAP的搜索中,共有8个选项:

Base Object,搜索的起始根路径;
Search Scope,分三类:base,只检索Base Object; onelevel,检索Base Object下面的第一层目录;sub,检索从Base Object开始的所有下层目录;
Dereferencing选项,是否解除别名节点的引用;
Size Limit,返回的Entries的数目,0为不限制;
Time Limit,0为不限制;
Attribute Only参数,true指示只返回属性类型,否则类型和值都返回;
Search Filter,搜索过滤条件;
要求搜索返回的属性列表,默认为都返回。

(6) LDAP安全模型

Bind操作把DN和用户口令传给LDAP服务器进行认证,LDAP服务器检查DN对应的userPassword属性是否和用户提供的口令一致, 这种认证可用TLS(LDAPv3)保护,也可选用SASL认证。Unbind操作断开和LDAP服务的连接。Abandon操作把Message ID发给LDAP服务器,丢弃已经初始化的LDAP操作。

(7) LDIF文件格式

LDIF按作用可分为两大类:添加数据类和更新数据类。以下为一个典型的添加数据类的格式:

dn: dc=example,dc=com
objectclass: dcObject
objectclass: organization
o: example
dc: example

dn: cn=Manager,dc=example,dc=com
objectclass: organizationalRole
cn: Manager

dn: ou=People,dc=example,dc=com
objectclass: top
objectclass: organizationalUnit
ou: People

dn: uid=yingyuan,ou=People,dc=example,dc=com
objectClass: Top
objectClass: Person
objectClass: OrganizationalPerson
objectClass: InetOrgPerson
uid: yingyuan
cn: Yingyuan Cheng
sn: Cheng
userPassword: yingyuan
mail: yingyuan@staff.example.com.cn
description: A little little boy living in the big big
world.
jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALDA4MChAODQ4
SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnP

需要注意的地方是,续行的时候第一个字符必须为空格,如果属性值是Base64编码的,必须要有两个冒号。

数据更新有好几种情况,仅仅为数据添加的方式比如:

dn: uid=bjensen, ou=people, dc=example, dc=com
changetype: add
objectclass: top
objectclass: person

数据删除比如:

dn: uid=bjensen, ou=people, dc=example, dc=com
changetype: delete

数据修改比如:

dn: uid=bjensen, ou=people, dc=example, dc=com
changetype: modify
add: telephoneNumber
telephoneNumber: +1 216 555 1212
dn: uid=bjensen, ou=people, dc=example, dc=com
changetype: modify
delete: telephoneNumber
telephoneNumber: +1 216 555 1212
dn: uid=bjensen, ou=people, dc=example, dc=com
changetype: modify
replace: telephoneNumber
telephoneNumber: +1 216 555 1212
telephoneNumber: +1 405 555 1212
dn: uid=bjensen, ou=people, dc=example, dc=com
changetype: modify
add: mail
mail: bjensen@example.com
-
delete: telephoneNumber
telephoneNumber: +1 216 555 1212
-
delete: description
-

后一个例子把集中更新操作放在一个文件里。

此外更新操作还有目录的移动和重命名,比如:

dn: uid=bjensen, ou=People, dc=example, dc=com
changetype: moddn
newsuperior: ou=Terminated Employees, dc=example, dc=com
dn: uid=bjensen, ou=People, dc=example, dc=com
changetype: moddn
newrdn: uid=babsj
deleteoldrdn: 0

(8) LDAP命令行实战

# 搜索主机ldap.example.com,范围为dc=example,dc=com以及其子目录,
# 过滤条件为cn=Barbara Jensen
$ ldapsearch -h ldap.example.com -s sub -b "dc=example,dc=com" "(cn=Barbara Jensen)“

# 仅搜索基目录,过滤条件为所有类
$ ldapsearch -h ldap.example.com -s base -b /
"uid=bjensen,ou=people,dc=example,dc=com" "(objectclass=*)"

# 搜索用户为uid=bjensen,ou=people,dc=exampe,dc=com
# 口令为hifalutin
$ ldapsearch -h localhost -D "uid=bjensen,ou=people,dc=example,dc=com" /
-w hifalutin -s sub -b "dc=example,dc=com" "(cn=Barbara Jensen)“

# 仅返回mail, roomNumber属性
$ ldapsearch -h localhost -s sub -b "dc=example,dc=com" "(cn=Barbara Jensen)" /
mail roomNumber

# 返回所有属性和操作属性
$ ldapsearch -h localhost -s sub -b "dc=example,dc=com" "(cn=Barbara Jensen)" /
"*" modifiersName modifyTimeStamp

# 过滤条件为或连接
$ ldapsearch -h localhost -s sub -b "dc=example,dc=com" "(|(L=cupertino)(L=sunnyvale))"

# 过滤条件为复合条件
$ ldapsearch -h localhost -s sub -b "dc=example,dc=com" /
"(&(|(L=cupertino)(L=sunnyvale))(objectclass=person))"

# 从ldif文件中更新数据(updates.ldif含changetype)
$ ldapmodify –h ldap.example.com –D "cn=directory manager" –w secret < updates.ldif

# 从ldif文件中添加数据(不含changetype)
$ ldapmodify –h ldap.example.com –D "cn=directory manager" –w secret –a < updates.ldif

# 更新数据的过程中如果遇到错误则继续(-c)
# 并把错误写入rejects.ldif文件(-e rejects.ldif)
$ ldapmodify –h ldap.example.com –D "cn=directory manager" –w secret /
–c –e rejects.ldif < updates.ldif

(9) LDAP 编程API

ldap_search() Searches for directory entries
ldap_compare() Tests whether an entry contains a given attribute value
ldap_bind() Authenticates (proves your identity) to a directory server
ldap_unbind() Terminates an LDAP session
ldap_modify() Makes changes to an existing directory entry
ldap_add() Adds a new directory entry
ldap_delete() Deletes an existing directory entry
ldap_rename() Renames an existing directory entry (this function is named
ldap_modrdn() in LDAPv2-only SDKs)
ldap_result() Retrieves the results of one of the previous operations

参考资料:

Addison Wesley - Understanding And Deploying Ldap Directory Services 2Nd Ed 2003
http://www.openldap.org

 
原创粉丝点击