2007年6月11日星期一

总结openLDAP Linux

LDAP(Lightweight Directory Access Protocol )是指轻量级目录访问协议。目录服务和数据库很类似,但又有着很大的不同之处。数据库设计为方便读写,但目录服务专门进行了读优化的设计,因此不太适合于 经常有写操作的数据存储。同时,LDAP只是一个协议,它没有涉及到如何存储这些信息,因此还需要一个后端数据库组件来实现。这些后端可以是bdb (BerkeleyDB)、ldbm、shell和passwd等。

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

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

如图




























LDIF(LDAP Interchange Format)是指存储LDAP配置信息及目录内容的标准文本文件格式,LDIF文件常用来向目录导入或更改记录信息,这些信息需要按照LDAP中schema的格式进行组织,并会接受schema的检查,如果不符合其要求的格式将会出现报错信息。LDIF文件样例如下:

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

其中,以“#”号开头的为注释行;第二行起的行中,冒号左边为属性,右边是属性的值,这类同于编程中的变量及为其所赋的值,但属性可以被重复赋值。 ldif文件中,每一行中冒号后有一个空格,行尾一定不能有空格。

跳过安装部分。

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

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

objectClass大致分为三类:结构型的(如:person和organizationUnit)、辅助型的(如:extensibeObject)和抽象型的(这类不能直接使用)。

如上文所述,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;

 如果可以这样类比的话,我想,我们不妨把objectClass理解为关系数据库的表,而attribute则类同为表中的字段。而下面即可介绍的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,它正是一条记录中关于属性的声明部分。

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

没有评论: