首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

OpenLDAP学习札记

2012-06-29 
OpenLDAP学习笔记LDAP协议?????? 目录是一组具有类似属性、以一定逻辑和层次组合的信息。常见的例子是通讯簿

OpenLDAP学习笔记

LDAP协议

?

????? 目录是一组具有类似属性、以一定逻辑和层次组合的信息。常见的例子是通讯簿,由以字母顺序排列的名字、地址和电话号码组成。
目录服务是一种在分布式环境中发现目标的方法。目录具有两个主要组成部分:

?

第一部分是数据库,数据库是分布式的,且拥有一个描述数据的规划。第二部分则是访问和处理数据的各种协议。

????? 目录服务其实也是一种数据库系统,只是这种数据库是一种树形结构,而不是通常使用的关系数据库。目录服务与关系数据库之间的主要区别在于:二者都允许对存储数据进行访问,只是目录主要用于读取,其查询的效率很高,而关系数据库则是为读写而设计的。
提示:目录服务不适于进行频繁的更新,属于典型的分布式结构。
????? LDAP是一个目录服务协议,目前存在众多版本的LDAP,而最常见的则是V2和V3两个版本,它们分别于1995年和1997年首次发布。

LDAP的基本模型


????? LDAP的基本模型是建立在“条目”(Entry)的基础上。一个条目是一个或多个属性的集合,并且具有一个全局唯一的“可区分名称”(用dn表示)。与关系型数据(后面简称数据库)进行类比,一个条目相当于数据库中的一条记录,而dn相当于数据库中记录的关键字,属性相当于数据库中的字段。
提示:dn必须是全局唯一的。
????? LDAP中,将数据组织成一个树形结构,这与现实生活中的很多数据结构可以对应起来,而不像设计关系型数据库的表,需要进行多种变化。例如,图1-1所示就是一个树形结构的数据。

OpenLDAP学习札记

?

????? 在图1-1所示的树形结构中,树的根结点是一个组织的域名(dlw.com),其下分为3个部分,分别是managers、people和group,可将这3个组看作组织中的3个部门,如managers用来管理所有管理人员,people用来管理登录系统的用户,group用来管理系统中的用户组。当然,在该图中还可继续增加其他分支。
????? 对于图1-1所示的树形结构,使用关系数据库来保存数据的话,需要设置多个表,一层一层分别保存,当需要查找某个信息时,再逐层进行查询,最终得到结果。
????? 若使用目录来保存该图中的数据,则更直观。图中每个结点用一个条目来保存,不同类型的结点需要保存的数据可能不同,在LDAP中通过一个称为objectClass的类型来控制不同结点需要的数据(称为属性)。
????? 对于目录中的数据怎样进行引用呢?前面提到过,每一个条目都有一个dn,因为dn是唯一的,因此就可找到需要结点的数据。dn的构造方式如下:
????? 首先得到条目自己的名称(rdn,称为相对dn),然后开始向上逐级查找父结点,一直到根项为止。例如,对于图1-1中最右下方的结点,其dn为:

?

(6)使用以下命令修改保存数据的目录/var/lib/ldap/及其文件的所有者,并修改权限,只有ldap用户才对数据有读写权限:

?

?

提示:使用/usr/sbin/slapd命令启动服务程序是最好的一种方式,如果用前两条命令启动openldap服务程序失败,可使用最后一条命令试一下。

?

????? 从上图可看出,启动的是slapd进程,并有一个提示信息,提示没有DB_CONFIG文件。可通过以下命令将DB_CONFIG文件复制到/var/lib/ldap/目录中:

?

?

3.搜索测试
????? slapd服务进程启动后,可使用OpenLDAP客户端的一个搜索命令进行一次搜索,以检查服务的配置是否正确。
????? 使用以下命令进行搜索:

?

?

从以上测试可看出,OpenLDAP已经正确安装到系统中,接下来就需要修改配置文件,设置LDAP的根目录了。

?

?

配置OpenLDAP

?

????? 在上面的例子中的搜索结果可看出,在配置文件中是以默认的“dc=my-domain, dc=com”作为后缀,需要对其进行修改,当然也还需要修改其他的一些配置。下面将介绍对配置文件的修改操作。

