LDAP简介

LDAP的细节在RFC2251 “轻量级目录访问协议(v3)”和包含技术规范RFC3377的其他文档中定义。

  LDAP信息模型基于条目(entries)。条目是具有全局唯一性的属性集合专有名称(DN,Distinguished Name)。DN用于明确指向条目。每个条目的属性都有一个类型(type )和一个或多个值(values)。这些类型通常是助记符字符串,例如“ cn ”,common name,表示公用名,或“ mail ”表示电子邮件地址。值的语法取决于属性类型,例如,cn属性可能包含值Babs Jensen,一个邮件属性可能包含值“ babs@example.com ”,jpegPhoto属性将包含以JPEG(二进制)格式的照片。

  在LDAP中,目录条目以分层树状结构排列。传统上,这种结构反映了地理和/或组织边界。表示国家/地区的条目显示在树的顶部。下面是代表各州和国家组织的条目。它们下面可能是表示组织单位,人员,打印机,文档或您可以想到的任何其他内容的条目。左图显示了使用传统命名的示例LDAP目录树。

  还可以基于因特网域名来安排树。这种命名方法正变得越来越流行,因为它允许使用DNS定位目录服务。右图显示了使用基于域的命名的LDAP目录树示例。

 

python ldap3 添加openldap用户 ldap教程_服务器

python ldap3 添加openldap用户 ldap教程_服务器_02

 

  此外,LDAP允许您通过使用名为objectClass的特殊属性来控制条目中所需和允许的属性。objectClass属性的值确定条目必须遵守的模式规则。

  如何引用信息?条目由其DN名称来引用,该名称由条目本身的名称(称为相对DN或RDN)并连接上其祖先条目名称来合成。例如,上面互联网命名示例中Barbara Jensen的条目的RDN为uid = babs,DN为uid = babs,ou = People,dc = example,dc = com。RFC2253 “轻量级目录访问协议(v3):可分辨名称的UTF-8字符串表示”中描述了完整的DN格式。

  如何获取信息?LDAP定义了询问和更新目录的操作。提供操作以添加和删除目录中的条目,更改现有条目以及更改条目的名称。但是,大多数情况下,LDAP用于搜索目录中的信息。LDAP搜索操作允许搜索目录的某些部分以查找与搜索过滤器指定的某些条件匹配的条目。可以从符合条件的每个条目请求信息。例如,您可能希望在整个dc = example,dc = com目录子树下搜索名为Barbara Jensen的人员,检索找到的每个条目的电子邮件地址。LDAP可让您轻松完成此操作。或者,您可能希望搜索st = California,c = US条目下方的条目,以查找名称中包含字符串Acme且具有传真号码的组织。LDAP也可以让你这样做。

某些目录服务不提供保护,允许任何人查看信息。LDAP为客户端提供了一种机制,用于对目录服务器进行身份验证或证明其身份,为丰富的访问控制铺平了道路,以保护服务器包含的信息。LDAP还支持数据安全性(完整性和机密性)服务。

  LDAP速度非常快,比当今最快的数据库还要快,其实LDAP主要的应用场景是查询多而修改极少,查询和修改的比率是10:1 甚至更高, 那就充分发挥LDAP的优势了,专注于优化查询,又没有事务处理, 就像一个缓存一样,那数据库的速度可是比不上。 还有LDAP能存储海量的数据,还可以轻松地在各个系统之间复制,可用性超高。

LDAP如何工作?

LDAP目录服务基于客户端 - 服务器模型。一个或多个LDAP服务器包含组成目录信息树(DIT)的数据。客户端连接到服务器并询问它。服务器响应搜索的答案 和/或 指向可以获取其他客户端位置的指针(通常是另一个LDAP服务器)。无论客户端连接到哪个LDAP服务器,它都会看到相同的目录视图; 提供给一个LDAP服务器的名称引用在另一个LDAP服务器上是相同条目。这是全局目录服务的重要功能,如LDAP。

X.500怎么样?

从技术上讲, LDAP 是一个X.500 目录服务的目录访问协议 , OSI目录服务。最初,LDAP客户端访问X.500目录服务的网关。该网关运行客户端和网关之间LDAP以及网关与X500服务器之间的X500DAP。DAP是一种重量级协议,可在完整的OSI协议栈上运行,并且需要大量的计算资源。LDAP旨在运行TCP/IP 并以更低的成本提供DAP的大部分功能。

虽然LDAP仍然用于通过网关访问X.500目录服务,但现在更常见的是在X.500服务器中直接实现LDAP。

可以将独立LDAP守护程序或slapd(8)视为轻量级 X.500目录服务器。也就是说,它没有实现X.500的DAP,也不支持完整的X.500型号。

LDAPv2和LDAPv3有什么区别?

LDAPv3是在1990年代后期开发的,用于取代LDAPv2。LDAPv3将以下功能添加到LDAP:

  • 强大的身份验证和数据安全服务 SASL
  • 证书认证和数据安全服务 TLS (SSL)
  • 通过使用Unicode实现国际化
  • 推荐和延续
  • 架构发现
  • 可扩展性(控件,扩展操作等)

