LDAP概念和原理入门浅析

知识铺垫

什么是目录?
(1)目录是一类为了浏览和搜索数据而设计的特殊的数据库,例如:最知名的微软公司的活动目录(active directory)就是目录数据库的一种。目录服务是按照树状形式存储信息的,目录包含基于树形的描述性信息,并且支持高级的过滤功能。

(2)一般来说,目录不支持大多数事务性数据库所支持的高吞吐量和复杂的更新操作。目录进行更新操作,可以说是要么全部,要么都不的原子操作,目录服务适合的业务应用在于提供大量的查询和搜索操作。

(3)为了保证目录数据的可用性和可靠性,他们在确保提供快速的查询和搜索操作的同事,还提供了主从服务器同步目录数据信息的能力,这相当于传统的MySQL数据库的主从同步一样,可以最大限度的确保基于目录业务的持续可用性。

(4)广义的目录服务概念,可以有多重不同的方式来提供目录服务,不同的目录所允许存储的信息是不同的,在信息如何被引用,查询,更新以及防止未经授权的访问等问题上,不同的目录的处理方式也有诸多不同。一些目录服务是本地的,只提供受限的服务,(比如,单机上的finger服务)。另一些服务是大范围的(global),提供广阔得多的服务(比如面向整个因特网)。大范围的服务通常是分布式的,这也就意味着数据是分布在多台机器上的,这些服务器一起来提供目录服务。典型的大范围服务定义一个统一的名称空间(namespace)来给出一个相同的数据视图(data view),而不管你相对数据所在的位置,DNS是一个典型的大范围分布式目录服务的例子。

简介

轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP,/ˈɛldæp/)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。也就是一个访问在线目录服务的协议。

目录服务在开发内部网和互联网程序共享用户、系统、网络服务和应用的过程中占据了重要地位。例如,目录服务可能提供了组织有序的记录集合,通常有层级结构,例如公司电子目录。同理,也可以提供包含了地址和电话号码的电话薄。

LDAP的一个常用用途是单点登录,用户可以在多个服务中使用同一个密码,通常用于公司内部网站的登陆中(这样他们可以在公司计算机上登陆一次,便可以自动在公司内部网上的登录)。

协议内容

LDAP目录与普通数据库的主要不同之处在于数据的组织方式,它是一种有层次的、树形结构。所有条目的属性的定义是对象类object class的组成部分,并组成在一起构成schema;那些在组织内代表个人的schema被命名为white pages schema。数据库内的每个条目都与若干对象类联系,而这些对象类决定了一个属性是否为可选和他保存哪些类型的信息。属性的名字一般书一个易于记忆的字符串,例如用cn为通用名(common name)命名,而“mail”代表e-mail地址。属性值依赖于其类型,并且LDAPv3中一般非二进制值遵从UTF-8字符串语法。例如,mail属性包含值“[email protected]”;jpegPhotos属性一般包含JPEG/JFIF格式的图片。

LDAP目录条目可描述一个层次结构,这个结构可以反映一个政治、地理或者组织的范畴。典型的LDAP配置使用DNS名称作为树形结构的顶端,下列是代表人、文档、组织单元、打印机和其他任何事物的条目。

LDAP是怎样工作的

LDAP目录服务器是基于客户/服务器模式的。一个或者多个LDAP服务器包含着组成整个目录信息树(DIT)的数据。客户连接到服务器并且并发一个请求(request)。然后服务器要么以一个回答(answer)予以回应,要么给出一个指针,客户可以通过此指针获取到所需的数据(通常,该指针是指向另一个LDAP服务器)。无论客户连到哪个LDAP服务器,它看到的都是同一个目录视图(view)。这是LDAP这类全局目录服务的一个重要特征。

举个例子

  • LDAP第一次听到这个词我一头雾水,看了很多相关知识还是不太懂,下面是我看到的一个博主给的比较形象的例子。
  • 首先LDAP是一种通讯协议,LDAP支持TCP/IP。协议就是标准,并且是抽象的。在这套标准下,AD(Active Directory)是微软出的一套实现。
    那AD 是什么呢?暂且把它理解成是个数据库。也有很多人直接把LDAP说成数据库(可以把LDAP理解成存储数据的数据库)。像是其他数据库一样,LDAP也是有client端和server端。server端是用来存放资源,client端用来操作增删改查等操作。
  • 而我们通常说的LDAP是指运行这个数据库的服务器。
  • 可以简单理解AD=LDAP服务器+LDAP应用
  • LDAP的特殊性
    我们知道,像MySQL数据库,数据都是按记录一条条记录存在表中。而LDAP数据库,是树结构的,数据存储在叶子节点上。

看看下面的比喻:

假设你要树上的一个苹果(一条记录),你怎么告诉园丁它的位置呢?当然首先要说明是哪一棵树(dc,相当于MYSQL的DB),然后是从树根到那个苹果所经过的所有“分叉”(ou),最后就是这个苹果的名字(uid,相当于MySQL表主键id)。好了!这时我们可以清晰的指明这个苹果的位置了,就是那棵“歪脖树”的东边那个分叉上的靠西边那个分叉的再靠北边的分叉上的半红半绿的……,晕了!你直接爬上去吧!

这样就可以描述清楚“树结构”上的一条记录了。
说一下LDAP里如何定义一个记录的位置吧。

树(dc=ljheee)
分叉(ou=bei,ou=xi,ou= dong)
苹果(cn=redApple)

好了,redApple的位置出来了

dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=ljheee

其中dn标识一条记录,描述了一条数据的详细路径。
咦!有人疑问,为什么ou会有多个值?你想想,从树根到达苹果的位置,可能要经过好几个树杈,所以ou可能有多个值。关于dn后面一长串,分别是cn,ou,dc;中间用逗号隔开

总结一下LDAP树形数据库如下:
dn :一条记录的详细位置
dc :一条记录所属区域    (哪一颗树)
ou :一条记录所属组织    (哪一个分支)
cn/uid:一条记录的名字/ID   (哪一个苹果名字)
LDAP目录树的最顶部就是根,也就是所谓的“基准DN"。
  • 为什么要用LDAP目录树来存储数据,用MySQL不行吗,为什么非要搞出一个属性的数据库呢?
  • 这是因为树形结构存储数据,查询效率更高(具体为什么,可以看一下关系型数据库索引的实现原理——B树/B+树)。在某些特定的场景下,使用树形数据库更理想。比如:需要存储大量的数据,而且数据不是经常更改,需要很快速的查找。
  • 把它与传统的关系型数据库相比,LDAP除了快速查找的特点,他还有很多的运用场景,比如域验证等。

总结

最后总结一下LDAP:

  1. LDAP的结构用树来表示,而不是用表格。正因为这样,就不能用SQL语句了。
  2. LDAP可以很快地得到查询结果,不过在写方面,就慢的多。
  3. LDAP提供静态数据的快速查询方式。
  4. client/server模型,server用于存储数据,client提供操作目录信息树的工具。
  5. LDAP是一种开放Internet标准,LDAP协议是跨平台的Internet协议。

参考
https://baike.baidu.com/item/轻型目录访问协议/10493115?fromtitle=LDAP&fromid=2875565&fr=aladdin
https://www.jianshu.com/p/7e4d99f6baaf
https://www.jianshu.com/p/27ab7a5d56a4

你可能感兴趣的:(计算机网络)