slapd.conf


????? OpenLDAP的配置文件位于/etc/openldap/目录中,名称为slapd.conf。该文件内容较多,通常只需要修改几个地方即可,包括修改后缀、管理员及其密码。其初始内容如下:

?

?

下面列出部分常用objectClass要求必设的属性。
? ● account:userid。
? ● organization:o。
? ● person:cn和sn。
? ● organizationalPerson:与person相同。
? ● organizationalRole:cn。
? ● organizationUnit:ou。
? ● posixGroup:cn、gidNumber。
? ● posixAccount:cn、gidNumber、homeDirectory、uid、uidNumber。

4.创建LDIF文件


????? 对以上内容有一定了解之后,就可以编写输入LDIF文件,编辑需要向目录数据库添加的条目了。
????? 下面根据如下图所示的结构,创建LDIF文件dlw.com.ldif。

?

OpenLDAP学习札记

?

????? 对上图进行分析,该目录结构分为3层,有4个结点。根据上图可创建LDIF文件如下:
提示:每个结点可用一个dn表示,对于每个结点,又可继续添加新的结点。如在根结点中可添加其他部门ou,在ou=managers结点也可继续添加其他管理人员的信息。

?

?

执行以上命令,如果添加操作正常完成,将显示如下图所示的提示信息,表示添加了4个条目到目录数据库中。

?

OpenLDAP学习札记

?

提示:如果以上命令执行不成功,需要逐个字符检查dlw.com.ldif文件中的内容,特别注意空格的问题。

?

查询


????? 添加到目录中的条目被保存在目录数据库,在Linux命令界面下,可使用OpenLDAP客户端工具ldapsearch命令来进行查询。该命令的格式如下:


????? ldapsearch? 选项? 过滤? 属性值


常用的选项有以下几个:


? ● -x:进行简单认证。
? ● -D:用来绑定服务器的dn。
? ● -w:绑定dn的密码。
? ● -b:指定要查询的根节点。
? ● -H:制定要查询的服务器。

?

使用ldapsearch命令查询“dc=dlw, dc=com”下的所有条目,可使用以下命令:

?

而如果使用以下命令,将查询显示sn中以字符wu开头的条目,将得到如下图所示的查询结果,只找到一个条目。

?

?

?

修改条目


????? 使用OpenLDAP客户端工具ldapmodify命令可对目录数据库中的条目进行修改。该命令的格式如下:


????? ldapmodify? 选项


????? 该命令的选项也很多,常用选项与ldapadd类似,这里就不再列出了。
????? 提示:使用ldapmodify命令不能修改条目的dn,但可以修改其他属性值。

使用ldapmodify命令修改条目信息可以有两种方式:一种是交互式进行修改,另一种是通过文件进行修改。

1.交互式修改


????? 修改前面创建的条目“cn=test, ou=managers, dc=dlw, dc=com”,将其sn属性修改为“Test User Modify”,并添加一个description属性,设置其值为“add Attribute”。
????? 首先输入以下命令,进行修改状态:

?

执行以上命令后,终端将等候用户输入需要修改条目的dn,输入以下内容:

?

?

使用以上命令修改条目的数据之后,可使用以下命令查看是否修改成功:

?

?

2.通过文件修改


??? 通过前面的方式对条目进行修改时,很不方便,如果在交互方式时输错了某个字符,只能中断命令后重新进行修改。因此,更好的修改方法是首先将修改时输入的文字保存到一个文件中,然后以该文件作为输入进行修改。用这种方式进行操作,首先需要创建一个临时文件,用来保存需要进行的修改操作,下面演示这种方式的修改过程。

【例子】 通过修改命令将前面LDAP数据库中的信息还原,即将sn属性由“Test User Modify”修改为“Test User”。
具体操作步骤如下:
(1)使用vi编辑器创建一个文件modify,在其中输入以下内容:

?

执行结果如下图所示。

?

OpenLDAP学习札记

?

删除条目


????? 对于目录数据库中不用的条目,也可使用ldapdelete命令将其删除。该命令的格式如下:


????? ldapdelete? 选项? 删除条目


