OpenLDAP快速指南 (LDAP简介)_ldap,openldap,-程序员宅基地

技术标签: ldap  openldap  


LDAP简介



  LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力。目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略。而目录服务的更新则一般都非常简单。这种目录可以存储包括个人信息、web链结、jpeg图像等各种信息。为了访问存储在目录中的信息,就需要使用运行在TCP/IP之上的访问协议―LDAP。



  LDAP目录中的信息是是按照树型结构组织,具体信息存储在条目(entry)的数据结构中。条目相当于关系数据库中表的记录;条目是具有区别名DN(Distinguished Name)的属性(Attribute),DN是用来引用条目的,DN相当于关系数据库表中的关键字(Primary Key)。属性由类型(Type)和一个或多个值(Values)组成,相当于关系数据库中的字段(Field)由字段名和数据类型组成,只是为了方便检索的需要,LDAP中的Type可以有多个Value,而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不相关的。LDAP中条目的组织一般按照地理位置和组织关系进行组织,非常的直观。LDAP把数据存放在文件中,为提高效率可以使用基于索引的文件数据库,而不是关系数据库。类型的一个例子就是mail,其值将是一个电子邮件地址。



LDAP的信息是以树型结构存储的,在树根一般定义国家(c=CN)或域名(dc=com),在其下则往往定义一个或多个组织(organization)(o=Acme)或组织单元(organizational units) (ou=People)。一个组织单元可能包含诸如所有雇员、大楼内的所有打印机等信息。此外,LDAP支持对条目能够和必须支持哪些属性进行控制,这是有一个特殊的称为对象类别(objectClass)的属性来实现的。该属性的值决定了该条目必须遵循的一些规则,其规定了该条目能够及至少应该包含哪些属性。例如:inetorgPerson对象类需要支持sn(surname)和cn(common name)属性,但也可以包含可选的如邮件,电话号码等属性。



目录设计



  设计目录结构是LDAP最重要的方面之一。下面我们将通过一个简单的例子来说明如何设计合理的目录结构。该例子将通过Netscape地址薄来访文。假设有一个位于美国US(c=US)而且跨越多个州的名为Acme(o=Acme)的公司。Acme希望为所有的雇员实现一个小型的地址薄服务器。



  我们从一个简单的组织DN开始: 



��������dn: o=Acme, c=US



  Acme所有的组织分类和属性将存储在该DN之下,这个DN在该存储在该服务器的目录是唯一的。Acme希望将其雇员的信息分为两类:管理者(ou=Managers)和普通雇员(ou=Employees),这种分类产生的相对区别名(RDN,relative distinguished names。表示相对于顶点DN)就shi :



��������dn: ou=Managers, o=Acme, c=US

��������dn: ou=Employees, o=Acme, c=US





  在下面我们将会看到分层结构的组成:顶点是US的Acme,下面是管理者组织单元和雇员组织单元。因此包括Managers和Employees的DN组成为:



��������dn: cn=Jason H. Smith, ou=Managers, o=Acme, c=US

��������dn: cn=Ray D. Jones, ou=Employees, o=Acme, c=US

��������dn: cn=Eric S. Woods, ou=Employees, o=Acme, c=US



  为了引用Jason H. Smith的通用名(common name )条目,LDAP将采用cn=Jason H. Smith的RDN。然后将前面的父条目结合在一起就形成如下的树型结构:



��������cn=Jason H. Smith

����������������+ ou=Managers

������������������������+ o=Acme

��������������������������������+ c=US

����������������������������������������-> cn=Jason H. Smith, ou=Managers, o=Acme, c=US





  现在已经定义好了目录结构,下一步就需要导入目录信息数据。目录信息数据将被存放在LDIF文件中,其是导入目录信息数据的默认存放文件。用户可以方便的编写Perl脚本来从例如/etc/passwd、NIS等系统文件中自动创建LDIF文件。



  下面的实例保存目录信息数据为testdate.ldif文件,该文件的格式说明将可以在man ldif中得到。



  在添加任何组织单元以前,必须首先定义Acme DN: 



