OpenLDAP学习笔记
转自:http://jianshi-dlw.iteye.com/blog/1557846 LDAP协议 目录是一组具有类似属性、以一定逻辑和层次组合的信息。常见的例子是通讯簿,由以字母顺序排列的名字、地址和电话号码组成。
目录服务其实也是一种数据库系统,只是这种数据库是一种树形结构,而不是通常使用的关系数据库。目录服务与关系数据库之间的主要区别在于:二者都允许对存储数据进行访问,只是目录主要用于读取,其查询的效率很高,而关系数据库则是为读写而设计的。 LDAP的基本模型
在图1-1所示的树形结构中,树的根结点是一个组织的域名(dlw.com),其下分为3个部分,分别是managers、people和group,可将这3个组看作组织中的3个部门,如managers用来管理所有管理人员,people用来管理登录系统的用户,group用来管理系统中的用户组。当然,在该图中还可继续增加其他分支。
Python代码
通过这样的方式,即可唯一标识每一个结点。 LDAP的功能
LDAP协议的特点
安装OpenLDAP
可以先通过rpm命令查询系统中是否已安装OpenLDAP服务器程序,若未安装该服务器程序,再使用rpm命令从RHEL光盘中安装该程序。
Python代码
(2)执行以下命令,查询系统中是否已安装openldap-servers程序。
Python代码
#rpm-qaopenldap-servers
若无任何输出,则表示当前系统中未安装openldap-servers服务器程序。 (3)使用以下命令将RHEL安装光盘挂载到系统中:
Python代码
#mount/dev/cdrom/mnt/cdrom
(4)执行以下命令安装openldap-servers程序的依赖程序包libtools-ltdl:
Python代码
#rpm-ivh/mnt/cdrom/Server/libtool-ltdl-1.5.22-6.1.i386.rpm
若不执行上面的命令,直接执行下一步的安装命令,将提示有依赖程序未安装。 (5)执行以下命令安装openldap-servers程序:
Python代码
#rpm-ivh/mnt/cdrom/Server/openldap-servers-2.3.27-5.i386.rpm
这样就将openldap-servers服务器程序安装到系统中了。整个安装过程如下图所示。 (6)使用以下命令修改保存数据的目录/var/lib/ldap/及其文件的所有者,并修改权限,只有ldap用户才对数据有读写权限:
Python代码
#chownldap.ldap/var/lib/ldap
在光盘中还有以下与openldap有关的软件包,也可使用类似命令进行安装,这里不再逐个介绍。 测试安装正确性
1.启动服务进程
Python代码
#serverldapstart
使用第1条命令来启动ldap服务进程的过程如下图所示。 提示:使用/usr/sbin/slapd命令启动服务程序是最好的一种方式,如果用前两条命令启动openldap服务程序失败,可使用最后一条命令试一下。 从上图可看出,启动的是slapd进程,并有一个提示信息,提示没有DB_CONFIG文件。可通过以下命令将DB_CONFIG文件复制到/var/lib/ldap/目录中:
Python代码
#cp/etc/openldap/DB_CONFIG.example/var/lib/ldap/DB_CONFIG
另外,由于使用的是默认配置文件,提示希望使用后缀“dc=my-domain,dc=com”。下节将介绍修改配置文件的操作。 2.查看监听端口
Python代码
#netstat–tnlp|grep389
执行结果如下图所示,可以看出,389端口处于监听状态,表示slapd进程正在工作。 3.搜索测试
Python代码
#ldapsearch-x-b''-sbase'(objectclass=*)'
注意:-b后面是两个单引号,用来阻止特殊字符被Shell解析。 由于还未向LDAP服务器中添加任何数据,因此,系统中应该只有“根”这个条目,执行以上搜索的结果如下图所示。 从以上测试可看出,OpenLDAP已经正确安装到系统中,接下来就需要修改配置文件,设置LDAP的根目录了。 配置OpenLDAP 在上面的例子中的搜索结果可看出,在配置文件中是以默认的“dc=my-domain,dc=com”作为后缀,需要对其进行修改,当然也还需要修改其他的一些配置。下面将介绍对配置文件的修改操作。 slapd.conf
Python代码
#######################################################################
其中各语句的含义如下:
Python代码
#######################################################################
以上内容中,第6行将后缀修改为“dc=dlw,dc=com”,同时第7行的超级管理员的后缀部分也需要随之修改。将第11行的注释取消,设置超级管理员的密码为MD5密码secret。
Python代码
#serviceldaprestart
了解schema
写道
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema include /etc/openldap/schema/nis.schema 提示:通常使用系统提供的schema就可解决大部分应用。管理员也可以自己设计制定schema,一般包括属性定义(AttributeDefinition)、类定义(ClassDefinition)以及语法定义(SyntaxDefinition)等部分。这里就不介绍具体的设计方法了。 管理OpenLDAP
向目录数据库中添加数据
1.LDIF文本条目格式 LDIF用文本格式表示目录数据库的信息,以方便用户创建、阅读和修改。在LDIF文件中,一个条目的基本格式如下:
写道
# 注释
dn: 条目名 属性描述: 值 属性描述: 值 属性描述: 值 ... ... dn行类似于关系数据库中一条记录的关键字,不能与其他dn重复。一个LDIF文件中可以包含多个条目,每个条目之间用一个空行分隔。
写道
1: dn: dc=dlw,dc=com
2: objectclass: top 3: objectclass: dcobject 4: objectclass: organization 5: dc: dlw 6: o: dlw,Inc. 在以上文本中,各行含义如下:
2.了解objectClass
objectClass可分为以下3类:
在OpenLDAP的schema中定义了很多objectClass,下面列出部分常用的objectClass的名称。 3.了解Attribute
提示:objectClass是一种特殊的Attribute,它包含其他用到的Attribute以及其自身。 对于不同的objectClass,通常具有一些必设属性值和一些可选属性值。例如,可使用person这个objectClass来表示系统中一个用户的条目,对于系统中用户通常需要有这样一些信息:姓名、电话、密码、描述等。如下图所示,对于person,通过cn和sn设置用户的名和姓,这是必须设置的,而其他属性则是可选的。 下面列出部分常用objectClass要求必设的属性。 4.创建LDIF文件
对上图进行分析,该目录结构分为3层,有4个结点。根据上图可创建LDIF文件如下:
写道
1: dn:dc=dlw,dc=com
2: objectclass:top 3: objectclass:dcobject 4: objectclass:organization 5: dc:dlw 6: o:dlw,Inc. 7: 8: dn:ou=managers,dc=com 9: ou:managers 10: objectclass:organizationalUnit 11: 12: dn:cn=dlw,ou=managers,dc=com 13: cn:dlw 14: sn:dongliwei 15: objectclass:person 16: 17: dn:cn=test,dc=com 18: cn:test 19: sn:Test User 20: objectclass:person 以上文件中各行的含义如下:
在以上LDIF文件中,第1、8、12、17行以dn开头,这部分内容必须唯一,并且在向目录数据库添加这些数据时,也要确保这些数据不能与目录数据库中已有数据相同,否则,添加操作将中断。 5.从LDIF文件添加到目录数据库
将前面编写的LDIF文件的条目数据添加到目录数据库中。
写道
# ldapadd -x -D "cn=root,dc=com" -w secret -f dlw.com.ldif
执行以上命令,如果添加操作正常完成,将显示如下图所示的提示信息,表示添加了4个条目到目录数据库中。 提示:如果以上命令执行不成功,需要逐个字符检查dlw.com.ldif文件中的内容,特别注意空格的问题。 查询
使用ldapsearch命令查询“dc=dlw,dc=com”下的所有条目,可使用以下命令:
Python代码
#ldapsearch-x-b"dc=dlw,dc=com"
执行结果如下图所示。 而如果使用以下命令,将查询显示sn中以字符wu开头的条目,将得到如下图所示的查询结果,只找到一个条目。
Python代码
#ldapsearch-x-b'dc=dlw,dc=com''sn=wu*'
修改条目
使用ldapmodify命令修改条目信息可以有两种方式:一种是交互式进行修改,另一种是通过文件进行修改。 1.交互式修改
Python代码
#ldapmodify-x-D"cn=root,dc=com"-Wsecret
执行以上命令后,终端将等候用户输入需要修改条目的dn,输入以下内容:
Python代码
以上输入内容中,第1行查找需要修改的条目,第2行设置修改模式,第3行设置需要替换的属性sn,第4行给属性sn重新设置一个值,替换该属性原有的值。 使用以上命令修改条目的数据之后,可使用以下命令查看是否修改成功:
Python代码
执行以上命令查看test条目的数据如下图所示,可以看到sn属性被修改了。 2.通过文件修改
【例子】通过修改命令将前面LDAP数据库中的信息还原,即将sn属性由“Test User Modify”修改为“Test User”。
Python代码
从以上输入内容可看到,与在交互式时输入的内容完全相同。 (2)使用以下命令调用modify的内容进行修改:
Python代码
执行结果如下图所示。 删除条目
Python代码
#ldapdelete-x-D"cn=root,dc=com"-wsecret
顺利执行以上命令后,终端上将不会有任何信息输出,表示完成了删除操作。
Python代码
数据导出
Python代码
#slapcat-lexport.ldif
执行以上命令将在当前工作目录得到文件export.ldif,打开文件将显示如下图所示的内容: 提示:从导出结果可看出,除了使用ldapadd命令添加到目录数据库中的条目数据外,还导出了很多其他信息,包括条目录UUID、时间戳等信息。 设置主从LDAP服务器
多台LDAP服务器工作过程
复制数据库
设置主服务器
Python代码
#Replicasofthisdatabase
增加replica指令,如:
Python代码
#replaceconfig
设置从服务器
Python代码
在从服务器的配置文件中,不要包含replica和replogfile指令。 测试主从LDAP服务器
(1)在主LDAP服务器中使用以下命令修改一个条目:
Python代码
输入以下内容,修改cn=dlw条目的内容:
Python代码
输入后按Enter键完成修改,操作过程如图5-7所示(将sn修改为dongliwei)。 (2)在从LDAP服务器中进行操作,查看主LDAP服务器中的操作是否被复制到从LDAP服务器中来了。在从LDAP服务器中使用以下命令进行查询:
Python代码
执行结果如下图所示,从图中可看到其中的sn也被修改为dongliwei了(数据库中原来的内容为zhangsan.modi,是前面例子中修改的值),即被主LDAP服务器进行了同步复制。 OpenLDAP在用户认证的应用
用户认证用到的ojbectClass
提示:从上面列出的属性的名称可以很容易地与组、用户的相关信息联系起来。 使用迁移工具
【例子】将系统中的用户信息迁移到LDAP目录数据库中。
Python代码
将其修改为目录服务器使用的根,如本章使用的例子要改为以下形式:
Python代码
保存后退出。 (2)使用以下命令执行脚本migrate_base.pl,用来创建根项,并为Hosts、Networks、Group和People等创建低一级的组织单元(执行该命令将生成base.ldif文件):
Python代码
#./migrate_base.pl>base.ldif
(3)由于本章前面已在LDAP服务器中创建了根项“dc=dlw,dc=com”,因此将base.ldif文件中的第1个条目删除,另外,在用户认证中只用到组和用户,也将其他无关条目删除,只保存以下内容(例子):
Python代码
(4)使用以下命令将base.ldif文件中的条目导入目录数据库:
Python代码
#ldapadd-x-D"cn=root,dc=com"-wsecret-fbase.ldif
执行结果如下图所示。 (5)开始迁移组信息。使用以下命令将/etc/group中的组信息保存到临时文件group.tmp中:
Python代码
#cat/etc/group>group.tmp
(6)系统组不导入LDAP目录数据库中,因此需对group.tmp文件中的信息进行编辑,只保留需要导入LDAP目录数据库的组的信息。
Python代码
#./migrate_group.plgroup.tmp>group.ldif
(8)使用cat命令查看group.ldif的内容,可看到已按posixGroup这种objectClass将组的数据组织完成,如下图所示。 (9)类似地,使用以下命令导出/etc/passwd中的用户数据,并删除不需要的用户,然后使用migrate_passwd.pl脚本生成LDIF文件:
Python代码
#cat/etc/passwd>passwd.tmp
提示:从上面列出的属性的名称可以很容易地与组、用户的相关信息联系起来。 (10)使用以下命令将组和用户信息导入目录数据库:
Python代码
执行以上命令的过程如下图所示。 (11)使用以下命令查看目录数据库中用户root的信息,用“uid=root”作查询条件:
Python代码
查找结果如下图所示。 通过以上的操作,就将需要导入的组和用户的信息导入到了目录数据库中,接下来还需要对客户端进行设置,使用LDAP进行登录验证操作。 设置客户端登录
Python代码
(2)修改客户端计算机中的/etc/openldap/ldap.conf文件,修改内容如下:
Python代码
(3)修改客户端计算机中的/etc/nsswitch.conf文件,在passwd、shadow、group后面都加上ldap,如下图所示。 经过以上配置以后,在客户端就可以使用LDAP目录数据库中的用户信息在客户端进行登录操作了。登录操作与使用本地用户账号相同,这里就不再演示了。 LDAP Schema
Objectclass
Python代码
例如:
Python代码
#ObjectClassDefinitions
这里kunmailUser这种数据,要包含maildir $ home $ clearpw $ forwardAddr $ quota $ storeHost $ delivery $ mailReplyText $ active等可选项,还要包括username $ cn $ vuid $ vgid 必选项。 可选项用MAY()来包含,必选项用MUST()来包含。DESC是说明项。SUP表示父类(有点像面向对象编程啊)top表示没有父类,他自己是顶级。STRUCTURAL是存储方式。一般来说每个节点都要包含一个ABSTRACT类("top" or "alias"),至少一个STRUCTURAL类,0个或者多个AUXILIARY类。AUXILIARY表示辅助型、STRUCTURAL表示结构型(默认)、ABSTRACT表示摘要型。
Python代码
如果您的组织需要一个私有的结构化对象类来表示用户,你可以子类化任何一个已经存在的person类,比如inetOrgPerson(RFC2798),然后增加需要的属性:
Python代码
该对象类从inetOrgPerson中继承允许的或者必须的属性,但是,要求myUniqueName和givenName,允许myPhoto。 Attribute
Attribute格式:
Python代码
whsp是空格的意思(' ')。numericoid 是全局唯一的 OID,是带.的十进制形式 (e.g. 1.1.0), qdescrs有一个或几个意思, woid 可以使名称或者是 OID 可选择的一定长度的后缀(e.g {10})。
Python代码
请注意,每一个都定义了属性的OID,给出了一个短的名称,以及一个简短的描述。每一个名称都是OID的一个别名。Slapd(8)在返回结果的时候,将返回第1个列出的名称。
Python代码
但是,如果我们要使name属性包含一个断言,这个属性可以被定义为name的子属性。
Python代码
很多的组织为每一个用户保留一个头像。myPhoto属性类型的定义可以用来保存用户的头像。当然用户可以选择jpegPhoto属性类型(RFC2798)(或其子类型)来保存头像。当然你只能在图片符合JPEG File Interchange Format时使用。
Python代码
在这,语法中并没有置顶photo的格式(format),这里假设访问属性的应用可以对其值进行处理。
Python代码
Syntax
Matching Rules
LDAP的schema的主要元素就是这些了,下面列举出了一些LDAP规定好的或是现在比较通用的schema,一般的LDAP服务器都应该可以识别这些定义。
Python代码
首先是ID,这里是2.5.20.1,接着是NAME,AUXILIARY说明是辅助型,之后是可选属性的定义,subschema中没有定义必须属性,如果需要定义,应该和MAY一样,将属性放在MUST()中并用$隔开
Python代码
可以看到cn属性的父属性是name,它相等性匹配于caseIgnoreMatch(匹配原则为EQUALITY,还有如SUBSTR是字符串匹配,ORDERING是顺序匹配)
Python代码
这个定义说明,这一串数字1.3.6.1.4.1.1466.115.121.1.5就代表了LDAP中的字符串,这个数字串的定义和X.500相关,包括了它的存储方式,所占空间大小等。
Python代码
其实1.3.6.1.4.1.1466.115.121.1.15 就是LDAP数据类型Directory String的ID,说明前面的cn需要等于这个数据类型才有效。 还有很多常用schema的定义都在了RFC2252中,LDAP服务器都应该支持这些基本的schema。好了,现在基本对LDAP中的schema有个一个大致的说明,可能有不到位或不妥之处,还望大家指正。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- WebServices的SOAP和WSDL
- 在AngularJS中显示一个项目而不使用ng-repeat
- scala – 将数据库(或键值存储)中的[String,Object]映射到无
- .NET 的 WCF 和 WebService 有什么区别?(转载)
- Angular2之管道学习笔记
- bash – 加快Cygwin上的文件比较(使用`cmp`)?
- Couldn't register with the bootstrap server错误
- scala – 在Play Framework中部署修补程序的最佳实践
- bash – shell脚本:检查目录名称并转换为小写
- angularjs项目运行环境 及 常见问题解决