LDAP介绍及使用注意

本文主要通过安装,以及建立与IBM LDAP相同的schema以及导入其中的数据,来演示
openldap的安装,schema定义以及与其它LDAP的数据转换;
1. LDAP基本结构
   一个通用的LDAP通常包含几个部分:LDAP服务器,LDAP服务软件,LDAP schema定义,LDIF数据;
   其中:LDAP服务器=ORACLE服务器,LDAP服务软件=ORACLE,LDAP schema定义=ORACLE schema,LDIF=ORACLE表数据;
   因为LDAP为标准的协议,所以对于不同的LDAP,用标准的LDAP客户端都可以访问;
   需注意的就是不同LDAP的schema的统一以及数据的导入导出;
   LDIF数据格式是否是统一的,是,因为LDAP协议规定了LDIF的报文格式;
   
2. LDAP schema
    Schema有4个重要的元素:objectClass,attribute,Syntax,Matching Rules;
    Objectclass:                                    
        objectclass定义了一个类别,这个类别会被不同的目录用到,它说明了该目录应该有哪些属性,哪些属性是必须的,哪些又是可选的。
           首先是对象ID,
           NAME定义能使用的名称
           DESC 提供属性的描述
           SUP 定义父对象类,也就是说这个对象类继承 SUP 关键字指定的对象类。
           STRUCTURAL 关键字定义这是一个结构对象类,可以作为对象的主类型
           MAY 和 MUST 关键字分别定义使用这个对象类的记录允许使用的属性和必须具备的属性。
        最好不要修改结构对象类或者现有的广泛使用的辅助对象类。因为这些对象类是众所周知的,如果以后改用其他服务器,这种修改可能导致不兼容。   
    attribute:
        attribute就是一个上面objectclass中可能包含的属性,对其的定义包括名称,数据类型,单值还是多值以及匹配规则等。
           首先是对象ID,
           NAME定义能使用的名称
           DESC 提供属性的描述
           EQUALITY、SUBSTR 和 ORDERING分别定义如何比较、搜索和排序字符串。
           caseIgnoreMatch 是不区分大小写的匹配,caseIgnoreSubstringsMatch 也属于不区分大小写的匹配。
           属性的 SYNTAX 通过引用 OID 定义数据的格式。
           SINGLE-VALUE 关键字,它没有参数,指定Name只能有一个值                      
    Syntax:
        syntax是LDAP中的“语法”,其实就是LDAP中会用到的数据类型和数据约束,这个语法是遵从X.500中数据约束的定义的。
        其定义需要有一个ID(遵从X.500)以及说明(DESP)
    Matching Rules:
        是用来指定某属性的匹配规则,实际上就是定义一个特殊的Syntax的别名,让LDAP服务器可以识别,并对定义的属性进行匹配。
   注册 OID
       不能随便选择一组数字作为 OID,因为不知道您选择的值是否已经或将会在其他地方使用
       OID 必须是惟一的。一些服务器允许指定惟一的文本性 OID(比如 mycompany.1.2),但是这无法保证兼容性。
       可以在本地使用 1.1 名称空间下的任何名称,但是这不保证其惟一性。
       Internet Assigned Numbers Authority(IANA)允许免费申请 .1.3.6.4.1 之下的分支。
3. LDIF记录格式
    用#来表示注释    
    LDIF文件属性名不区分大小写
    DN唯一标识一个对象,而RDN则相对标识一个对象,RDN+上级对象的DN则为该对象的DN;
    LDIF文件中的记录由一个或多个空行分隔,记录以dn属性开头
    每个记录必须定义至少一个对象类。对象类进而要求某些属性必须存在。
    如果值需要跨越多行,那么每个新行应该以一个空格开头
    
4. 添加LDAP记录:
    添加记录的 LDIF 文件的惟一限制是,必须从根开始按次序构建树
   删除LDAP记录:
    删除一个记录,只需要 dn 和 changetype。
    EG:
       dn: cn=Fred Smith,ou=people,dc=ertw,dc=com
       changetype: delete
   修改DN:
     1. 指定新的 RDN(DN 最左边的成分)。
     2. 决定记录中新的 RDN 是否应该替换旧的 RDN,还是应该保留旧的 RDN。
     3.(可选)通过指定新的父 DN,将记录转移到树的其他部分。
     EG:
        dn: cn=Jane Doe,ou=people,dc=ertw,dc=com(指定修改的DN)
        changetype: modrdn(指定操作类型为修改DN)
        newrdn: cn=Jane Doe(指定新的RDN名称)
        deleteoldrdn: 0    (指定是否删除旧的DN,如不指定默认为删除)
        newsuperior: ou=managers,dc=ertw,dc=com(可选,指定是否将DN移动到其它目录)
   修改属性:
     1. 指定修改记录DN
     2. 指定操作类型
     3. 指定修改属性名
     4. 指定新的属性值
     5. 每个修改后面是空行上的一个连字符(-),最后一个修改也是如此。