��������dn: o=Acme, c=US

��������objectClass: organization





  这里o属性是必须的



��������o: Acme



  下面是管理组单元的DN,在添加任何管理者信息以前,必须先定义该条目。



��������dn: ou=Managers, o=Acme, c=US

��������objectClass: organizationalUnit





  这里ou属性是必须的。



ou: Managers



  第一个管理者DN:



��������dn: cn=Jason H. Smith, ou=Managers, o=Acme, c=US

��������objectClass: inetOrgPerson





  cn和sn都是必须的属性:





��������cn: Jason H. Smith

��������sn: Smith





  但是还可以定义一些可选的属性:



��������telephoneNumber: 111-222-9999

��������mail: [email protected]

��������localityName: Houston





  可以定义另外一个组织单元:





��������dn: ou=Employees, o=Acme, c=US

��������objectClass: organizationalUnit

��������ou: Employees





  并添加雇员信息如下:





��������dn: cn=Ray D. Jones, ou=Employees, o=Acme, c=US

��������objectClass: inetOrgPerson

��������cn: Ray D. Jones

��������sn: Jones

��������telephoneNumber: 444-555-6767

��������mail: [email protected]

��������localityName: Houston



��������dn: cn=Eric S. Woods, ou=Employees, o=Acme, c=US

��������objectClass: inetOrgPerson

��������cn: Eric S. Woods

��������sn: Woods

��������telephoneNumber: 444-555-6768

��������mail: [email protected]

��������localityName: Houston





安装配置



  下一步需要设置OpenLDAP来接受刚才定义的目录结构的导入及提供访问Netscape中的地址薄。在OpenLDAP邮件列表中一个常见的问题是“我如何使Netscape地址薄来使用我的LDAP服务器?”保存地址薄信息是LDAP常见的一个应用方面,这是因为它具有快速的查询和读取功能。而且OpenLDAP支持例如SSL/TLS等会话加密和目录服务器复制等功能,这样就可以实现一个非常好的开发源码解决方案。



  下面的讨论都是基于openldap-2.0.7,其支持LDAP v2和LDAP v3。LDAP v3相对于LDAP v2最重要的是添加了对传输层安全(TLS,Transport Layer Security)的支持及增加了认证方法。OpenLDAP有两种安装方式:源代码方式和打包的deb/rpm模式。可以从http://www.openldap.org/下载源代码方式或者从http://rpmfind.net/及光盘上得到RPM包方式。源代码方式安装过程如下:



��������[root@radiusd src]# ar -xzvf openldap-2.0.7.tgz



��������[root@radiusd src]# cd openldap-2.0.7



��������[root@radiusd openldap-2.0.7]# ./configure --prefix=/usr/local





  这里指示openldap被安装在/usr/local目录下,当这并不是必须的。





��������[root@radiusd openldap-2.0.7]# make depend;make





  在安装结束以前进行测试:





��������[root@radiusd openldap-2.0.7]# make test



��������[root@radiusd openldap-2.0.7]# make install





  若出现任何编译错误,应该到OpenLDAP邮件列表去寻求帮助。你也许需要在PATH环境变量中添加如下路径:/usr/local/libexec, /usr/local/bin及/usr/local/sbin。



  PRM包方式的安装实例如下:



��������rpm -ivh openldap-2.0.7-14-i386.rpm



��������rpm -ivh openldap-devel-2.0.7-14-i386.rpm





  下来需要编辑slapd.conf文件,其是slapd守护进程的配置文件。slapd进程负责响应客户应用访问目录服务请求。配置文件存放/usr/local/etc/openldap。



  为了能使用Netscape地址薄属性,需要添加一些额外的"模式"配置信息。在slapd.conf文件的开头处添加如下include内容,但是根据安装路径的不同,模式目录路径可能也不大一样。