LDAPv2具有历史意义(RFC3494)。由于大多数所谓的 LDAPv2实现(包括slapd(8))不符合LDAPv2技术规范,因此声称LDAPv2支持的实现之间的互操作性是有限的。由于LDAPv2与LDAPv3显着不同,因此同时部署LDAPv2和LDAPv3是非常有问题的。应避免使用LDAPv2。默认情况下禁用LDAPv2。

LDAP服务

  LDAP目录服务器的守护程序称为slapd和独立的LDAP更新复制守护进程slurpd

 slapd

    slapd(8)是一个在许多不同平台上运行的LDAP目录服务器。可以使用它来提供自己的目录服务。目录可以包含想要放入的任何内容。可以将其连接到全局LDAP目录服务,也可以自己运行所有服务。slapd的一些更有趣的特性和功能包括:

    LDAPv3slapd实现版本3轻量级目录访问协议。slapd支持IPv4和IPv6以及Unix IPC上的LDAP。

    简单的身份验证和安全层slapd通过使用SASL支持强身份验证和数据安全性(完整性和机密性)服务。 slapd的SASL实现使用Cyrus SASL软件,该软件支持多种机制,包括DIGEST-MD5,EXTERNAL和GSSAPI。

    传输层安全性slapd通过使用TLS(或SSL)支持基于证书的身份验证和数据安全性(完整性和机密性)服务。 slapd的TLS实现使用OpenSSL软件。

    拓扑控制slapd可以配置为根据网络拓扑信息限制套接字层的访问。此功能使用TCP包装器

    访问控制slapd提供了丰富而强大的访问控制功能,允许您控制对数据库中信息的访问。您可以根据LDAP授权信息控制对条目的访问,IP地址,域名和其他标准。 slapd支持静态动态访问控制信息。

    国际化slapd支持Unicode和语言标签。

    数据库后端的选择slapd附带了各种不同的数据库后端,您可以从中选择。他们包括BDB,一个高性能的事务数据库后端; HDB,分层的高性能事务后端; LDBM,一个基于DBM的轻量级后端; SHELL,任意shell脚本的后端接口; 和PASSWD,passwd(5)文件的简单后端接口。BDB和HDB后端使用Sleepycat Berkeley DB。LDBM使用Berkeley DBGDBM

    多个数据库实例slapd可以配置为同时为多个数据库提供服务。这意味着单个slapd服务器可以使用相同或不同的数据库后端响应LDAP树的许多逻辑上不同部分的请求。

    通用模块API:如果您需要更多自定义,slapd可让您轻松编写自己的模块。slapd由两个不同的部分组成:一个处理与LDAP客户端协议通信的前端; 和处理特定任务(如数据库操作)的模块。因为这两件通过明确的方式进行沟通C API,您可以编写自己的自定义模块,以多种方式扩展slapd。此外,还提供了许多可编程数据库模块。这些允许您使用流行的编程语言(PerlshellSQLTCL)将外部数据源公开给slapd

    线程slapd具有高性能的线程。单个多线程slapd进程使用线程池处理所有传入请求。这样可以在提供高性能的同时减少所需的系统开销。

    复制slapd可以配置为维护目录信息的卷影副本。这种单主/多从复制方案在高容量环境中至关重要,因为单个slapd不能提供必要的可用性或可靠性。slapd支持两种复制方法:基于LDAP Sync和基于slurpd(8)的复制。

    代理缓存slapd可以配置为缓存LDAP代理服务。

    配置slapd可通过单个配置文件进行高度配置,允许您更改您想要更改的所有内容。配置选项具有合理的默认值,使您的工作更轻松。

slurpd

  slurpd(8)是一个守护进程,通过slapd帮助,提供复制服务。它负责将对主slapd数据库所做的更改分发到各种slapd副本。它让slapd免于担心在更改发生时某些副本可能会关闭或无法访问; slurpd自动处理重试失败的请求。 slapdslurpd通过一个用于记录更改的简单文本文件进行通信。

目录服务

  目录服务中的目录是专为读取,浏览和搜索而优化的专用分布式数据库。目录往往包含描述性的,基于属性的信息,并支持复杂的过滤功能。目录通常不支持为处理大量复杂更新而设计的数据库管理系统中发现的复杂事务或回滚方案。如果允许,目录更新通常是简单的全有或全无变化。目录经过调整,可以快速响应高容量查找或搜索操作。他们可能具有广泛复制信息的能力,以提高可用性和可靠性,同时缩短响应时间。复制目录信息时,副本之间的临时不一致可能没问题,只要它们最终同步即可。

  目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。

  目录服务是由目录数据库和一套访问协议组成的系统。大多用于存储企业员工信息(用户统一认证),还有公用证书和安全密钥、公司的物理设备信息等查询多更新少的信息。

  提供目录服务有许多不同的方法。不同的方法允许在目录中存储不同类型的信息,对如何引用、查询和更新信息、如何防止未经授权的访问等提出不同的要求。某些目录服务是本地的,为受限制的服务提供服务上下文(例如,单个机器上的单个服务)。其他服务是全球性的,为更广泛的环境(例如整个互联网)提供服务。全局服务通常是分布式的,这意味着它们包含的数据分布在许多机器上,所有机器都协作提供目录服务。通常,全局服务定义统一的命名空间可以提供相同的数据视图,无论在什么地方,只与数据本身有关。互联网域名系统 (DNS)是全局分布式目录服务的示例。

  与LDAP一样提供类似的目录服务软件还有ApacheDS、Active Directory、Red Hat Directory Service。