5. LDAP是否合适
     1. LDAP 数据库面对的操作以读操作为主。
     2. LDAP 规范没有定义关系数据库中常见的事务概念
     3. LDAP 提供了搜索功能,但是无法与关系数据库的搜索功能相比。
     4. 要存储的信息在本质上应该是层次化的。
     5. 了解数据的用户(即消费者)也很重要。
    
6. 组织LDAP树
       谁都不希望以后对树进行重新组织。所以我们的目标是,对对象进行划分,让树的每个分支包含相似类型的对象,尽可能减少不得不移动对象的情况
     根DN
         树的根应该代表您的公司
     填充结构
         考虑用属性而非不同类来存储公司的组织结构信息。    
     决定对象类:基本目标是避免以后被迫修改对象的名称。
     DN:必须无重复,一个好的设计即以邮箱名为最后的区分,因为一般情况下公司员工的邮箱名是不重复的;
         
7. LDAP对象类:
     有3种::结构的(structural),辅助的(auxiliary),抽象(abstract);
      结构对象类:
          结构对象类定义对象的 “身份”,一个条目只能有一个结构对象类,如果有多个结构对象,则它们应该都是同一个继承树的组成部分;
          结构对象类常常从其他对象类继承属性,继承链是从一个称为 top 的对象类开始的。
      辅助对象类:
          而辅助对象类添加属性      
      抽象对象类:
          它很像结构对象类,但是必须继承它,然后才能使用。
          
8. 添加schema
      使用 include /path/to/file.schema          
      
9. openLdap的schema
      OpenLDAP 通常将它的模式文件存储在 /etc/openldap/schema中;

10. openLdap整合IBM TDS
    基本上不可整合,因为1.二者的objectclass及attribute的书写格式不同,需人工转换;
                        2.IBM文件中定义的许多objectclass与openldap是重合的,会导致不报错的不初始化;
    该方案理论上适用于任何两种LDAP的转换;
        两种LDAP之间的转换主要在于两点: 1.schema;2.LDIF文件;
    schema包括4种:objectClass,attribute,Syntax,Matching Rules,在TDS中分别以oc,at,ldapsyntaxes,matchingrules为后缀;
        其中Syntax为LDAP的标准定义,故无须迁移;
        其它三种文件中,因为一般objectClass用到的种类较少,所以可直接拿出定义的objectClass,这样的好处是,不用拿全部的oc文件;
        连带的好处是,不用拿全部的at文件;
        matchingrules只有一个,可以拿过来;
    同时还要注意:很多objectClass和at是LDAP定义的标准对象,这种情况下,会和openLDAP中定义的标准对象冲突;所以需比对二者的定义,以及替换;
        比较懒的方法是,直接把所有的文件都copy过来,但这样,可能不好用;
    
    attribute与objectclass判断是否相同的标准是ID是否相同;
       1. 报错:pager:value #0 invalid per syntax
          1)attribute可能与原IBM定义不同, 如pager的定义;
          注意:如果IBM中同时存在attribute和IBMAttributetypes,则会取IBMAttributetypes的定义;
          则需要修改openldap中的attribute定义;
          2)与attribute定义的约束不符,修改约束,有时可能IBM符合约束的为自定义的syntax,
          此时,改为一些可供通过的值,当然,会造成数据的不一致;
          3)与attribute定义的约束不符,但其为system schema,即找不到可以修改定义的地方,
          这种情况下,只能是修改LDIF文件,并且如果系统中用到该字段的话,则需修改代码,即挂掉了;

       2. 报错:groupid:attribute type undefined
          attribute 以及 objectclass可能有些比IBM的少,如oref,groupid;
          则需要在openldap中添加attribute定义;
          有些则是二者都有,但无IBM的特定的别名,如organization;
          则需要在openldap中对应的项中加入指定别名;

       3. 报错:无任何错,但启动时很短,不加载任何DN;
          有些则是objectclass或attribute与IBM重复,
          故须先对objectclass进行对比,只有少的才往进加;
          有些则是文件书写格式错误
   
       4. 报错:st:value #0 invalid per syntax
     

      index telephonenumber

       解决方法:
         1. 用其它导入导出工具测试,看是否是文件格式(书写或编码)的问题;
         2. 查看相关的语法定义,看到底规范是如何定义的
         3. 深入OPENLDAP,看其到底是如何实现的;
         4. 实在不行,则更换LDAP;

        评价:OPENLDAP不行,看起来更像是syntax内置实现的有问题,导致标准的LDIF文件中很多属性值为空的通不过校验;
          另一种可能就是SYNTAX正常,但其它LDAP都有兼容性转换来导致校验通过,或者可配置是否进行验证,而OPENLDAP没有;    
      
      
11.OpenLDAP 附带的模式