��������include��������/usr/local/etc/openldap/schema/cosine.schema

��������include��������/usr/local/etc/openldap/schema/inetorgperson.schema





  在slapd.conf的定义的suffix和rootdn行修改为能反应你需要的DN:



��������suffix��������"o=Acme, c=US"

��������rootdn��������"cn=root, o=Acme, c=US"





  这里cn=root条目是我们的管理DN,其不受任何访问控制或限制。其默认是cn=Manager,但是我希望root访问。在slapd.conf文件的末端添加如下内容,实现给Netsacpe进行目录过滤和搜索操作的读权限。所有没有授权的访问目录服务的请求都被作为匿名用户对待。下面的DN条目被格式化处理,也就是所有的空格被去掉,并且其值被逗号隔开。在访问控制,必须格式化条目否则将不能工作。



��������access to dn=".*,o=Acme,c=US"

����������������by anonymous����������������read





  对目录的访问许可以进行精细的调节以适应各种需求。OpenLDAP 2.0管理指南有非常好的配置访问许可的文档说明。这里为了测试目的,这样的访问控制级别是足够了。



  下面我们就将启动slapd服务器。若系统的ldap是通过RPM/DEB格式进行安装的,根据使用的Linux发布版本不同,启动脚本可能是/etc/rc.d/init.d/ldap或/etc/init.d/ldap。当然也可以手工启动来进行测试。



��������slapd &





  下面测试看slapd是否在运行 >


��������ps -ef | grep -i slapd | grep -v grep

��������root�������� 15479����������������1����0 10:42 ?����������������00:00:00 slapd

��������root�������� 15483 15479����0 10:42 ?����������������00:00:00 slapd

��������root�������� 15484 15483����0 10:42 ?����������������00:00:00 slapd

��������root�������� 15491 15483����0 10:43 ?����������������00:00:00 slapd

��������root�������� 15492 15483����0 10:43 ?����������������00:00:00 slapd





  下面测试ldap的默认端口389是否被监听:





��������netstat -an | grep 389

��������tcp��������0��������0 0.0.0.0:389��������0.0.0.0:*��������LISTEN





  到这里为止,一切看上去都很正常,下面将导入ldap信息数据到数据库中:





��������ldapadd -D "cn=root, o=Acme, c=US" -W -v -f testdata.ldif





  我们使用-D参数和无限制的cn来捆绑目录,这样允许写信息到目录中。-W参数导致服务器需要密码才能访问。缺省的密码是在slapd.conf文件中的rootpw来设定的,默认是secre。使用该默认密码是非常危险的,因此在测试完毕以后,应该改变该密码。记得使用-v参数来进行详细输出以判断是否及如何修正出现的错误。



7

测试



  当数据导入结束,下一步就需要配置客户端来进行测试。Netscape地址薄支持很多目录属性,在下面的资源部分将包含Netscape地址薄API标准链结地址。下面的简单的测试实例,将使用如下属性:cn,sn,mail.telephoneNumber和localityName。地址薄中的Nickname条目是通过属性xmozillanickname来支持的,其在任何“模式”中都不是默认地被支持而需要对“模式”进行修改。本文将不设计如何修改“模式”方面。



  打开Netscape的地址薄,选择File->New Directory,输入LDAP服务器的信息:





��������Description: Acme Address Book

��������LDAP Server: the IP/hostname address of your LDAP server

��������Server Root: o=Acme, c=US





  端口号和其他信息不需要修改。而且由于链结将以匿名用户身份进行,因此不需要设置用户名和密码。







  选择OK按钮,然后在左边的目录栏选中"Acme Address Book",最后在"Show names containing"框中输入一个查询,例如Smith然后回车。你将可以看到返回了一行数据。



  若希望对每个组织单元得到独立的列表输出,你可以在Netsacpe中创建另外一个新的目录条目:



��������Description: Acme Managers

��������LDAP Server: the IP/hostname address of your LDAP server

