LDAP学习资料整理

LDAP中的objectClassAttribute

初学LDAP时容易弄错的问题就是objectClassAttribute之间的关系的,当时找过许多的中文资料都没有得到答案。最近终于彻底弄明白了这个问题,于是决定做个笔记。下面我会对照Java里面的一些概念来讲讲LDAP中的objectClassAttribute,非常惊喜的是他们非常相似!

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

下面分析一下ObjectClassAttribute的关系。

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

下面用一个类型进行说明:

objectclass ( 2.5.6.0 NAME 'top' ABSTRACT

    MUST objectClass )

objectclass ( 1.3.6.1.4.1.1466.344 NAME 'dcObject'

    DESC 'RFC2247: domain component object'

    SUP top AUXILIARY

    MUST dc )

上面是两个objectclass的定义,其中topABSTRACTdcObjectAUXILIARY,这两个类型都不能定义Entry.下面这个LDIF文件在导入到LDAP时会出错:

dn: dc=java,dc=com

objectClass:dcObject

dc: java.com

要定义这个Entry必须找到一个STRUCTURAL类型的ObjectClass

objectClasses: ( 2.5.6.4 NAME 'organization'

  DESC 'RFC2256: an organization' SUP top STRUCTURAL

  MUST o

  MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory

   $ x121Address $ registeredAddress $ destinationIndicator

   $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier

   $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber

   $ street $ postOfficeBox $ postalCode $ postalAddress

   $ physicalDeliveryOfficeName $ st $ l $ description ) )

这个objectClass的类型为STRUCTURAL,因此可以用来定义Entry.具体定义如下

dn: dc=java,dc=com

objectClass:dcObject

objectClass:organization

dc: java.com

o: java.com

其中dcjava.comdcObjectMUST Attributeo: java.comorganizationMUST Attribute

 

 

 

ladp 关于LDAP的概念随便网上有很多,我不想重复,这里只是说一下我自己的理解。

都说它是轻量级目录协议,太专业,我不懂,我只把它想象成简单的目录协议。

几个很重要的概念,以后会用到:

---------------------------------------------

dn :一条记录的位置

dc :一条记录所属区域

ou :一条记录所属组织

cn/uid:一条记录的名字/ID

---------------------------------------------

实际上更多时候我只把它看成数据库。我把它和我非常熟悉的MYSQL数据库做比较,通常会得到更好的理解:

MYSQL储存数据,LDAP

MYSQL指定一条记录要3个条件:DBTABLEROW

LDAP却更自由,为什么呢?因为LDAP数据是状的,而且这棵树是可以无限延伸的,假设你要树上的一个苹果(一条记录),你怎么告诉园丁它的位置呢?当然首先要说明是哪一棵树(dc,相当于MYSQLDB),然后是从树根到那个苹果所经过的所有分叉ou,呵呵MYSQL里面好象没有这 DD),最后就是这个苹果的名字(uid,记得我们设计MYSQL或其它数据库表时,通常为了方便管理而加上一个‘id’字段吗?)。好了!这时我们可以清晰的指明这个苹果的位置了,就是那棵歪脖树的东边那个分叉上的靠西边那个分叉的再靠北边的分叉上的半红半绿的……,晕了!你直接爬上去吧!我还是说说LDAP里要怎么定义一个字段的位置吧,树(dc=waibo,dc=com),分叉(ou=bei,ou=xi,ou= dong),苹果(cn=honglv),好了!位置出来了:

dn:cn=honglv,ou=bei,ou=xi,ou=dong,dc=waibo,dc=com

一个有名的画家说过:世上没有相同的2个鸡蛋。当然也没有相同的2个苹果……,同样,在LDAP里也不可能存在2个相同的dn

LDAP数据填充原理:

一棵树的生长,要循序渐进,如果还没有长出某个分叉,就不可能在那个分叉里长出苹果(问:FT!苹果是长在分叉上的吗?答:为了便于理解,你就当它是吧),同样,LDAP数据库也要一步步的充实,举一个学校数据库的例子,我们将要把一个庞大的学生档案放到LDAP里,大致需要这么做:

---------------------------------------------

1、建立树根,这是通过修改“slapd.conf”来实现的,由于现在的目的是理解,所以具体步骤就不说了,反正就是在这一步建立了一个“dc= ourschool,dc=org”这样一个树根。注意:我把它理解成目录,或者容器,甚至它本身也是文件(苹果)的特殊形式,熟悉LINUX文件系统的朋友会更容易理解。

2、建立18个系,分别是“dnu=computer,dc=ourschool,dc=org”“dnu=film,dc=ourschool,dc=org”……

3、当然是在每个系里面建立专业,比如“dnu=linux,ou=computer,dc=ourschool,dc=org”……

4、(开始长苹果吧!)加学生喽——“dn:cn=stan,ou=linux,ou=computer,dc=ourschool,dc=org”……

5、已经完成了吗?对了!学生的详细信息还没有呐!不过先这样吧,反正记录是可以编辑的。

---------------------------------------------