????? 该命令使用的选项与ldapadd类似,就不再列出来了。
????? 删除目录数据库中的“cn=test,ou=managers,dc=dlw,dc=com”条目,具体命令如下:

?

?

????? 顺利执行以上命令后,终端上将不会有任何信息输出,表示完成了删除操作。
????? 使用ldapdelete命令只能删除树形结构中的叶结点条目,如果删除非叶结点条目,将出现错误提示。例如,执行以下命令删除根结点“dc=dlw,dc=com”,由于根结点下面还有结点,将显示如下图所示的错误提示信息:

?

OpenLDAP学习札记

?

?

数据导出


????? 通过ldapadd命令可向目录数据库中添加数据,在某些情况下,可能还需要进行反向操作,即将目录数据库中的数据导出。
????? 使用ldapsearch命令对目录数据库进行搜索,然后通过重定向将搜索结果保存到一个文件中,可达到导出数据的目的。另外,导出数据更常用的是slapcat命令,该命令的格式如下:


????? slapcat? 选项


????? 最常用的选项就是-l,表示导出为LDIF文件格式。
????? 如将本章前面例子中创建的目录数据库导出为export.ldif文件,可使用以下命令:

?

?

提示:从导出结果可看出,除了使用ldapadd命令添加到目录数据库中的条目数据外,还导出了很多其他信息,包括条目录UUID、时间戳等信息。

?

?

设置主从LDAP服务器


????? 在某些时候,为了对LDAP服务器进行负载均衡,可能希望设置多台LDAP服务器。对于设置多台LDAP服务器的关键问题是数据的同步问题,使用slurpd进程可进行主LDAP服务器向从LDAP服务器复制数据的操作。下面将介绍架设主从LDAP服务器的过程。

?

多台LDAP服务器工作过程


????? 对于多台LDAP服务器,可设置一台为主服务器,其他的为从服务器。本节介绍一台从服务器的配置,若是多台从服务器也可按此步骤进行操作。
注意:在进行配置之前应首先确保每个LDAP服务器都已安装好OpenLDAP服务器程序,并能正确工作。
????? 通过本节下面介绍的方法配置好主从LDAP服务器之后,在主服务器运行slurpd进程,该进程使用LDAP协议从主服务器的数据库更新从服务器的数据,具体操作过程如下:


(1)LDAP客户端向从服务器提交一个LDAP修改请求。
(2)从服务器给LDAP客户端返回一个指向主服务器的引用。
(3)LDAP客户端向主服务器提交LDAP修改请求。
(4)主服务器对数据库中的数据进行修改,并将改变写入本机的日志文件。
(5)在主服务器运行的slurpd进程检查到日志中有新内容,通过日志的信息将改变发送给从服务器。
(6)从服务器接收slurpd发来的信息,对本地数据进行修改。


????? 以上过程就是使用slurpd进程进行数据复制的过程。从以上过程可看出,需要在主服务器的配置文件中设置要向哪些从服务器发送复制信息、主服务器还要设置一个记录数据改变的日志文件,而从服务器需要设置一个指向主服务器的链接。

复制数据库


首先,把主从服务器关闭。通过以下三步操作静态同步主从服务器上的数据:

?

把主服务器上/var/lib/ldap目录下的所有数据库文件全部拷贝到从服务器的同目录中,覆盖原有文件。把主服务器上的/etc/ldap/schema目录下的所有schema文件拷贝到从服务器的同目录中,覆盖原有文件。把主服务器上/etc/ldap/slapd.conf文件拷贝到从服务器的同目录中,覆盖原有文件。

?

设置主服务器


配置主服务器上的slapd.conf文件,取消replogfile指令前的注释符号,取消后的结果如下:

?

设置从服务器


配置从服务器上的slapd.conf文件,增加updatedn指令,如:

?

?

在从服务器的配置文件中,不要包含replica和replogfile指令。


测试主从LDAP服务器


经过以上步骤的操作,主从LDAP服务器都已准备好,接下来就可以测试相关操作。


?? 1.启动主LDAP服务器
??????? 在主LDAP服务器中启动slapd进程和slurpd进程。
?? 2.启动从LDAP服务器
??????? 在主LDAP服务器中启动slapd进程。