��������Server Root: ou=Managers, o=Acme, c=US





  这将导致仅仅在Acem目录中搜索Nanagers组织单元,也就是实现了一定的过滤。当然可以对Employees进行同样的限制。



错误处理



  可能会在测试中遇到如下问题:



  若目录服务不能返回数据,则编辑slapd.conf file并添加"Loglevel 1"。将导致slapd服务进程记录所有的信息到syslog LOCAL4。同样需要编辑 /etc/syslog.conf文件来将这些信息定向到一个单独的文件来便于调试。检查该log文件以确保slapd服务器启动正常没有任何错误信息。这同样会详细记录每个请求服务的信息。



  确保PATH环境包括所有的ldap命令的路径。



  若导入数据失败,仔细察看文件LDIF文件格式。更高一级的条目必须首先出现,从你的目录数顶端开始,直到叶子节点。



  需要有root身份来启动slapd,除非改变slapd到超过1024以上的端口。



  检查slapd.conf文件格式,若你的访问控制列表没有被格式化,则可能导致链结服务器失败。



  使用Netscape地址薄来访问LDAP是掌握使用LDAP概念一个非常好的方法。下面是一些和LDAP相关的一些链结资源,包括一些使用LDAP认证一些常见服务的方法如:系统登录及Samba等。



原文链接:http://www.freebsdchina.org/forum/viewtopic.php?t=1814&sid=82d6f2f00abe183ffb5576ac39656df8

资源

http://www.openldap.org/ - OpenLDAP Web Site

http://www.openldap.org/doc/admin/ - OpenLDAP 2.0 Administrators Guide

http://www.hklc.com/ldapschema/ - LDAP Schema Browser

http://www.padl.com/pam_ldap.html - Pam-LDAP Authentication Module (they also have some Perl migration scripts)

http://perl-ldap.sourceforge.net/ - Perl LDAP modules

http://www.unav.es/cti/ldap-smb-howto.html - Samba-PDC LDAP Howto

http://developer.netscape.com/docs/manuals/communicator/addrapi.htm - Netscape Address Book API Specification

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lipei1220/article/details/8660407

智能推荐

