精华内容
下载资源
问答
  • ldap 协议

    2019-12-31 17:01:32
    ldap目录服务 日常生活中,或者开发过程中,需要管理的目录有很多。 如:人员组织管理,电话簿,地址簿,字典表等...ldap 协议规定所有的厂商对外提供接口的时候必须遵守统一的格式, 客户端访问也遵循统一的格式...

    ldap目录服务

    日常生活中,或者开发过程中,需要管理的目录有很多。   如:人员组织管理,电话簿,地址簿,字典表等。

    提供管理和查询目录信息的服务就是目录服务。

    有很多厂商实现了目录服务,但是对外提供的接口不统一,所以客户接入一个厂商之后想要切换厂商,成本很高。

    所以出现了ldap 协议

    ldap  协议规定所有的厂商对外提供接口的时候必须遵守统一的格式,

    客户端访问也遵循统一的格式,这样 之后,客户端想要切换厂商只要 改一个地址就可以了。

    特点

    • 目录服务的数据类型主要是字符型, 而不是关系数据库提供的整数、浮点数、日期、货币等类型。为了检索的需要添加了BIN(二进制数据)、CIS(忽略大小写)、CES(大小写敏感)、TEL(电话型)等语法(Syntax)
    • 同样也不提供象关系数据库中普遍包含的大量的函数
    • 目录有很强的查询(读)功能,适合于进行大量数据的检索,但目录一般只执行简单的更新(写)操作,不支持批量更新所需要的事务处理功能
    • 它主要面向数据的查询服务(查询和修改操作比一般是大于10:1),不提供事务的回滚(rollback)机制.
    • 目录具有广泛复制信息的能力,适合于多个目录服务器同步/更新.
    • LDAP目录的结构用树来表示,而不是用表格。正因为这样,就不能用SQL语句了
    • LDAP目录可以很快地得到查询结果,不过在写方面,就慢得多
    • LDAP目录提供了静态数据的快速查询方式
    • LDAP 采用Client/server模型 Server 用于存储数据 Client提供操作目录信息树的工具,这些工具可以将数据库的内容以文本格式(LDAP 数据交换格式,LDIF)呈现在您的面前

     

    为什么要用LDAP目录树来存储数据,用MySQL不行吗,为什么非要搞出一个树形的数据库呢?

    • 是因为用树形结构存储数据,查询效率更高(具体为什么,可以看一下关系型数据库索引的实现原理——B树/B+树)。在某些特定的场景下,使用树形数据库更理想。比如:需要储存大量的数据,而且数据不是经常更改,需要很快速的查找。
    • 把它与传统的关系型数据库相比,LDAP除了快速查找的特点,它还有很多的运用场景,比如域验证等。

     

     

    LDAP目录数据结构

    在LDAP中目录是按照树型结构组织——目录信息树(DIT)

    DIT是一个主要进行读操作的数据库 DIT由条目(Entry)组成,条目相当于关系数据库中表的记录;

    条目是具有分辨名DN(DistinguishedName)的属性-值对(Attribute-value,简称AV)的集合.

    LDIF是LDAP数据库信息的一种文本格式。

    1. 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)属性,但也可以包含可选的如邮件,电话号码等属性。

    2. LDAP简称对应

    o– organization(组织-公司)可以 3~64 个字符长度。

    ou – organization unit(组织单元-部门) 最多可以有四级,每级最长 32 个字符,可以为中文。

    c - countryName(国家)

    dc - domainComponent(域名)dc=xxxx,dc=com

    sn – suer name(真实名称)

    cn - common name(常用名称)最长可以到 80 个字符,可以为中文。

    dn 类似于 Linux 文件系统的绝对路径,每个对象都有一个唯一的名称。

    3. 目录设计

    LDAP 目录树的最顶部就是根,也就是所谓的 " 基准DN "。

    基准 DN 通常使用三种格式之一

    • 以 X.500 格式表示的基准 DN,例如 o=xxxx, c=CN
    • 用公司的 Internet 地址表示的基准 DN,例如 o=xxxx.com
    • 用 DNS 域名的不同部分组成的基准 DN,例如 dc=xxxx, dc=com
    • 如果使用活动目录(Active Directory),Microsoft 限制必须使用 DNS 域名格式。

    设计目录结构是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

    -> dn: 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: headhauncho@acme.com

    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: jonesrd@acme.com

    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: woodses@acme.com

    localityName:Houston

     

    4 定制对象

    • LDAP 目录可以定制成存储任何文本或二进制数据。
    • LDAP 目录用对象类型(object classes)的概念来定义运行哪一类的对象使用什么属性。
    • LDAP 目录以一系列 " 属性对 " 的形式来存储记录项,每一个记录项包括属性类型和属性值(这与关系型数据库用行和列来存取数据有根本的不同)。
    • LDAP 目录被设计成为一个属性保存多个值的,而不是在每一个属性的后面用逗号把一系列值分开。这样的方式存储数据,数据库有很大的灵活性,不必为加入一些新的数据就重新创建表和索引。
    • LDAP 目录不必花费内存或硬盘空间处理 " 空 " 域,也就是说,实际上不使用可选择的域也不会花费任何资源。
    • 记录项的格式是 LDIF,用来导入和导出 LDAP 目录的记录项。
    • 属性的值在保存的时候是保留大小写的,但是在默认情况下搜索的时候是不区分大小写的。
    • 某些特殊的属性(例如,password)在搜索的时候需要区分大小写。

    5 模式

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

    在LDAP的schema中,有四个重要的元素:

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


    例如:

     

    这里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表示摘要型。

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

    如果您的组织需要一个私有的结构化对象类来表示用户,你可以子类化任何一个已经存在的person类,比如inetOrgPerson(RFC2798),然后增加需要的属性:

    该对象类从inetOrgPerson中继承允许的或者必须的属性,但是,要求myUniqueName和givenName,允许myPhoto。

    2、Attribute
    attribute就是一个上面objectclass中可能包含的属性,对其的定义包括名称,数据类型,单值还是多值以及匹配规则等。后面用具体的例子来说明。

    Attribute格式:

    whsp是空格的意思(' ')。numericoid 是全局唯一的 OID,是带.的十进制形式 (e.g. 1.1.0), qdescrs有一个或几个意思, woid 可以使名称或者是 OID 可选择的一定长度的后缀(e.g {10})。

    例如,属性类型name和cn在core.schema中如下定义:

    请注意,每一个都定义了属性的OID,给出了一个短的名称,以及一个简短的描述。每一个名称都是OID的一个别名。Slapd(8)在返回结果的时候,将返回第1个列出的名称。

    第1个名称,name,保存了directoryString(UTF-8编码的Unicode)语法。该语法由OID说明。(1.3.6.1.4.1.1466.115.121.1.15标识了目录字符串语法)。还说明了一个推荐长度为32768的选项。服务器应该支持该长度的值,但是,也可以支持更长的值。该域没有指明长度限制,因此,在服务器上被忽略,并且服务器不会限制其大小。另外,相等和子串匹配使用不区分大小写的规则。下面是经常使用的语法和匹配规则(OpenLDAP支持这些,以及更多)

    第2个属性,cn,是name的一个子类型,因此,它继承了语法,匹配规则,并且使用name.commonName作为别名。

    两个属性都没有限制到单一值。都可以被用户应用程序所使用,都不存在过期,都不是集合。

    很多组织为用户保留唯一的名字(unique name),虽然用户可以使用displayName,但是这个属性(name)依旧由用户控制。而不是organization。我们可以从 inetorgperson.schema 拷贝displayName ,替换OID,name,和描述(description)。

    但是,如果我们要使name属性包含一个断言,这个属性可以被定义为name的子属性。

    很多的组织为每一个用户保留一个头像。myPhoto属性类型的定义可以用来保存用户的头像。当然用户可以选择jpegPhoto属性类型(RFC2798)(或其子类型)来保存头像。当然你只能在图片符合JPEG File Interchange Format时使用。

    当然,一个使用八进制语法的属性类型可以这样的定义:

    在这,语法中并没有置顶photo的格式(format),这里假设访问属性的应用可以对其值进行处理。

    如果你想支持多种图片格式,你需要为每一个格式定义属性类型。为图片添加类型信息的前缀。或者使用ASN.1描述值,和use the ;binary transfer option。

     

    可以使图片属性能够保存URI,你可以在labeledURI(RFC2079)后创建一个属性,或者创建一个子类型。
    

    3、Syntax
    syntax是LDAP中的“语法”,其实就是LDAP中会用到的数据类型和数据约束,这个语法是遵从X.500中数据约束的定义的。其定义需要有一个ID(遵从X.500)以及说明(DESP)

     

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

     

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

    这就是一个名为subschema的objectclass的定义:

    首先是ID,这里是2.5.20.1,接着是NAME,AUXILIARY说明是辅助型,之后是可选属性的定义,subschema中没有定义必须属性,如果需要定义,应该和MAY一样,将属性放在MUST()中并用$隔开

    再来看一个属性定义:

    可以看到cn属性的父属性是name,它相等性匹配于caseIgnoreMatch(匹配原则为EQUALITY,还有如SUBSTR是字符串匹配,ORDERING是顺序匹配)

    syntax定义一般都比较简单,如:

    这个定义说明,这一串数字1.3.6.1.4.1.1466.115.121.1.5就代表了LDAP中的字符串,这个数字串的定义和X.500相关,包括了它的存储方式,所占空间大小等。

    最后看看Matching Rule的例子,前面提到了caseIgnoreMatch,就看他的吧

    其实1.3.6.1.4.1.1466.115.121.1.15 就是LDAP数据类型Directory String的ID,说明前面的cn需要等于这个数据类型才有效。

    还有很多常用schema的定义都在了RFC2252中,LDAP服务器都应该支持这些基本的schema。


     

    命名目录服务的功能有哪些?

     

    支持四类10种操作:

    查询类 : 搜索  ,比较

    更新类: 添加  修改条目,修改条目名, 删除  

    认证类: 绑定,解绑定

    其他类:放弃 ,扩展。

     

    命名目录服务可以解决什么问题

     

    • 1.LDAP目录服务可以有效地解决众多网络服务的用户账户问题。实现集中账号管理
    • 2.LDAP目录服务规定了统一的身份信息数据库、身份认证机制和接口,实现了资源和信息的统一管理,保证了数据的一致性和完整性。
    • 3.LDAP目录服务是以树状的层次结构来描述数据信息的,此种模型适应了众多行业应用的业务组织结构。
       

     

    常用的命名服务器有哪些?

    厂商

    产品

    介绍

    SUN

    SUNONE Directory Server

    基于文本数据库的存储,速度快 。

    IBM

    IBM Directory Server

    基于DB2 的的数据库,速度一般。

    Novell

    Novell Directory Server

    基于文本数据库的存储,速度快, 不常用到。

    Microsoft 

    Microsoft Active Directory

    基于WINDOWS系统用户,对大数据量处理速度一般,但维护容易,生态圈大,管理相对简单。

    Opensource

    Opensource

    OpenLDAP 开源的项目,速度很快,但是非主 流应用。

     

     

     

     

     

     

     

     

     

    OpenLDAP 目录服务优点


    OpenLDAP 目录服务有以下10 个优点。

    OpenLDAP 是一个跨平台的标准互联网协议,它基于X.500 标准协议。

    OpenLDAP 提供静态数据查询搜索,不需要像在关系数据中那样通过SQL 语句维护数据库信息。

    OpenLDAP 基于推和拉的机制实现节点间数据同步,简称复制(replication)并提供基于TLS、SASL 的安全认证机制,实现数据加密传输以及Kerberos 密码验证功能。

    OpenLDAP 可以基于第三方开源软件实现负载(LVS、HAProxy)及高可用性解决方案,24 小时提供验证服务,如Headbeat、Corosync、Keepalived 等。

    OpenLDAP 数据元素使用简单的文本字符串(简称LDIF 文件)而非一些特殊字符,便于维护管理目录树条目, 章

    OpenLDAP 可以实现用户的集中认证管理,所有关于账号的变更,只须在OpenLDAP 服务器端直接操作,无须到每台客户端进行操作,影响范围为全局。

    OpenLDAP 默认使用协议简单如支持TCP/ZP 协议传输条目数据,通过使用查找操作实现对目录树条目信息的读写操作,同样可以通过加密的方式进行获取目录树条目信息。

    OpenLDAP 产品应用于各大应用平台(Nginx、HTTP、vsftpd、Samba、SVN、Postfix、OpenStack、Hadoop 等)、服务器(HP、IBM、Dell 等)以及存储(EMC、NetApp 等)控制台,负责管理账号验证功能,实现账号统一管理。

    OpenLDAP 实现具有费用低、配置简单、功能强大、管理容易及开源的特点。

    OpenLDAP 通过ACL(Access Control List)灵活控制用户访问数据的权限,从而保证数据的安全性。

     

    OpenLDAP 功能


    在LDAP 的功能模型中定义了一系列利用LDAP 协议的操作,主要包含以下4 部分。

    查询操作(ldapsearch):允许查询目录并取得条目,其查询性能比关系数据库好。

    更新操作(ldapupdate):目录树条目支持条目的添加、删除、修改等操作。

    同步操作:OpenLDAP 是一种典型的分布式结构,提供复制同步,可将主服务器上的数据通过推或拉的机制实现在从服务器上更新,完成数据的同步,从而避免OpenLDAP 服务器出现单点故障,影响用户验证。

    认证和管理操作:允许客户端在目录中识别自己,并且能够控制一个会话的性质。


     

    OPENLDAP 服务器

    环境:基于centos7,OpenLDAP使用2.4.44版本

    安装

    使用命令安装OpenLDAP:

    yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel migrationtools
    

    查看OpenLDAP版本,使用如下命令:

    slapd -VV
    
    
    

    OpenLDAP配置

     OpenLDAP2.4.23版本开始所有配置数据都保存在/etc/openldap/slapd.d/

    配置OpenLDAP管理员密码

    slappasswd -s [password]

    密码设置好了之后呢,保存好,下面会使用到。

    修改olcDatabase={2}hdb.ldif文件

    修改olcDatabase={2}hdb.ldif文件,对于该文件增加一行


    olcRootPW: {SSHA}dXgO/Ipy5SQiKFZ0u7m79Xo7uzKIr038,然后修改域信息:

    olcSuffix: dc=teracloud2,dc=cn

    olcRootDN: cn=admin,dc=teracloud2,dc=cn

    注意:其中cn=admin中的admin表示OpenLDAP管理员的用户名,dc为ldap的服务器域名,导出而olcRootPW表示OpenLDAP管理员的密码。

    实际修改如下:

    vim /etc/openldap/slapd.d/cn=config/olcDatabase\=\{2\}hdb.ldif

    olcSuffix: dc=teracloud2,dc=cn

    olcRootDN: cn=admin,dc=teracloud2,dc=cn

    olcRootPW: {SSHA}dXgO/Ipy5SQiKFZ0u7m79Xo7uzKIr038
     

    在这里插入图片描述

     

    修改olcDatabase={1}monitor.ldif文件

    修改olcDatabase={1}monitor.ldif文件,如下:

    vim /etc/openldap/slapd.d/cn=config/olcDatabase\=\{1\}monitor.ldif

    olcAccess: {0}to * by dn.base=”gidNumber=0+uidNumber=0,cn=peercred,cn=extern

    al,cn=auth” read by dn.base=”cn=admin,dc=teracloud2,dc=cn” read by * none
    在这里插入图片描述

    验证OpenLDAP的基本配置是否正确,使用如下命令:

    slaptest -u
     

    在这里插入图片描述

    通过结果看出我们的配置是没有问题的

     

    启动OpenLDAP服务

    //开始ldap
    systemctl enable slapd

    //启动ldap
    systemctl start slapd

    //查看ldap的状态
    systemctl status slapd
     

    在这里插入图片描述

     

    配置OpenLDAP数据库

    OpenLDAP默认使用的数据库是BerkeleyDB,现在来开始配置OpenLDAP数据库,使用如下命令:

    cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
    
    chown ldap:ldap -R /var/lib/ldap
    
    chmod 700 -R /var/lib/ldap
    
    ll /var/lib/ldap/
    
    

    注意:/var/lib/ldap/就是BerkeleyDB数据库默认存储的路径。
     

    在这里插入图片描述

    在这里插入图片描述

     

    导入基本Schema

    导入基本Schema,使用如下命令:

    ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
    
    ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
    
    ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
    
    

    注意:如果这一步导入失败,一般都是密码输入错误,密码要输上面配置的加密前的密码

     

    创建基本的用户节点,数据库管理员

    dn: dc=teracloud2,dc=cn
    objectClass: top
    objectClass: dcObject
    objectclass: organization
    o: Example Inc.
    dc: teracloud2

    dn: ou=Users,dc=teracloud2,dc=cn
    objectClass: organizationalUnit
    ou: Users

    dn: ou=group,dc=teracloud2,dc=cn
    objectClass: organizationalUnit
    ou: group

    dn: cn=admin,dc=teracloud2,dc=cn
    objectClass: organizationalRole
    cn: admin
    description: Directory Administrator
     

    在这里插入图片描述

    ldapadd  -x -D cn=admin,dc=teracloud2,dc=cn-W -f basedomain.ldif  

    [root@VM_0_15_centos myself]# ldapadd -x -D cn=admin,dc=teracloud2,dc=cn-W -f basedomain.ldif
    Enter LDAP Password:
    adding new entry “dc=teracloud2,dc=cn”

    adding new entry “ou=people,dc=teracloud2,dc=cn”

    adding new entry “ou=group,dc=teracloud2,dc=cn”

    adding new entry “cn=admin,dc=teracloud2,dc=cn”

     

    配置日志

    [root@VM_0_15_centos myself]# vim log.ldif

    [root@VM_0_15_centos myself]# cat log.ldif   
    dn: cn=config
    changetype: modify
    add: olcLogLevel
    olcLogLevel: 32     
                                                                              
    "log.ldif" [New] 4L, 66C written                                                   
    [root@VM_0_15_centos myself]# ldapmodify -Y EXTERNAL -H ldapi:/// -f log.ldif
    SASL/EXTERNAL authentication started
    SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
    SASL SSF: 0
    modifying entry "cn=config"

    [root@VM_0_15_centos myself]# mkdir -p /var/log/slapd
    [root@VM_0_15_centos myself]# chown ldap:ldap /var/log/slapd/
    [root@VM_0_15_centos myself]# echo "local4.* /var/log/slapd/slapd.log" >> /etc/rsyslog.conf
    [root@VM_0_15_centos myself]# systemctl restart rsyslog
    [root@VM_0_15_centos myself]# systemctl restart slapd
    [root@VM_0_15_centos myself]# tail -n 4 /var/log/slapd/slapd.log
    Sep  5 20:43:31 VM_0_15_centos slapd[4520]: => test_filter
    Sep  5 20:43:31 VM_0_15_centos slapd[4520]:    PRESENT
    Sep  5 20:43:31 VM_0_15_centos slapd[4520]: <= test_filter 6
    Sep  5 20:43:31 VM_0_15_centos slapd[4523]: slapd starting

    工具连接

    图形操作界面有很多种,包括ldapadminldapadmin.exe,当然还有其他的,这个步骤比较简单,就不详细讲解了

    遇到的错误

    查看ldap的状态,发现无法启动

    在这里插入图片描述

    在这里插入图片描述

    查看日志发现,有个和证书相关的错误
    could not use certificate openLDAP server’,
    查看下目录发现没有证书的,目录

    在这里插入图片描述

     

    把证书拷贝过去,启动,问题解决
    在这里插入图片描述

     

     

    客户端访问:

    1 可以把ApacheDirectoryStudio看做是连接数据库服务器的界面化的client,相当于Navicat、WorkBench。新建连接,连接数据库服务器的操作类似。

    ApacheDirectoryStudio下载地址
    http://download.csdn.net/download/ljheee/10145654


     

    2 可以用JDBC操作MySQL数据库,进行对数据的增删改查。同样,LDAP树形数据库,也可以通过JDBC方式;除此之外,还可以用JNDI的方式(更推荐),因为树形可以看做是目录,树结构的枝杈相当于目录的层级。

    JNDI :全称:JAVA NAMING AND Directory interface 

    解释:java 命名目录访问接口:java 命名服务和目录服务而提供的统一API。

    理解:通过命名来访问需要的资源,类似DNS服务,可通过 key-value的形式。

    JNDI是JAVA为命名及目录服务访问制定的基础接口标准,用于访问包括DNS,NIS,LDAP,文件系统等任何以树目录形式存在目标对象,并且基本上可保持访问方式的一致(意味着代码共用)。对于不同的目录类型,JNDI通过使用不同的目录驱动,以保证访问方式的一致

     

    LDAP :全称:LIGHTWEIGHT DIRECTORY ACCESS Protocol

    解释: 轻量级目录访问协议。是在20世纪90年代早期作为标准目录协议进行开发的。它是目前最流行的目录协议,与厂商、具体平台无关。LDAP用统一的方式定义了如何访问目录服务中的内容,比如增加、修改、删除一个条目

    理解:LDAP用统一的方式定义了如何访问目录服务中的内容,比如增加、修改、删除一个条目。

    LDAP 是协议,LDAP 服务可以理解为“层次数据库”服务,相比关系型数据库,查询更快。

     

    关系JNDI  - LDAP :

    JNDI则是Java中用于访问LDAP的API,开发人员使用JNDI完成与LDAP服务器之间的通信,即用JNDI来访问LDAP,而不需要和具体的目录服务产品特性打交道。这样通过LDAP、JNDI两层抽象,使Java程序对目录服务的访问做到了平台无关性。

     

    连接:

    Hashtable env = new Hashtable();
    String LDAP_URL = "ldap://<IP>:389"; // LDAP 访问地址
    String adminName = "example\\user"; // 注意用户名的写法:domain\User 或 cn=user
    String adminPassword = "userpassword"; // 密码
    env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
    env.put(Context.PROVIDER_URL, LDAP_URL);
    env.put(Context.SECURITY_AUTHENTICATION, "simple");
    env.put(Context.SECURITY_PRINCIPAL, adminName);
    env.put(Context.SECURITY_CREDENTIALS, adminPassword);
    try {
         dc = new InitialDirContext(env);// 初始化上下文
         System.out.println("认证成功");
    } catch (javax.naming.AuthenticationException e) {
         System.out.println("认证失败");
    } catch (Exception e) {
         System.out.println("认证出错:" + e);
    }

    增加记录

    String root = "dc=example,dc=com"; // LDAP的根节点的DC
    
    BasicAttributes attrs = new BasicAttributes();
    BasicAttribute objclassSet = new BasicAttribute("objectClass");
    objclassSet.add("sAMAccountName");
    objclassSet.add("employeeID");
    objclassSet.add("sAMAccountName");
    objclassSet.add("employeeID");
    attrs.put(objclassSet);
    attrs.put("ou", newUserName);
    dc.createSubcontext("ou=" + newUserName + "," + root, attrs);

    LDAP 删除记录

    try {
         dc.destroySubcontext(dn);
    } catch (Exception e) {
         e.printStackTrace();
         System.out.println("Exception in delete():" + e);
    }

    修改记录

    try {
          ModificationItem[] mods = new ModificationItem[1];
          /* 修改属性 */
          // Attribute attr0 = new BasicAttribute("employeeID", "test");
          // mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, attr0);
          /* 删除属性 */
          // Attribute attr0 = new BasicAttribute("description", "test");
          // mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, attr0);
          /* 添加属性 */
          Attribute attr0 = new BasicAttribute("employeeID", employeeID);
          mods[0] = new ModificationItem(DirContext.ADD_ATTRIBUTE, attr0);
          /* 修改 */
          dc.modifyAttributes(dn + ",dc=example,dc=com", mods);
          return true;
    } catch (NamingException e) {
          e.printStackTrace();
          System.err.println("Error: " + e.getMessage());
          return false;
    }

    重命名

    try {
          dc.rename(oldDN, newDN);
          return true;
    } catch (NamingException ne) {
          System.err.println("Error: " + ne.getMessage());
          return false;
    }

    查询

    // 创建搜索控件
    SearchControls searchCtls = new SearchControls();
    // 设置搜索范围
    searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    // 设置搜索过滤条件
    String searchFilter = "sAMAccountName=" + userName;
    // 设置搜索域节点
    String searchBase = "DC=example,DC=COM";
    // 定制返回属性
    String returnedAtts[] = { "url", "whenChanged", "employeeID", "name", "userPrincipalName", "physicalDeliveryOfficeName", "departmentNumber", "telephoneNumber", "homePhone", "mobile", "department", "sAMAccountName", "whenChanged", "mail" };
    // 不定制属性,返回所有的属性集
    // searchCtls.setReturningAttributes(null);
    int totalResults = 0;
    try {
         NamingEnumeration answer = dc.search(searchBase, searchFilter, searchCtls);
         while (answer.hasMoreElements()) {
               SearchResult sr = (SearchResult) answer.next();
               Attributes Attrs = sr.getAttributes();
               if (Attrs != null) {
                     try {
                            for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {
                                    Attribute Attr = (Attribute) ne.next();
                                    // 读取属性值
                                    for (NamingEnumeration e = Attr.getAll(); e.hasMore(); totalResults++) {
                                             // 接受循环遍历读取的userPrincipalName用户属性
                                             String user = e.next().toString();
                                    }
                                    // 读取属性值
                                    // Enumeration values = Attr.getAll();
                                    // if (values != null) {
                                    //          while (values.hasMoreElements()) {
                                    //                   System.out.println(" 2AttributeValues=" + values.nextElement());
                                    //          }
                                    // }
                            }
                     } catch (NamingException e) {
                            System.err.println("Throw Exception : " + e);
                     }
               }
         }
    } catch (Exception e) {
          e.printStackTrace();
          System.err.println("Throw Exception : " + e);
    }

    搜索范围包含

    • 本节点:SearchControls.OBJECT_SCOPE
    • 单层:SearchControls.ONELEVEL_SCOPE
    • 遍历:SearchControls.SUBTREE_SCOPE

     

    LDAP 关闭

    if (dc != null) {
         try {
             dc.close();
         } catch (NamingException e) {
             System.out.println("NamingException in close():" + e);
         }
    }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • LDAP协议

    2019-04-04 09:16:00
    一、LDAP协议基础概念1. 从用途上阐述LDAP,它是一个存储静态相关信息的服务,适合“一次记录多次读取”。常用LDAP服务存储的信息: 公司的物理设备信息(如打印机,它的IP地址、存放位置、厂商、购买时间等) ...

    一、LDAP协议基础概念 

    1. 从用途上阐述LDAP,它是一个存储静态相关信息的服务,适合“一次记录多次读取”。常用LDAP服务存储的信息: 

    • 公司的物理设备信息(如打印机,它的IP地址、存放位置、厂商、购买时间等)
    •  公开的员工信息(地址、电话、电子邮件…)
    •  合同和账号信息(客户信息、产品交付日期、投标信息、项目信息…)
    •  凭证信息(认证凭证、许可证凭证…)


    2. 从数据结构上阐述LDAP,它是一个树型结构,能有效明确的描述一个组织结构特性的相关信息。在这个树型结构上的每个节点,我们称之为“条目(Entry)”,每个条目有自己的唯一可区别的名称(Distinguished Name ,DN)。条目的DN是由条目所在树型结构中的父节点位置(Base DN)和该条目的某个可用来区别身份的属性(称之为RDN如uid , cn)组合而成。对Full DN :“shineuserid=linly , ou=Employee , dc=jsoso , dc=net”而言,其中Base DN:“ou=Employee , dc=jsoso , dc=net”,RDN:“shineuserid=linly”下面是一个LDAP服务器的数据结构图: 
     
    3. 从协议衍化上阐述LDAP,它是“目录访问协议DAP——ISO X.500”的衍生,简化了DAP协议,提供了轻量级的基于TCP/IP协议的网络访问,降低了管理维护成本,但保持了强壮且易于扩充的信息框架。LDAP的应用程序可以很轻松的新增、修改、查询和删除目录内容信息。 

    二、LDAP的使用:

    软件openLDAP,开源,http://www.openldap.org;

    1.安装,配置:

    2.数据操作:

            添加数据=>

            (1)使用ldif(LDAP目录交换格式)文件;

            (2)文件内,每条记录,使用空行分开:

                    第一行:dn: xxxxx,必须定义顶级区分名;

                    第二行->第n行:属性:值;

            (3)命令行添加内容:

                    ladapadd -D "区分名dn" -w 密码< 文件.ldif

                    如远程修改,添加-h 主机名;-p 端口名(一般6005);

                    部分情况需要追加-x,否则添加失败;

                    -v,输出运行情况;

                    ldapadd -x -h localhost -p 6005 -w 密码 -D cn=root -v -f 文件名.ldif

            (4)命令行查询内容:

                    查询某个区分名的所有数据,ldapsearch 区分名=值

                    查询根的所有区分名,ldapsearch '(&(条件1)(ou=根名))' dn

                    如远程修改,添加-h 主机名;-p 端口名(一般6005);

                    ldapsearch -x -LLL -h localhost -p 6005 -w 密码 -D cn=root -b dc=xx "(|(条件1))" "属性名+空格+属性名"

                    dc,条目(多个属性的集合)所属的完整路径;

                   

    转载于:https://www.cnblogs.com/oner-xd/p/10652978.html

    展开全文
  • LDAP 协议

    千次阅读 2019-07-19 17:08:47
    LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol 1. 目录        目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix...

    LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol

    1. 目录

    目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就像Linux/Unix系统中的文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。目录服务是由目录数据库和一套访问协议组成的系统。

    类似以下的信息适合储存在目录中:

    1. 企业员工信息,如姓名、电话、邮箱等;
    2. 公用证书和安全密钥;
    3. 公司的物理设备信息,如服务器,它的IP地址、存放位置、厂商、购买时间等;

    LDAP是基于X.500标准而发展起来的,但是它更加简单,并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。

    2. X.500与ldap区别

    X.500实际上不是一个协议,它是由一个协议族组成:X.501模型强调目录服务基本模型和概念;X.509认证框架是如何在X.500中处理目录客户和服务器的认证;X.511 抽象服务定义X.500被要求提供的功能性服务;X.518 分布式操作过程表明如何跨越多台服务器处理目录服务;X.519 协议规范即是X.500协议,包括目录访问协议DAP、目录系统协议DSP、目录操作绑定协议DOP和目录信息Shadowing协议DISP;X.520 选定的属性类型要求是X.500自己使用的属性类型;X.521选定的对象类即为X.500自己使用的对象类;X.525复制是如何在目录服务器之间复制目录内容。

    X.500虽然是一个完整的目录服务协议,但在实际应用的过程中,却存在着不少障碍。由于目录访问协议DAP这种应用层协议是严格遵照复杂的ISO七层协议模型制定的,对相关层协议环境要求过多,随着TCP/IP协议体系的普及,更使得这种协议越来越不适应需要。

    LDAP协议从1993年批准,产生了LDAP V1版本,随后于1997年发布了第三个版本LDAP V3,它的出现是LDAP协议发展的一个里程碑性标志,它使LDAP协议不仅仅作为X.500的简化版,同时提供了LDAP协议许多自有的特性,使LDAP协议功能更为完备,具有了更大的生命力。

    LDAP V3协议也不是一个协议,而是一个协议族。RFC 2251——LDAP V3核心协议,定义了LDAP V3协议的基本模型和基本操作;RFC 2252——定义了LDAP V3中的基本数据模式(Schema)(包括语法、匹配规则、属性类型和对象类)以及标准的系统数据模式;RFC 2253——定义了LDAP V3中的分辨名(DN)表达方式;RFC 2254——定义了LDAP V3中的过滤器的表达方式;RFC 2255——LDAP统一资源地址的格式;RFC 2256——在LDAP V3中使用X.500的Schema列表;RFC 2829——定义了LDAP V3中的认证方式;RFC 2830——定义了如何通过扩展使用TLS服务;RFC 1823——定义了C的LDAP客户端API开发接口;RFC 2847——定义了LDAP数据导入、导出文件接口LDIF。

    3. LDAP基本概念

    下图为LDAP 目录树

    属性别名描述
    Domain ComponentDC域组件
    Organizational UnitOU组织单位
    COMMON NAMECN姓名

    LDAP Directory Tree

    3.1 条目(Entry)

    LDAP条目是有关实体的信息的集合。条目(Entry)就是目录管理的对象,他是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的。每个条目Entry由三个主要组件组成:可分辨名称(distinguished name,dn),属性集合和对象类集合(objectclass)。

    每一个条目都有一个唯一的标识名(distinguished Name ,DN)。

    上图dn:cn=jsmith,ou=People,dc=example,dc=com。DN在语法上是由多个相对的标识名(distinguished Name ,DN)组成的,他们之间由逗号分隔。如果把DN看做对象的全路径,那么RDN就是其中的每一段路径。通过DN的层次型语法结构,可以方便地表示出条目在LDAP树中的位置。有时在不一致引起歧义的情况下,RDN也特指DN中最靠前的一段,即“cn=jsmith”;而剩余的部分称为父标识(Parent DN,PDN),即“ou=People,dc=example,dc=com”。

    RDN本身也可以由多个值构成,比如OU=Tech+CN=doubao,dc=shuyun,dc=com中的RDN为OU=Tech+CN=doubao,由2个值OU=Tech和CN=doubao组成,他们之间由加好隔开。

    3.2 属性(Attribute)

    每个条目都可以有很多属性(Attribute),比如常见的人都有姓名、地址、电话等属性。每个属性都有名称及对应的值,属性值可以有单个、多个,比如你有多个邮箱。

    属性不是随便定义的,需要符合一定的规则,而这个规则可以通过schema制定。比如,如果一个entry没有包含在 inetorgperson 这个schema 中的objectClass: inetOrgPerson,那么就不能为它指定employeeNumber属性,因为employeeNumber是在inetOrgPerson中定义的。

    LDAP为人员组织机构中常见的对象都设计了属性(比如commonName,surname)。下面有一些常用的别名:

    属性别名语法描述值(举例)
    commonNamecnDirectory String姓名sean
    surnamesnDirectory StringChow
    organizationalUnitNameouDirectory String单位(部门)名称IT_SECTION
    organizationoDirectory String组织(公司)名称example
    telephoneNumberTelephone Number电话号码110
    objectClass内置属性organizationalPerson

    3.3 属性类型(AttributeType)

    每个属性都有唯一的属性类型(AttributeType),属性类型约定属性值的数据格式和语法类型(Syntax)。比如,属性cellPhone的类型为telephoneNumber,它规定了电话号码是由数字组成的,其中允许插入一些分隔符,如连接符、括号、空格等。

    属性类型也约定了属性值是否可以有多少个,多值属性类型也可以使人员信息的组织变得更加灵活并接近现实情况,比如:人员的手机、地址、邮箱等属性都可以有多个值。这样,用ldap组织的信息会比简单的表结构更加理想。

    类型也规定了属性查询时的匹配规则、排序顺序、大小写敏感等。

    3.4 对象类(ObjectClass)

    对象类(ObjectClass)是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。比如人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码(userPassword)等属性,单位职工(organizationalPerson)是人员(person)的继承类,除了上述属性之外还含有职务(title)、邮政编码(postalCode)、通信地址(postalAddress)等属性。

    通过对象类可以方便的定义条目类型。每个条目可以直接继承多个对象类,这样就继承了各种属性。如果2个对象类中有相同的属性,则条目继承后只会保留1个属性。对象类同时也规定了那些属性是基本信息,必须含有:哪些属性是扩展信息,可以含有。

    对象类有三种类型:结构类型(Structural)、抽象类型(Abstract)和辅助类型(Auxiliary)。

    1. 结构类型是最基本的类型,它规定了对象实体的基本属性,每个条目属于且仅属于一个结构型对象类。
    2. 抽象类型可以是结构类型或其他抽象类型父类,它将对象属性中共性的部分组织在一起,称为其他类的模板,条目不能直接集成抽象型对象类。
    3. 辅助类型规定了对象实体的扩展属性。虽然每个条目只属于一个结构型对象类,但可以同时属于多个辅助型对象类。

    对象类本身是可以相互继承的,所以对象类的根类是top抽象型对象类

    如果将其中一支 top–>person–>organizationalPerson–>inetOrgPerson,比如organizationalPerson派生出职工(employee)对象类,那么它可以含有工号(employeeNumber)、工种(employeeType)等属性。注意,对象类继承的时候会把属性是必须(Must)还是可选(May)的特性也一并继承。也就是说person有cn和sn两个Must属性,organizationalPerson和inetOrgPerson由于直接或间接继承了person,也会有这两个Must属性。

    对象类必要属性(Required)可选属性(Optional)
    topobjectClass
    personcndescriptionseeAlsotelephoneNumber
    snuserPassword
    organizationalPersondestinationIndicatorfacsimileTelephoneNumberinternationalISDNNumber
    louphysicalDeliveryOfficeName
    postalAddresspostalCodepostOfficeBox
    preferredDeliveryMethodregisteredAddressst
    streetteletexTerminalIdentifiertelexNumber
    titlex121Address
    inetOrgPersonaudiobusinessCategorycarLicense
    departmentNumberdisplayNameemployNumber
    employeeTypegivenNamehomePhone
    homePostalAddressinitalsjpegPhoto
    labeledURLmailmanager
    mobileopager
    photopreferredLanguageroomNumber
    secretaryuiduserCertificate
    userOKCS12userSMIMECertificatex500UniqueIdentifier

    3.5 模式(Schema)

    对象类(ObjectClass)、属性类型(AttributeType)、语法(Syntax)分别约定了条目、属性、值。所以这些构成了模式(Schema)——对象类的集合。条目数据在导入时通常需要接受模式检查,它确保了目录中所有的条目数据结构都是一致的。

    3.6 backend & database

    LDAP的后台进程slapd接收、响应请求,但实际存储数据、获取数据的操作是由backend做的,而数据是存放在database中,所以你可以看到往往你可以看到backend和database指令是一样的值如 bdb 。一个 backend 可以有多个 database instance,但每个 database 的 suffix 和 rootdn 不一样。

    4. LDAP 解释:

    LDAP是一个轻量级的产品(LightWeight),是一个Directory(D),存取的协议(Access Protocol)。

    LDAP是一个数据库,但是又不是一个数据库。说他是数据库,因为他是一个数据存储的东西。但是说他不是数据库,是因为他的作用没有数据库这么强大,而是一个目录。

    为了理解,给一个例子就是电话簿(黄页)。我们用电话簿的目的是为了查找某个公司的电话,在这个电话簿中附带了一些这个公司的基本信息,比如地址,经营范围,联系方式等。

    其实这个例子就是一个LDAP在现实生活中的表现。电话簿的组织结构是一条一条的信息组成,信息按照行业,类比进行了分类。每条记录都分成了若干的区域,其中涵盖了我们要的信息。这就是一个目录。一个树状的结构,每个叶子都是由一条一条的分成若干区域的记录。LDAP就是这么一个东西。

    从概念上说,LDAP分成了DN, OU等。OU就是一个树,DN就可以理解为是叶子,叶子还可以有更小的叶子。但是LDAP最大的分层按照IBM的文档是4层。

    还是上面这个例子,电话簿由电话公司进行维护,因此写是由他们去写,去组织。写完了,组织好了,就完成了,以后再写,再组织的次数是有限的。而其作用是为了查找。LDAP也是类似,目的不是为了写,当然LDAP也有数据写入的借口,是可以满足录入的要求的,主要是为了查找。如果有人要写有人要读的并发怎么解决?LDAP的用途不是针对这个来设计的,如果你有这样的需求,解决办法就应该是数据库,而不是LDAP。这就是另外一个例子,Access和SQL Server。Access就是一个数据库产品,但是主要用于家庭,功能和性能都比较弱。SQL Server就是一个专业的数据库系统,功能强大。LDAP是一个轻量级的产品,主要目的是为了查,因此在架构和优化主要是针对读,而不是写。但并不是说LDAP不能满足,只是说强项不在这里。

    5. LDAP的特点

    1. LDAP 是一种网络协议而不是数据库,而且LDAP的目录不是关系型的,没有RDBMS那么复杂,
    2. LDAP不支持数据库的Transaction机制,纯粹的无状态、请求-响应的工作模式。
    3. LDAP不能存储BLOB,LDAP的读写操作是非对称的,读非常方便,写比较麻烦,
    4. LDAP支持复杂的查询过滤器(filter),可以完成很多类似数据库的查询功能。
    5. LDAP使用树状结构,接近于公司组织结构、文件目录结构、域名结构等我们耳熟能详的东东。 LDAP使用简单、接口标准,并支持SSL访问。

    6. LDAP的主要应用场景

    1. 网络服务:DNS服务
    2. 统一认证服务:
    3. Linux PAM (ssh, login, cvs. . . )
    4. Apache访问控制
    5. 各种服务登录(ftpd, php based, perl based, python based. . . )
    6. 个人信息类,如地址簿
    7. 服务器信息,如帐号管理、邮件服务等

    7. 总结

    1. LDAP作为轻量级目录查询,利用dn的查询效率十分高
    2. LDAP十分适合管理带有树结构的数据
    3. LDAP的数据模型(目录设计)十分重要,关乎到数据冗余大小、查询效率等问题。
    4. LDAP分页查询需要针对结果循环处理,查询效率一般。
    5. 实际项目开发中LDAP建议只是作为数据同步中心,因为其对于大数据量的查询效率并不是很高,尤其是数据表变动比较频繁的情况,LDAP中指定大量条件进行模糊搜索时,效率很低。

    参考:
    Spring Boot集成AD域实现统一用户认证
    从X.500到LDAP
    ldap.com
    LDAP服务器的概念和原理简单介绍
    LDAP基础概念
    LDAP是什么?
    Ldap中文网
    Spring Boot 整合 LDAP 开发教程

    展开全文
  • ldap协议

    2017-07-14 20:51:00
    前段时间一直在做LDAP+POSTFIX相关项目,先把关于LDAP的一些经验写出来,一来可能会帮助一些人,二来对我自己所学知识也是一个巩固。...都说它是“轻量级目录协议”,太专业,我不懂,我只把它想象成“...

    前段时间一直在做LDAP+POSTFIX相关项目,先把关于LDAP的一些经验写出来,一来可能会帮助一些人,二来对我自己所学知识也是一个巩固。)

    先声明:我写的只是我对LDAP的一些理解,如果我的理解错误,那就是对兄弟们的误导。所以你可以直接看文章的结尾提供的几个网址。

    关于LDAP的概念随便网上有很多,我不想重复,这里只是说一下我自己的理解。
    都说它是“轻量级目录协议”,太专业,我不懂,我只把它想象成“简单”的目录协议。

    几个很重要的概念,以后会用到:
    ---------------------------------------------
    dn :一条记录的位置
    dc :一条记录所属区域
    ou :一条记录所属组织
    cn/uid:一条记录的名字/ID
    ---------------------------------------------

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

    MYSQL用“表”储存数据,LDAP用“树”
    MYSQL指定一条记录要3个条件:DB、TABLE、ROW。
    LDAP却更自由,为什么呢?因为LDAP数据是“树”状的,而且这棵树是可以无限延伸的,假设你要树上的一个苹果(一条记录),你怎么告诉园丁它的位置呢?当然首先要说明是哪一棵树(dc,相当于MYSQL的DB),然后是从树根到那个苹果所经过的所有“分叉”(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个系,分别是“dn:ou=computer,dc=ourschool,dc=org”、“dn:ou=film,dc=ourschool,dc=org”……
    3、当然是在每个系里面建立专业,比如“dn:ou=linux,ou=computer,dc=ourschool,dc=org”……
    4、(开始长苹果吧!)加学生喽——“dn:cn=stan,ou=linux,ou=computer,dc=ourschool,dc=org”……
    5、已经完成了吗?对了!学生的详细信息还没有呐!不过先这样吧,反正记录是可以编辑的。
    ---------------------------------------------

     

     

     

    LDAP(Lightweight Directory Access Protocol)的意思是"轻量级目录访问协议",是一个用于访问"目录服务器"(Directory Servers)的协议。这里所谓的"目录"是指一种按照树状结构存储信息的数据库。这个概念和硬盘上的目录结构类似,不过LDAP的"根目录"必须是"The world",并且其一级子目录必须是"countries"。二级目录通常包含有公司(companies)、组织(organisations)、地点(places)等等……相应的三级子目录通常会包含人员(people)、设备(equipment)、文档(documents)等等……

    当你引用硬盘上的文件时,通常是这样的:

    /usr/local/myapp/docs
    正斜杠(/)在这里表示级别分界线,并且从左向右阅读。

     

    而在LDAP中则通过"distinguished name"(简称"dn")来表示文件,通常像下面这样:

    cn=John Smith,ou=Accounts,o=My Company,c=US
    逗号(,)在这里表示级别分界线,并且从右向左阅读。上述dn可以理解为:
       country = US
       organization = My Company
       organizationalUnit = Accounts
       commonName = John Smith
    
    术语对比:
    dn,entry	目录/文件
    attribute	属性
    value		值
    
    与硬盘目录一样,目录服务器上的目录结构也没有任何限制,这就意味着你必须了解一些服务器的结构信息才能写程序。

     

    更多关于LDAP的信息可以在下面两个URL找到:
    Mozilla
    OpenLDAP Project

    安装与配置

    PHP默认并不启用LDAP支持,php的LDAP模块依赖于OpenLDAPbind9.net提供的客户端LDAP库,你必须在编译的时候使用 --with-ldap[=DIR] 才行,如果你想要SASL支持,那还必须使用 --with-ldap-sasl[=DIR] 选项,而且你的系统中必须有 sasl.h 头文件才行。

    LDAP模块的行为受下面的配置指令的影响

    指令数据类型作用域默认值解释
    ldap.max_links整数PHP_INI_SYSTEM-1每进程允许的最大LDAP连接数。"-1"表示无限制。

    编程步骤

    在进行LDAP编程之前,你必须知道目录服务器的下列信息:

    • 服务器的IP地址(主机名)以及端口号
    • 服务器的"base dn"(也就是"the world"目录下的子目录,比如:"o=My Company,c=US")
    • 访问服务器的用户名(RDN)和密码(许多服务器允许"匿名绑定"来读取信息,但是其他操作必须有密码才行)

    一般的LDAP编程步骤如下:

    1. ldap_connect() // 连接到LDAP服务器
    2. ldap_bind() // 匿名登陆或者认证登陆
    3. 做一些操作,比如读取、添加、删除等...
    4. ldap_unbind() // 关闭连接

    LDAP常用函数简介

    resource ldap_connect ([ string $hostname = NULL [, int $port = 389 ]] )

    使用指定的主机名($hostname)和端口($port)连接到LDAP服务器。

    $hostname
    主机名,如果服务器端是 OpenLDAP 2.x.x 或更高版本,那么还可以使用 ldap://hostname/ 格式(URL格式)。
    要使用SSL连接,那么必须确保OpenLDAP和PHP都带有SSL支持,并使用 ldaps://hostname/ 的格式。
    如果使用空格分隔的主机名列表(比如"192.168.0.100:389 192.168.0.101"),那么此函数将依次尝试直到连接成功为止。
    $port
    连接的端口(默认为389)。在使用URL格式的时候不需要使用此参数,直接在URL里面指明即可(ldap://hostname:port/)。

    连接成功则返回一个LDAP连接标识符,连接失败则返回 FALSE 。
    如果服务器端是 OpenLDAP 2.x.x 或更高版本,那么此函数将始终返回一个LDAP连接标识符,而永远不会失败。实际的连接动作将在接下来调用 ldap_* 函数[通常是ldap_bind()]时执行。
    如果不带任何参数调用此函数,则返回上一次连接已经打开的连接标识符。

    bool ldap_bind ( resource $link_identifier [, string $bind_rdn = NULL [, string $bind_password = NULL ]] )

    使用指定的RDN($bind_rdn)和密码($bind_password)绑定到LDAP目录。

    $link_identifier
    ldap_connect()函数返回的LDAP连接标识符
    $bind_rdn
    $bind_password
    绑定时使用的RDN(Relative Distinguished Name)和密码。如果未指定则使用匿名认证。

    绑定成功返回 TRUE 否则返回 FALSE 。

    string ldap_error ( resource $link_identifier )

    检索LDAP操作的错误信息。

    $link_identifier
    ldap_connect()函数返回的LDAP连接标识符

    返回指定的连接标识符上最近一次LDAP操作的错误信息。

    bool ldap_get_option ( resource $link_identifier , int $option , mixed &$retval )
    bool ldap_set_option ( resource $link_identifier , int $option , mixed $newval )

    获取/设置LDAP选项的值。

    $link_identifier
    ldap_connect()函数返回的LDAP连接标识符
    $option
    LDAP选项名称,主要的选项及其数据类型如下:
    LDAP_OPT_DEREF(int)
    搜索的时候如何处理别名,取值范围如下:LDAP_DEREF_NEVER(0,默认值), LDAP_DEREF_SEARCHING(1), LDAP_DEREF_FINDING(2), LDAP_DEREF_ALWAYS(3)
    LDAP_OPT_NETWORK_TIMEOUT(int)
    网络超时秒数,LDAP_NO_LIMIT(0,默认值)表示永不超时。
    LDAP_OPT_PROTOCOL_VERSION(int)
    指定使用的LDAP协议版本,取值范围如下:LDAP_VERSION2(2,默认值), LDAP_VERSION3 (3)。
    LDAP_OPT_REFERRALS(bool)
    LDAP库是否自动追随LDAP服务器返回的引用,取值范围如下:TRUE(1,默认值), FALSE(0)。
    &$retval
    接受选项值的变量
    $newval
    选项的新值

    获取/设置成功返回 TRUE 否则返回 FALSE 。

    bool ldap_add ( resource $link_identifier , string $dn , array $entry )
    bool ldap_delete ( resource $link_identifier , string $dn )

    在LDAP目录中添加/删除一个项。

    $link_identifier
    ldap_connect()函数返回的LDAP连接标识符
    $dn
    将要添加/删除的项目名称(distinguished name)。
    $entry
    指定新项内容的关联数组(attribute=>value)。如果value也是一个数组,那么必须是从0开始的索引数组。例如:
    $entry["bool"]='TRUE';
    $entry["int"]='-3';
    $entry["mail"]='jonj@example.com';
    $entree["tel"][0] = "2222222";
    $entree["tel"][1] = "4444444";
    

    添加/删除成功返回 TRUE 否则返回 FALSE 。

    mixed ldap_compare ( resource $link_identifier , string $dn , string $attribute , string $value )

    检查LDAP目录项$dn的$attribute属性值与给定的$value是否相同。注意:不能用来比较二进制数据!

    $link_identifier
    ldap_connect()函数返回的LDAP连接标识符
    $dn
    LDAP项的名称(distinguished name)
    $attribute
    属性名
    $value
    给定的值

    相同返回 TRUE ,不同返回 FALSE ,遇见错误返回 -1

    resource ldap_read ( resource $link_identifier , string $base_dn , string $filter [, array $attributes [, int $attrsonly [, int $sizelimit [, int $timelimit [, int $deref ]]]]] )
    resource ldap_list ( resource $link_identifier , string $base_dn , string $filter [, array $attributes [, int $attrsonly [, int $sizelimit [, int $timelimit [, int $deref ]]]]] )
    resource ldap_search ( resource $link_identifier , string $base_dn , string $filter [, array $attributes [, int $attrsonly [, int $sizelimit [, int $timelimit [, int $deref ]]]]] )

    使用指定的过滤器搜索LDAP目录。三个函数的不同之处在于搜索范围不同:
    read仅搜索$base_dn本身(LDAP_SCOPE_BASE),相当于从目录中读取一个条目(entry)。
    list仅搜索$base_dn的下一级对象(LDAP_SCOPE_ONELEVEL),不包含本身,相当于"ls"命令。
    search搜索$base_dn本身及其所有子对象(LDAP_SCOPE_SUBTREE),相当于搜索整个目录树。

    $link_identifier
    ldap_connect()函数返回的LDAP连接标识符
    $base_dn
    将要被搜索的目录的DN
    $filter
    搜索过滤器。比如"(objectClass=*)"表示搜索所有条目(对于read函数则表示所有属性)。
    其语法规则在 RFC2254中描述,例如:"(|(sn=$person*)(givenname=$person*))"
    $attributes
    需要检索的属性名称数组,比如:array("mail", "sn", "cn")。
    注意:不管有没有指定,"dn"属性的值总会被返回。
    如果不指定此参数,那么将返回所有的属性值。
    $attrsonly
    默认值"0"表示同时获取属性的类型(attribute type)和属性的值(attribute value)。
    非默认值"1"表示仅获取属性的类型(attribute type)。
    $sizelimit
    限定最多返回多少条记录。默认值"0"表示没有限制。注意:这个参数不能超越服务器的限制。
    $timelimit
    限定搜索操作最大允许进行多少秒。默认值"0"表示没有限制。注意:这个参数不能超越服务器的限制。
    $deref
    指定搜索的时候如何处理别名。取值范围如下:
    LDAP_DEREF_NEVER(默认)
    在搜索中或者查找那基础对象时做不复引用别名
    LDAP_DEREF_SEARCHING
    在基础对象的附属的搜索中而不是查找那基础对象时做复引用别名
    LDAP_DEREF_FINDING
    在基础对象而不是其附属的搜索中做复引用别名
    LDAP_DEREF_ALWAYS
    在搜索中或者查找那基础对象时做都复引用别名

    成功返回一个结果集的资源描述符,通常被其他函数以$result_identifier引用,失败返回FALSE

    array ldap_get_entries ( resource $link_identifier , resource $result_identifier )

    返回前一次搜索操作的结果集,包括每一项的属性和属性值。

    $link_identifier
    ldap_connect()函数返回的LDAP连接标识符
    $result_identifier
    ldap_read/ldap_list/ldap_search函数返回的结果集的资源描述符。

    成功返回一个包含结果集的多维数组,失败返回FALSE。
    注意:结果集数组的属性索引将被转换成小写字母(对于LDAP来说属性是大小写无关的)。
    结果集数组的结构如下所示:

    return_value["count"] = 结果集中的条目总数(包含第零项)
    return_value[0] : 对结果集中第零项(一般不同于后面的常规项)的详细信息的引用
    
    return_value[i]["dn"] =  结果集中第 i 个条目的 DN
    return_value[i]["count"] = 结果集中第 i 个条目的属性数量
    return_value[i][j] = 结果集中第 i 个条目的第 j 个属性
    
    return_value[i]["attribute"]["count"] = 结果集中第 i 个条目的"attribute"属性的值的数量
    return_value[i]["attribute"][j] = 结果集中第 i 个条目的"attribute"属性的第 j 个值
    

     

    bool ldap_unbind ( resource $link_identifier )

    解除绑定,也就是关闭LDAP连接。

    $link_identifier
    ldap_connect()函数返回的LDAP连接标识符

    成功返回 TRUE 否则返回 FALSE 。

     

     

    转载于:https://www.cnblogs.com/haore147/p/7172184.html

    展开全文
  • ldap协议端口号LightweightDirectory Access Protocol or LDAP is used to authenticate and authorize users. LDAP is used in different infrastructures like Windows Domain, Linux, Network, etc. LDAP uses ...
  • LDAP协议 学习

    2021-08-01 14:15:19
    LDAP协议之前有一个X.500 DAP协议规范,该协议什么复杂,是一个重量级的协议,后来对X.500进行了简化,诞生了LDAP协议,与X.500相比变得较为轻量,其实LDAP协议依然复杂。 LDAP约定了Client、Server之间的信息交换...
  • java测试LDAP协议

    2019-04-16 16:22:16
    采用java 实现LDAP协议的创建用户和查询用户,也就是WIndows AD域控的操作。
  • LDAP 协议入门

    2020-11-20 10:56:33
    LDAP 协议的实现,有着众多版本,例如微软的 Active Directory 是 LDAP 在 Windows 上的实现,AD 实现了 LDAP 所需的树形数据库、具体如何解析请求数据并到数据库查询然后返回结果等功能。再例如 OpenLDAP 是可
  • RFC4511 LDAP协议.pdf

    2021-03-02 11:31:14
    LDAP协议,RFC4511中文版,本人翻译,有错误联系邮箱hooyubin@gmail.com。
  • LDAP协议简介

    2021-07-19 15:45:50
    LDAP协议的实现有着众多的版本, 例如微软的Active Directory是LDAP在Windows上的实现, AD实现了LDAP所需的树形数据库, 解析请求数据并到数据库查询然后返回结果等功能。再例如OpenLDAP是可以运行再Linux上的L.
  • AD域和LDAP协议

    千次阅读 2020-06-23 15:09:07
    AD域和LDAP协议 1、LDAP 1.1 常见的目录服务软件 X.500 LDAP Actrive Directory,Microsoft公司 NIS 1.2 LDAP特点 LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写。 LDAP是一种开放...
  • 关于LDAP协议

    2019-04-07 20:49:00
    什么是LDAP协议? LDAP,全称为轻量级目录访问协议,是一项开放协议,用于通过分层目录结构对数据进行存储与检索。LDAP是一种灵活得解决方案,适用于定义各类条目及相关性质。OpenLDAP项目是实现了LDAP协议的开源...
  • 介绍了LDAP协议的技术原理,并对基于LDAP技术的单点登录系统做出了研究,旨在设计一种高效、安全的用户登录系统。
  • Windows Server 2008 R2 AD DS架构-第05部分 Kerberos及LDAP协议
  • Virtual-LDAP 是一种用于将任何其他帐户服务桥接到 LDAP 协议的服务。 使用Virtual-LDAP,您可以使用现有的账号服务(如钉钉)作为许多开源项目的授权服务。 Virtual-LDAP 具有提供程序架构,因此您可以使用自定义...
  • LDAP协议介绍

    2015-03-24 16:17:00
    LDAP协议基础概念 1. 从用途上阐述LDAP,它是一个存储静态相关信息的服务,适合“一次记录多次读取”。经常使用LDAP服务存储的信息: 公司的物理设备信息(如打印机,它的IP地址、存放位置、厂商、购买时间...
  • 介绍LDAP用途,以及LDAP协议的网络监控系统架构。
  • LDAP协议简介以及OpenLDAP服务搭建

    千次阅读 2018-05-06 23:35:54
    我这篇文章是自己在学习LDAP的时候,为了记录下来,将自己收集的资料集合成一篇文章而成的仅供参考,并非原创。参考过的文章有点击打开链接点击打开链接点击打开...OpenLDAP项目是实现了LDAP协议的开源软件。基本...
  • 在介绍了统一认证模型类型以及用于存放认证信息的LDAP目录服务协议的基础上,结合当前校园网建设的实际情况,设计了一个基于LDAP协议的校园网统一身份认证系统。在统一认证的过程中,应用不同访问模式和传输技术,通过多...
  • 认识LDAP协议

    2019-09-26 19:43:45
     LDAP是Lightweight Directory Access Protocol的缩写,顾名思义,它是指轻量级目录访问协议(这个主要是相对另一目录访问协议X.500而言的;LDAP略去了x.500中许多不太常用的功能,且以TCP/IP协议为基础)。目录...
  • 0x01CLDAP协议 Reflection DDoS攻击响应 1. 缺陷原理 轻量目录访问协议(LDAP)被定义在RFC2251(LDAPv3)中,由于LDAP是以TCP字节流的方式进行数据传输,其必要的绑定操作和频繁的数据搜索查询...
  • LDAP读书笔记2-LDAP协议

    2010-07-23 14:05:40
    LDAP协议 LDAP 协议的操作: 1 、查询操作: search 、 compare 2 、更新操作: add 、 delete 、 modify 、 modify DN(rename) 3 、认证和控制操作: bind 、 unbind 、 abandon 一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,814
精华内容 13,525
关键字:

ldap协议