LDAP记录的详细信息

dn:cn=stan,ou=linux,ou=computer,dc=ourschool,dc=org

objectClassorganizationalPerson

cn:stan

cn:小刀

sn:小刀

description:a good boy

(以上是一条记录的信息,如果把他保存成LDIF文件,可以导入到LDAP数据库中)

上面不是说没有学生详细信息吗?怕你着急,就马上写出来了,只是还没有导入到LDAP里,那是以后的事。这里我先就你可能会产生的疑问做回答。

---------------------------------------------

Q1“cn”不是在“dn”里定义了吗,怎么又在后面重新定义了?答:你要把“cn=stan,ou=linux,ou=computer,dc=ourschool,dc=org”看成是一个整体,它只是属性dn的值。

Q2:怎么后面有2“cn”,我以哪个为准?答:区别于普通数据库,LDAP每个属性一般可以具有多个值,这样不好吗?你在学校数据库里找我的时候,只要记得我的一个cn就可以了,用“cn=stan”“cn=小刀都可以找到我!

Q3:就这些属性了吗?我都不知道你是男是女。答:先声明,偶是男地。 LDAP对记录的属性做了严格的限制(这一点我不太喜欢),也就是说,你可以用哪些属性,哪些属性不能为空,哪些属性最多只能有一个值等,他们都给你规定好了。幸好你有选择的权利,比如这次我们是储存学生信息,那么我们就定义一个“objectClassorganizationalPerson”,这样 “organizationalPerson”这个类所规定的所有属性我们都可以用了,而且确实很适合我们。虽然这个类中没有“sex”这个属性,不过你完全可以用一个空闲的属性来顶替。如果我们能自己建立就更好了,但目前我还没有时间去研究这个东西,我也期望高手指点啊

---------------------------------------------

好了!看到我贴的图了吗?那是我偷别人的,差不多能用我就不自己画了

##############################################################

关于安装配置LDAP,使之储存系统用户,这里有一个非常好的网址,如果你的英文不是很差,都应该做的来,我偷个懒,就先不写这方面的东西喽:

http://www.mandrakesecure.net/en/docs/ldap-auth.php

上面的方法我已经试过,是可行的,如果兄弟们配置的时候出现问题我们可以讨论讨论。

关于LDAP+POSTFIXPOSTFIX里的“LDAP_README”中介绍的很详细,我再说就是重复了。

##############################################################

其它相关资源:

http://www.openldap.org/(说实话,我一直没用上它,不过它是官方网站,不提也不好)

http://ldap.akbkhome.com/ (什么下面有什么属性,在这里找)

关于LDAP的补充

--------------------------------------------------------------------------------


LDAP就是 light DAP, 轻量级目录访问协议, 可以想象 还有一个DAP,
70年代诞生的DAP协议基于 X.400目录访问协议。主要用于大型主机,因为有大量不常用的功能而且这些不用的功能消耗了过多的系统资源,虽然极强大,但是应用不广,所以出现了LDAP.

这是一个开放的协议, 具体的实现有 Netscape LDAP, Novell NDS, MS AD等等,这3个是使用最广,影响最大的。
Netscape LDAP server主要使用在unix或类unix系统上, MS AD自然只能在windows上, NDS是唯一一个跨平台的产品。注意: LDAP本身是平台无关的。

工作原因,比较熟悉NDS, AD最熟。我个人最喜欢NDS,AD当然最简单,但是最不稳定,最乱,而且比较耗资源。

楼主说的类似数据库,完全正确,因为它原本就是数据库,只是不是关系型的数据库,它是链式数据库,详细细节可以找本数据库原理,很详细的。

和关系数据库一样, LDAP内能够定义哪些对象,每个对象可以有什么属性,每个属性可以取什么样的值,这样一个框架结构被称为Schema,它是类,对象,属性的集合。类又分为抽象类(只能做父类,不能实例化)和结构类(可以实例化),编程的朋友会发现和面向对象的编程的概念完全一样。

举例: LDAP内必须先有user类, 然后用user类创建user对象(一般缺省有的),我们才能创建具体的用户账号(实例化), schema中user对象被指定了有哪些属性,我们创建账号的时候才能给账号哪些属性,例如 schema中user对象没有别名属性,我们就不能给账号起别名。

Schema的扩展:
缺省的schema一般预先创建有足够的类,对象和属性,例如 MS 的AD 缺省有 170个类和833个对象和属性。但是如果不能满足需要的话,我们就可以扩展Schema,一般是使用 LDAP API, 例如 MS的 ADSI, NDS有专门的工具,当然也可以直接使用LDAP查询语言,来直接操作整个LDAP目录树。

原文地址 http://www.chinaunix.net  

 

 

 

 

一、Directory Services(目录服务)能做什么?

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

    

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