基本概念

  1、DIT 目录信息树 directory information tree,即目录结构

    

python ldap3 添加openldap用户 ldap教程_目录服务_03

  2、Entry,条目,也叫记录项,是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的。

    DN:distinguished Name,每一个条目都有一个唯一的标识名(DN),每个叶子结点到根的路径就是DN,如上图中一个 dn:”uid=andy,ou=people,dc=example,dc=com” 。通过DN的层次型语法结构,可以方便地表示出条目在LDAP树中的位置,通常用于检索。

    RDN:Relative Distinguished Name,叶子结点本身的名字是RDN,即一般为dn逗号最左边的部分,如uid=andy。RDN也特指DN中最靠前的一段,而剩余的部分称为父标识(Parent DN,PDN)。RDN本身也可以由多个值构成,比如OU=Tech+CN=doubao,dc=shuyun,dc=com中的RDN为OU=Tech+CN=doubao,由2个值OU=Tech和CN=doubao组成,他们之间由加好隔开。它与RootDN不同,RootDN通常与RootPW同时出现,特指管理LDAP中信息的最高权限用户。

    Base DN:DN,LDAP目录树的最顶部就是根,指定LDAP search的起始DN,也就是所谓的“Base DN”,如”dc=example,dc=com”。

    如果DN中含有一些特殊字符,比如:,=+<>;\",他们需要转转义符(\)来帮助表述。

  3、Attribute属性,每个条目都可以有很多属性(Attribute),比如常见的人都有姓名、地址、电话等属性。每个属性都有名称及对应的值,属性值可以有单个、多个。比如你有多个电话。属性不是随便定义的,需要符合一定的规则,而这个规则可以通过schema制定。

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

 

属性

别名

语法

描述

值(举例)

commonName

cn

Directory String

姓名

sean

surname

sn

Directory String


Chow

organizationalUnitName

ou

Directory String

单位(部门)名称

IT_SECTION

organization

 o

Directory String

组织(公司)名称

example

telephoneNumber


Telephone Number

电话号码

110

objectClass



内置属性

organizationalPerson


  

  4、AttributeType,属性类型,  每个属性都有唯一的属性类型(AttributeType),属性类型约定属性值的数据格式和语法类型(Syntax)。比如,属性cellPhone的类型为telephoneNumber,它规定了电话号码是由数字组成的,其中允许插入一些分隔符,如连接符、括号、空格等。  属性类型也约定了属性值是否可以有多少个,多值属性类型也可以使人员信息的组织变得更加灵活并接近现实情况,比如:人员的手机、地址、邮箱等属性都可以有多个值。这样,用ldap组织的信息会比简单的表结构更加理想。类型也规定了属性查询时的匹配规则、排序顺序、大小写敏感等。

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

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

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

    对象类本身是可以相互继承的,所以对象类的根类是top抽象型对象类。以常用的人员类型为例,他们的继承关系:

  

  下面是inetOrgPerson对象类的在schema中的定义,可以清楚的看到它的父类SUB和可选属性MAY、必要属性MUST(继承自organizationalPerson),关于各属性的语法则在schema中的attributetype定义。

# inetOrgPerson
# The inetOrgPerson represents people who are associated with an
# organization in some way.  It is a structural class and is derived
# from the organizationalPerson which is defined in X.521 [X521].
objectclass     ( 2.16.840.1.113730.3.2.2
    NAME 'inetOrgPerson'
        DESC 'RFC2798: Internet Organizational Person'
    SUP organizationalPerson
    STRUCTURAL
        MAY (
                audio $ businessCategory $ carLicense $ departmentNumber $
                displayName $ employeeNumber $ employeeType $ givenName $
                homePhone $ homePostalAddress $ initials $ jpegPhoto $
                labeledURI $ mail $ manager $ mobile $ o $ pager $
                photo $ roomNumber $ secretary $ uid $ userCertificate $
                x500uniqueIdentifier $ preferredLanguage $
                userSMIMECertificate $ userPKCS12 )
        )

 

schema,用户也可自定义schema文件。

  

  schema(一般在/etc/ldap/schema/目录)在导入时要注意前后顺序。

  7、LDIF

  LDIF(LDAP Data Interchange Format,数据交换格式)是LDAP数据库信息的一种文本格式,常用来向目录导入或更改记录信息,每行都是“属性: 值”对。

     基本格式:AttributeName: value

    属性名 冒号 空格 属性值

    如

    dn: dc=zy,dc=net

    objectclass: dcObject

    objectclass: organization

参考:

LDAP Linux HOWTO