swiper系列 | 给分页器修改颜色_swiper设置分页未激活颜色-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏2次。先来看下,默认的状态是蓝色:通过CSS,改成绿色:.swiper-pagination-bullet-active { background-color: #52B54B}现在来看下,效果_swiper设置分页未激活颜色

kvm虚拟化技术实战-付强-专题视频课程-程序员宅基地

文章浏览阅读527次。学习KVM虚拟化技术实战技能,利用KVM虚拟化技术创建windows、linux虚拟机。_kvm 相关学习视频资料

端口(一)-放在这查询_av1568-程序员宅基地

文章浏览阅读8.3k次。PORT NUMBERS(last updated 31 August 2004) The port numbers are divided into three ranges: the Well Known Ports,the Registered Ports, and the Dynamic and/or Private Ports.The Well Known P_av1568

go string []byte相互转换_go string转byte数组-程序员宅基地

文章浏览阅读5.1k次。string 不能直接和byte数组转换string可以和byte的切片转换1,string 转为[]bytevar str string = "test"var data []byte = []byte(str) 2,byte转为stringvar data [10]byte byte[0] = 'T'byte[1] = 'E'var str string..._go string转byte数组

自动计算UITableViewCell的高度_systemlayoutsizefittingsize tableviewcell 高度-程序员宅基地

文章浏览阅读885次。需要用到一个新的API systemLayoutSizeFittingSize:来计算UITableViewCell所占空间高 度。Cell的高度是在- (CGFloat)tableView:(UITableView )tableView heightForRowAtIndexPath:(NSIndexPath )indexPath这个UITableViewDelegate的方法 里面传给UI_systemlayoutsizefittingsize tableviewcell 高度

【左神】猫狗队列-程序员宅基地

文章浏览阅读265次。给猫和狗的父类统一包装一下,附加属性时间戳,通过时间戳count来确定加入队列的先后顺序。使用两个队列,一个存猫的信息,一个存狗的信息。1. 存储猫的信息,狗的信息到队列中。弹出猫的信息,直接把猫队列弹出即可。弹出猫或狗,依次按照时间戳弹出即可。弹出狗的信息,只把狗队列弹出即可。2. 依次弹出所有的猫队列的猫。3. 依次弹出所有的狗队列的狗。5. 可以判断猫是否还有。4. 交替弹出猫狗队列。7. 判断猫或狗是否还有。6. 判断狗是否还有。...

随便推点

深度学习模型搭建与训练_model.add(flatten())-程序员宅基地

文章浏览阅读1.2k次。01 前情摘要环境出现问题故借鉴github前面的task2与task3讲解了音频数据的分析以及特征提取等内容,本次任务主要是讲解CNN模型的搭建与训练,由于模型训练需要用到之前的特侦提取等得让,于是在此再贴一下相关代码。1.1 导包In [1]:#基本库import pandas as pdimport numpy as nppd.plotting.register_matplotlib_converters()import matplotlib.pyplot as plt%matpl_model.add(flatten())

当n不为正整数怎么表示c语言,关于一道"分解整数为N个连数整数"的编程题-程序员宅基地

文章浏览阅读472次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼题目描述:一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:15=1+2+3+4+515=4+5+615=7+8请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。输入数据:一个正整数,以命令行参数的形式提供给程序。输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最..._c语言不是正整数

Connection closed by foreign host原因ip冲突及解决办法-程序员宅基地

文章浏览阅读10w+次,点赞8次,收藏32次。使用xshell连接centos时总自动断开,按网上的修改探寻报文周期方法试了,也没用,突然发现换了一个无线网后,竟然不会断开了,于是猜想是不是ip冲突导致,而且报错信息也提示连接被客户机关闭先连接会自动断开的无线网==》ipconfig==》192.168.1.104虚拟机给centos分配的ip连接不会自动断开的无线网显然一个路由器dhcp地址池是在192.16_connection closed by foreign host

ST Link设备连接正常,但是keil中找不到已连接的设备_if the target is in low power mode, please enable -程序员宅基地

文章浏览阅读2.5w次,点赞19次,收藏79次。报错:No target connectedError: Flash Download failed - Target DLL has been cancelledConnection to device is lost: check power supply and debug connection.If th..._if the target is in low power mode, please enable "debug in low power mode

LAMP兄弟连-职业技能免费线下讲座_lamp兄弟连的linux讲座吧-程序员宅基地

文章浏览阅读514次。 不管从事任何行业,一个人若想在职场获得成功,除了专业水平的不断提高和进步,学会更多的职业技能,也是职场发展的关键,程序员亦是如此。本课程旨在帮助听课者建立积极的心态,调整良好的工作和生活状态,了解如何科学的学习和工作,建立基本的时间观念和目标管理方法,掌握学习和工作中的沟通方法和技巧,将自已所拥有的专业知识与能力进行充分的发挥,并在职场获得更多的机会。 课程时间:2010年10月_lamp兄弟连的linux讲座吧

支持select下拉框选择输入和键盘输入两种输入方式并且支持手动换行_让 select 选择器同时拥有下拉选择和输入文本(支持手动输入文本和下拉选择)-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏2次。接收到一个需求,目标是实现一个工具可以支持select下拉框选择输入和键盘输入两种输入方式同时支持手动换行。1、键盘输入默认情况下div标签是不可编辑的,加上contenteditable="true"之后使得div标签变成可编辑状态,我们可以随意修改div的内容。div(class="tt" contenteditable="true") 鹅鹅鹅,曲项向天歌。白毛浮绿水..._让 select 选择器同时拥有下拉选择和输入文本(支持手动输入文本和下拉选择)

推荐文章

热门文章

相关标签