LDAP学习

一.   LDAP的产生背景

我们知道,当局域网的规模变的越来越大时,为了方便主机管理,我们使用DHCP来实现IP地址、以太网地址、主机名和拓扑结构等的集中管理和统一分配。同样,如果一个局域网内有许多的其它资源时,如打印机、共享文件夹等等,为了方便的定位及查找它们,一种集中定位管理的方式或许是较好的选择,DNS和NIS都是用来实现类似管理的方法。

对于局域网内的一个用户来讲,工作等其它应用需要,我们必须凭帐号登录主机、用帐号收发E-mail,甚至为了管理需要公司还需要维护一个电子号码簿来存储员工的姓名、地址、电话号码等信息。随着时间的增长,我们会为这些越来越多的帐号和密码弄的头晕脑胀。同时,如果一个员工离开,管理员就不得不翻遍所有的记录帐号信息的文件把离职员工的信息删除。这些将是一个繁琐而效率低下的工作。那么,如果能将此些帐号信息等统一到一个文件中进行管理,无疑会大大提高员工及管理员的工作效率。目录服务(LDAP是其实现的一种)正是基于这些应用实现的。

二.    什么是LDAP

LDAP是Lightweight Directory Access Protocol的缩写,顾名思义,它是指轻量级目录访问协议(这个主要是相对另一目录访问协议X.500而言的;LDAP略去了x.500中许多不太常 用的功能,且以TCP/IP协议为基础)。目录服务和数据库很类似,但又有着很大的不同之处。数据库设计为方便读写,但目录服务专门进行了读优化的设计, 因此不太适合于经常有写操作的数据存储。同时,LDAP只是一个协议,它没有涉及到如何存储这些信息,因此还需要一个后端数据库组件来实现。这些后端可以是bdb(BerkeleyDB)、ldbm、shell和passwd。

三.   LDAP和关系型数据库

不少LDAP开发人员喜欢把LDAP与关系数据库相比,认为是另一种的存贮方式,然后在读性能上进行比较。实际上,这种对比的基础是错误的。LDAP和关系数据库是两种不同层次的概念,后者是存贮方式(同一层次如网格数据库,对象数据库),前者是存贮模式和访问协议。LDAP是一个比关系数据库抽象层次更高的存贮概念,与关系数据库的查询语言SQL属同一级别。LDAP最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。

从另一个意义上 LDAP是实现了指定的数据结构的存贮,它是一种特殊的数据库。但是LDAP和一般的数据库不同,明白这一点是很重要的。 LDAP对查询进行了优化,与写性能相比LDAP的读性能要优秀很多。

就象Sybase、Oracle、Informix或Microsoft的数据库管理系统(DBMS)是用于处理查询和更新关系型数据库那样,LDAP服务器也是用来处理查询和更新LDAP目录的。换句话来说LDAP目录也是一种类型的数据库,但不是关系型数据库。要特别注意的是,LDAP通常作为一个 hierarchical数据库使用,而不是一个关系数据库。因此,它的结构用树来表示比用表格好。正因为这样,就不能用SQL语句了。

四.    LDAP的存储规则

DN是LDAP记录项的名字

在LDAP目录中的所有记录项都有一个唯一的“Distinguished Name",也就是DN。每一个LDAP记录项的DN是由两个部分组成的:相对DN(RDN)和记录在LDAP目录中的位置。

RDN是DN中与目录树的结构无关的部分。在LDAP目录中存储的记录项都要有一个名字,这个名字通常存在cn(Common Name)这个属性里。因为几乎所有的东西都有一个名字,在LDAP中存储的对象都用它们的cn值作为RDN的基础。如果我把最喜欢的吃燕麦粥食谱存为一个记录,我就会用cn=Oatmeal Deluxe作为记录项的RDN。

 举一个实际的例子来说明DN

 现在为公司的员工设置一个DN。可以用基于cn或uid(User ID),作为典型的用户帐号。例如

 l 我的LDAP目录的基准DN是dc=iqiyi,dc=com

 l 我所在的部门存在ou=tech

 l 我的名字设为cn=Bob

 上面这些构成了我的个人记录的完整DN。记住,DN的读法和DNS主机名类似。下面就是完整的DN:

 cn=Bob,ou=tech,dc=iqiyi,dc=com

 

五.   什么是LDIF

LDIF(LDAP Interchange Format)是指存储LDAP配置信息及目录内容的标准文本文件格式,之所以使用文本文件来格式来存储这些信息是为了方便读取和修改,这也是其它大多数 服务配置文件所采取的格式。LDIF文件常用来向目录导入或更改记录信息,这些信息需要按照LDAP中schema的格式进行组织,并会接受schema 的检查,如果不符合其要求的格式将会出现报错信息。LDIF文件样例如下:

#LDIF file example
dn: dc=mydomain,dc=org
objectClass: domain
dc: mydomain

六.   什么是objectClass

LDAP中每一个Entry必须属于某一个objectClass,用Java的方式来理解就是Entry是一个Instance,而objectClass就是class。

在LDAP中objectClass分为三种:Abstract,Structural,AUXIALIARY。在Java中Class可以分为Abstract,concrete两种,我们知道要new一个Instance时必须要有一个concrete Class。要定义一个Entry必须包含一个Structural类型的ObjectClass,其他两个类型可包括0或多个。 其中Top是一个顶级ObjectClass,里面定义了一个MUST Attribute:ObjectClass,于是也就决定了必须有一个其它的Structural ObjectClass才能定义一个Entry.其中ObjectClass又可以存在继承关系,子ObjectClass会继承父ObjectClass中的全部Attribute.该继承关系于Java中有点相似.