【例子】测试主从LDAP服务器。
具体操作步骤如下:

(1)在主LDAP服务器中使用以下命令修改一个条目:

?

?

输入以下内容,修改cn=dlw条目的内容:

?

?

(2)在从LDAP服务器中进行操作,查看主LDAP服务器中的操作是否被复制到从LDAP服务器中来了。在从LDAP服务器中使用以下命令进行查询:

?

?

执行结果如下图所示,从图中可看到其中的sn也被修改为dongliwei了(数据库中原来的内容为zhangsan.modi,是前面例子中修改的值),即被主LDAP服务器进行了同步复制。

?

OpenLDAP学习札记

?

?

OpenLDAP在用户认证的应用


????? OpenLDAP经常用在用户登录认证方面,通过LDAP的数据复制功能,可让用户使用一个账户登录网络中使用LDAP服务的所有服务器。在主LDAP服务器中设置好用户账户数据,然后通过在网络中的任意客户端都可使用设置的账号进行登录操作。下面将简单介绍将用户认证迁移到LDAP的操作方法。

用户认证用到的ojbectClass


????? 在LDAP中用来保存用户认证条目的objectClass主要有以下3个,分别用来保存组、用户、密码等信息到目录的条目中。

posixGroup:可设置属性cn、userPassword、gidNumber等。posixAccount:可设置属性cn、gidNumber、uid、uidNumber、homeDirectory、loginShell等。shadowAccount:可设置属性uid、shadowExpire、shadowFlag、shadowInactive、shadowLastChange、shadowMax、shadowMin、shadowWarning、userPassword等。

提示:从上面列出的属性的名称可以很容易地与组、用户的相关信息联系起来。

?

使用迁移工具


????? 要使用LDAP进行用户认证,首先应该考虑的就是数据迁移的工作量。如果要操作员从/etc/passwd和/etc/group文件中逐个将信息重新录入,工作量将非常大。
????? OpenLDAP为用户考虑到了这些迁移工作,提供了多个迁移工具的脚本程序,这些程序位于/usr/share/openldap/migration/目录中,在该目录中有很多扩展名为pl和sh的脚本文件,通过这些迁移工具,可以很方便地将系统中的用户迁移到LDAP目录数据库中。下面介绍具体的迁移步骤。

【例子】将系统中的用户信息迁移到LDAP目录数据库中。
具体操作步骤如下:
(1)修改/usr/share/openldap/migration/migrate_common.ph文件,在其中查找以下内容:

?

执行结果如下图所示。

?

OpenLDAP学习札记

?

(5)开始迁移组信息。使用以下命令将/etc/group中的组信息保存到临时文件group.tmp中:

?

?

(9)类似地,使用以下命令导出/etc/passwd中的用户数据,并删除不需要的用户,然后使用migrate_passwd.pl脚本生成LDIF文件:

?

?

执行以上命令的过程如下图所示。

?

OpenLDAP学习札记

?

(11)使用以下命令查看目录数据库中用户root的信息,用“uid=root”作查询条件:

?

?

????? 通过以上的操作,就将需要导入的组和用户的信息导入到了目录数据库中,接下来还需要对客户端进行设置,使用LDAP进行登录验证操作。

?

?

设置客户端登录


若客户端要使用LDAP进行用户登录认证,则可使用本地计算机中不存在的用户名进行登录操作。
【例子】修改配置文件,设置客户端使用LDAP进行认证。
具体操作步骤如下:
(1)修改客户端计算机中的/etc/sysconfig/authconfig文件,将以下项都修改为yes:

?

?

????? 经过以上配置以后,在客户端就可以使用LDAP目录数据库中的用户信息在客户端进行登录操作了。登录操作与使用本地用户账号相同,这里就不再演示了。

?

?

LDAP Schema


????? Schema是LDAP的一个重要组成部分,类似于数据库的模式定义,LDAP的Schema定义了LDAP目录所应遵循的结构和规则,比如一个 objectclass会有哪些属性,这些属性又是什么结构等等,schema给LDAP服务器提供了LDAP目录中类别,属性等信息的识别方式,让这些可以被LDAP服务器识别。
在LDAP的schema中,有四个重要的元素:

??? Objectclass
??? objectclass定义了一个类别,这个类别会被不同的目录(在LDAP中就是一个Entry)用到,它说明了该目录应该有哪些属性,哪些属性是必须的,哪些又是可选的。一个objectclass的定义包括名称(NAME),说明(DESC),类型(STRUCTURAL或AUXILARY ,表示是结构型的还是辅助型的),必须属性(MUST),可选属性(MAY)等信息。

?

例如:

?

????? 下面定义一个允许将myPhoto增加到任何已经存在的条目中的auxiliary对象类:

?

whsp是空格的意思(' ')。numericoid 是全局唯一的 OID,是带.的十进制形式 (e.g. 1.1.0), qdescrs有一个或几个意思, woid 可以使名称或者是 OID 可选择的一定长度的后缀(e.g {10})。
例如,属性类型name和cn在core.schema中如下定义:

Commonly Used Syntaxes

Name

OID

Description

boolean

1.3.6.1.4.1.1466.115.121.1.7

boolean value

distinguishedName

1.3.6.1.4.1.1466.115.121.1.12

DN

directoryString

1.3.6.1.4.1.1466.115.121.1.15

UTF-8 string

IA5String

1.3.6.1.4.1.1466.115.121.1.26

ASCII string

Integer

1.3.6.1.4.1.1466.115.121.1.27

integer

Name and Optional UID

1.3.6.1.4.1.1466.115.121.1.34

DN plus UID

Numeric String

1.3.6.1.4.1.1466.115.121.1.36

numeric string

OID

1.3.6.1.4.1.1466.115.121.1.38

object identifier

Octet String

1.3.6.1.4.1.1466.115.121.1.40

arbitary octets

Printable String

1.3.6.1.4.1.1466.115.121.1.44

printable string

?

?

Matching Rules


????? 是用来指定某属性的匹配规则,实际上就是定义一个特殊的Syntax的别名,让LDAP服务器可以识别,并对定义的属性进行匹配。

?

?

Commonly Used Matching Rules

Name

Type

Description

booleanMatch

equality

boolean

octetStringMatch

equality

octet string

objectIdentiferMatch

equality

OID

distinguishedNameMatch

equality

DN

uniqueMemberMatch

equality

Name with optional UID

numericStringMatch

equality

numerical

numericStringOrderingMatch

ordering

numerical

numericStringSubstringsMatch

substrings

numerical

caseIgnoreMatch

equality

case insensitive, space insensitive

caseIgnoreOrderingMatch

ordering

case insensitive, space insensitive

caseIgnoreSubstringsMatch

substrings

case insensitive, space insensitive

caseExactMatch

equality

case sensitive, space insensitive

caseExactOrderingMatch

ordering

case sensitive, space insensitive

caseExactSubstringsMatch

substrings

case sensitive, space insensitive

caseIgnoreIA5Match

equality

case insensitive, space insensitive

caseIgnoreIA5OrderingMatch

ordering

case insensitive, space insensitive

caseIgnoreIA5SubstringsMatch

substrings

case insensitive, space insensitive

caseExactIA5Match

equality

case sensitive, space insensitive

caseExactIA5OrderingMatch

ordering

case sensitive, space insensitive

caseExactIA5SubstringsMatch

substrings

case sensitive, space insensitive

?

????? LDAP的schema的主要元素就是这些了,下面列举出了一些LDAP规定好的或是现在比较通用的schema,一般的LDAP服务器都应该可以识别这些定义。
????? 这就是一个名为subschema的objectclass的定义:

?

attributetype ( 2.5.13.2 NAME 'caseIgnoreMatch'      SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
?

????? 其实1.3.6.1.4.1.1466.115.121.1.15 就是LDAP数据类型Directory String的ID,说明前面的cn需要等于这个数据类型才有效。
????? 还有很多常用schema的定义都在了RFC2252中,LDAP服务器都应该支持这些基本的schema。好了,现在基本对LDAP中的schema有个一个大致的说明,可能有不到位或不妥之处,还望大家指正。

?

?

热点排行