corba.schema
它定义的对象类和属性用来跨多台机器处理 Common Object Request Broker Architecture(CORBA)对象引用。
core.schema
它定义许多常用的属性和对象类。包含organizationalUnit、top、dcObject 和 organizationalRole。在寻找合适的对象类和属性时,应该首先查看 core.schema。
cosine.schema
它定义的对象类和属性来自 X.500 规范。尽管其中的一些对象类和属性是有用的,但是在 core 和 inetorgperson 等其他模式中常常有更好的替代品。
dyngroup.schema
它定义由 Netscape Enterprise Server 使用的一组试验性对象。
inetorgperson.schema
它定义 inetOrgPerson 对象(扩展 core.schema 中的对象)。
java.schema
与 corba.schema 相似,这个模式定义的一系列对象类和属性用于在 LDAP 树中查找 Java? 类。
misc.schema
它实现的对象类用于在树中查找邮件。最好查阅自己的电子邮件服务器文档,了解服务器使用哪个模式。
nis.schema
如果用 LDAP 进行身份验证,就要使用这个模式。nis.schema 定义 posixAccount,其中提供的属性用于在用户对象中存储身份验证数据。它还提供各种映射类型,用来处理组、网络、服务和 Network Information System(NIS)等网络身份验证机制所用的其他文件。
openldap.schema
它主要用于演示,提供了一些基本对象。
ppolicy.schema
它提供的一组对象用来在 LDAP 中实现密码策略,比如口令老化(aging)。注意,其中一些对象由传统的 UNIX 影子机制处理,已经包含 nis.schema 中。      

---------------------------------------------------------ApacheDS-------------------------------------------------------------------------
1. 常用知识
   1.1 ApacheDS的配置采用LDIF文件的形式
       好处在于可以通过LDAP连接组件直接在对话窗口中修改,当然,也可以通过手工修改LDIF文件来完成;
       所有的配置都在ou=config的域下,比如修改10389端口在ads-transportid=ldap,修改10636端口在ads-transportid=ldaps下;
   1.2 Partition(分区对象)
       即ApacheDS可以存放多个不同DS实例,这些实例之间相互隔离,对一个实例的更改不会影响到另一个实例;
   1.3 日志级别
       采用log4j,故配置与log4j配置相同;
   1.4 启用禁用匿名访问
       默认允许匿名访问,包括读和写权限;
   1.5 添加删除对象
       两种方式,导入LDIF文件和命令行;    
   1.6 Schema
       ApacheDS为动态的Schema,即可以修改Schema生效而无须重启服务器;

2. ApacheDS 架构
   2.1 分为4层:network,Session,PartitionNexus,Backends;
       network-->DirectoryService-->Interceptor->PartitionNexus->Backend
   2.2 NetWork Layer:
       在AapcheDS中,DirectoryService与LDAP Server是分离的,即DirectoryService不仅处理LDAP请求,还会处理更多的其它协议的请求(如Kerberos,Http)等;
       然后,将对应的请求发给对应的Server,如LADP Server,Http Server等;
   2.3 DirectoryService
       作为一个入口,将请求推入对应的Interceptor中,最终执行请求返回结果;
       其执有所有客户端的状态,可见所有环境,包括实例的Schema(通过SchemaManager),Interceptor链,所有待处理的请求,所有存在的session;      
   2.4 Interceptor
       ApacheDS定义了一组对ApacheDS进行的操作,同时内置了一系列顺序固定的拦截器,且定义了每个拦截器拦截操作的范围;
       可通过启用或禁用拦截器来启停相应功能;
   2.5 Backend
       后台存储方式:JDBM,LDIF,In-Memory 3种;
       用MasterTable存储所有对象数据,用B树来存储;包括索引也用B树来存储;
       使用ParentIdAndRdn索引来存储对象间的层次关系;

3. Configuration配置
    ou=config
        ads-directoryServiceId=XXXXX (Directory Service)    #Directory Service配置
            ads-changeLogId=XXXXX (ChangeLog)           #默认禁用,仅存在用内存中,用于记录修改和还原操作,可以允许系统对修改进行rollback;
            ads-journalId=XXXXX (Journal)           #默认禁用,用于记录文件记录的所有修改,如果Directory Service挂了,可利用其还原到一个指定的时间点
            ou=interceptors (Interceptors)      #基本不可配置,存在于此主要是因为需要这些数据来初始化;
                ads-interceptorId=authenticationInterceptor (Authentication Interceptor)
                    ou=authenticators (Authenticators)
                    ou=passwordPolicies (Password Policies)    #用于配置密码;
            ou=partitions (Partitions)                         #分区配置
                ads-partitionId=system (JDBM Partition)        #配置分区
                    ou=indexes (Indexes)                       #配置INDEX
                        ads-indexAttributeId=XXXXX (Indexed Attribute)
            ou=servers (Servers)                              #配置协议服务           
                ads-serverId=ldapServer (Ldap Server)         #配置LDAP
                    ou=transports (Transports)                #配置端口
                    ou=replConsumers (ReplConsumers)          #好像是用于复制的
                    ou=extendedOpHandlers (Extended Operation Handlers)
                    ou=saslMechHandlers (SASL Mechanisms)     #用于配置SASL(一种认证机制)所使用的加密方式
                ads-serverId=kerberosServer (Kerberos Server)
                    ou=transports (Transports)
                ads-serverId=httpServer (Http Server)
                    ou=transports (Transports)
                    ou=httpWebApps (HttpWebApps)
                ads-serverId=changePasswordServer (ChangePassword Server)
                    ou=transports (Transports)


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值