ObjectClass与Attribute的关系

如同Java里面的一个类可以包括多个Field,在业务上可能会定义某些Field是必须的,另外一些是可选的。在LDAP中也存在类似关系,每一个ObjectClass都定义了一些Attribute,其Attribute仍然可以是ObjectClass。在这些Attriubte中分为两种类型MUST,MAY, MUST表示这个Entry必须包括的属性,MAY为可选。一个ObjectClass的Attribute也包括所有继承自父ObjectClass和自身定义的ObjectClass。

七.   什么是Attribute

如上文所述,Attribute类同于编程语言中的变量,它可以被赋值,就像是可以存放一个单一类型信息的容器。官方声明了许多常用的 Attribute,如果其中没有你所需要的,你可以自己定义,但要避免重名。objectClass是一种特殊的Attribute,它包含其它用到的 Attribute以及它自身。常见的Attribute如:givenName、l、objectClass、dc、ou、cn、c、mail、 telephoneNumber、sn、uid等。分别介绍如下:

c:国家;
cn:common name,指一个对象的名字;如果指人,需要使用其全名;
dc:domain Component,经常用来指一个域名的一部分,如:dc=mydomain,dc=org;
givenName:指一个人的名字,不能用来指姓或者middle name;
l:指一个地名,如一个城市或者其它地理区域的名字;
mail:电子信箱地址
o:organizationName,指一个组织的名字;
objectClass: 一个LDAP server要想启用必须能够识别每一个对象的Attribute,objectClass Attribute正是用来描述一个对象应该具有的Attribute及可选Attribute。因此,每个objectClass“模板”的 Attribute中必然含有一条objectClass Attribute,我不知道用“自包含”称呼这个算不算合适。
ou:organizationalUnitName,指一个组织单元的名字。
sn:surname,指一个人的姓;
telephoneNumber:电话号码,应该带有所在的国家的代码;
uid:userid,通常指一个人的登录名,这个不同于Linux系统中用户的uid;

八.   什么是Schema

LDAP中,schema用来指定一个目录中所包含的objects的类型 (objectClass)以及每一个objectClass中的各个必备(mandatory)和可选(optional)的属性 (attribute)。因此,Schema是一个数据模型,它被用来决定数据怎样被存储,被跟踪的数据的是什么类型,存储在不同的Entry下的数据之间的关系。schema 需要在主配置文件slapd.conf中指定,以用来决定本目录中使用到的objectClass。管理员可以自己设计制定schema,一般包括属性定 义(AttributeDefinition)、类定义(ClassDefinition)以及语法定义(SyntaxDefinition)等部分。   
LDAP V3中在x.500标准的基础上定义了一个包含了网络中大多常见对象的schema,这些对象包括国家、所在地、组织、人员、小组以及设备等。同时,LDAP V3中可以很方便的从目录中提取出schema,它正是一条记录中关于属性的声明部分。

九.   客户端和LDAP服务器端交互的一般过程

1. LDAP客户端发起连接请求与LDAP服务器建立会话,LDAP的术语是绑定(binding)。在建立绑定时客户端通常需要指定访问用户,以便能够访问服务器上的目录信息。

2. LDAP客户端发出目录查询、新建、更新、删除、移动目录条目、比较目录条目等操作

3. LDAP客户端结束与服务器的会话,即解除绑定(unbinding)

十.    DAP的使用场景

    LDAP对于这样存储这样的信息最为有用,也就是数据需要从不同的地点读取,但是不需要经常更新。

 例如,这些信息存储在LDAP目录中是十分有效的:

  1.公司员工的电话号码簿和组织结构图

  2. 客户的联系信息

  3. 计算机管理需要的信息,包括NIS映射、email假名,等等

  4. 软件包的配置信息

  5.公用证书和安全密匙

 什么时候该用LDAP存储数据?

 大多数的LDAP服务器都为读密集型的操作进行专门的优化。因此,当从LDAP服务器中读取数据的时候会比从专门为OLTP优化的关系型数据库中读取数据快一个数量级。也是因为专门为读的性能进行优化,大多数的LDAP目录服务器并不适合存储需要需要经常改变的数据。例如,用LDAP服务器来存储电话号码是一个

   很好的选择,但是它不能作为电子商务站点的数据库服务器。

   另外满足下面的情况,也最合适LDAP。

 需要在任何平台上都能读取数据。

 每一个单独的记录项每天都只有很少的改变。

 可以把数据存在平面数据库(flat database)而不是关系型数据库中吗,换句话来说,也就是不管什么范式不范式的,把所有东西都存在一个记录中(差不多只要满足第一范式)。

十一.      LDAP的应用

使用LDAP做身份验证

验证主要是用来确定一次会主中客户端用户所具有的权利,即用来确立用户能否登录以及登录具有使用哪些资源以及如何使用资源的权限。验证过程中的修改、查询等操作由认证级别来控制。

objectClass中的person可以用来作linux系统中用户登入的身份验证,此时需要指定userPassword属性的值,即指定用户登入 时使用的密码。密码可以使用的加密方式有MD5、CRYPT、SHA、SSHA等。在LDAP V3中,验正客户端时可以使用的验正机制有匿名验证、简单验证、基于SSL/TLS的验证和基于SASL的验证等四种方式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值