二、什么是LDAP

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

     LDAP目录以树状的层次结构来存储数据(这很类同于DNS),最顶层即根部称作基准DN”,形如"dc=mydomain,dc=org"或者"o=mydomain.org",前一种方式更为灵活也是Windows AD中使用的方式。在根目录的下面有很多的文件和目录,为了把这些大量的数据从逻辑上分开,LDAP像其它的目录服务协议一样使用OUOrganization Unit),可以用来表示公司内部机构,如部门等,也可以用来表示设备、人员等。同时OU还可以有子OU,用来表示更为细致的分类。

     LDAP中每一条记录都有一个唯一的区别于其它记录的名字DNDistinguished Name,其处在叶子位置的部分称作RDN;如dn:cn=tom,ou=animals,dc=mydomain,dc=orgtom即为RDNRDN在一个OU中必须是唯一的。

三、什么是LDIF

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

#LDIF file example

dn: dc=mydomain,dc=org

objectClass: domain

dc: mydomain

     其中,以“#”号开头的为注释行;第二行起的行中,冒号左边为属性,右边是属性的值,这类同于编程中的变量及为其所赋的值,但属性可以被重复赋值。

四、objectClass

     LDAP中,一条记录必须包含一个objectClass属性,且其需要赋予至少一个值。每一个值将用作一条LDAP记录进行数据存储的模板;模板中包含了一条记录中数个必须被赋值的属性和一系列可选的属性。如上述LDIF文件中的记录所示,objectClass的值为domain

     objectClass有着严格的等级之分,最顶层的类是topalias。例如,organizationalPerson这个objectClass隶属于Person,Person又是top的子类。

     objectClass大致分为三类:结构型的(如:personorganizationUnit)、辅助型的(如:extensibeObject)和抽象型的(这类不能直接使用)。官方定义的objectClass,如下所示:

alias

applicationEntity

dSA

applicationProcess

bootableDevice

certificationAuthority

certificationAuthority-V2

country

cRLDistributionPoint

dcObject

device

dmd

domain

domainNameForm

extensibleObject

groupOfNames

groupOfUniqueNames

ieee802Device

ipHost

ipNetwork

ipProtocol

ipService

locality

dcLocalityNameForm

nisMap

nisNetgroup

nisObject

oncRpc

organization

dcOrganizationNameForm

organizationalRole

organizationalUnit

dcOrganizationalUnitNameForm

person

organizationalPerson

inetOrgPerson

uidOrganizationalPersonNameForm

residentialPerson

posixAccount

posixGroup

shadowAccount

strongAuthenticationUser

uidObject

userSecurityInformation

五、Attribute介绍

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

c:国家;

cn:common name,指一个对象的名字;如果指人,需要使用其全名;

dc:domain Component,经常用来指一个域名的一部分,如:dc=mydomain,dc=org;

givenName:指一个人的名字,不能用来指姓或者middle name

l:指一个地名,如一个城市或者其它地理区域的名字;

mail:电子信箱地址

o:organizationName,指一个组织的名字;

objectClass:一个LDAP server要想启用必须能够识别每一个对象的AttributeobjectClass Attribute正是用来描述一个对象应该具有的Attribute及可选Attribute。因此,每个objectClass“模板Attribute中必然含有一条objectClass Attribute,我不知道用自包含称呼这个算不算合适。

ou:organizationalUnitName,指一个组织单元的名字。

sn:surname,指一个人的姓;

telephoneNumber:电话号码,应该带有所在的国家的代码;

uid:userid,通常指一个人的登录名,这个不同于Linux系统中用户的uid

     如果可以这样类比的话,我想,我们不妨把objectClass理解为关系数据库的表,而attribute则类同为表中的字段。而下面即可介绍的schema或许可以类比作一个数据库,但它的这个类比或许从逻辑上说更合适些。

六、什么是schema

         好了,现在可以说说到底什么是schema了。LDAP中,schema用来指定一个目录中所包含的objects的类型(objectClass)以及每一个objectClass中的各个必备(mandatory)和可选(optional)的属性(attribute)。因此,[color=Orange]Schema是一个数据模型,它被用来决定数据怎样被存储,被跟踪的数据的是什么类型,存储在不同的Entry下的数据之间的关系。[/color]schema需要在主配置文件slapd.conf中指定,以用来决定本目录中使用到的objectClass。管理员可以自己设计制定schema,一般包括属性定义(AttributeDefinition)、类定义(ClassDefinition)以及语法定义(SyntaxDefinition)等部分。  

     LDAP V3中在x.500标准的基础上定义了一个包含了网络中大多常见对象的schema,这些对象包括国家、所在地、组织、人员、小组以及设备等。同时,LDAP V3中可以很方便的从目录中提取出schema,它正是一条记录中关于属性的声明部分。

七、对象标识符(Object Identifiers

      对象标识符(OID)是被LDAP内部数据库引用的数字标识。Attribute的名字是设计为方便人们读取的,但为了方便计算机的处理,通常使用一组数字来标识这些对象,这类同于SNMP中的MIB2。例如,当计算机接收到dc这个Attribute时,它会将这个名字转换为对应的OID1.3.6.1.4.1.1466.115.121.1.26

八、使用LDAP做身份验正

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

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

 

你可能感兴趣的:(LDAP学习资料整理)