建议在看之前先看下视频,视频链接

介绍

LDAP (轻量目录访问协议) 基于 X.500 标准的一种实现,LDAP 在 X.500 上进行了一系列的改进 (eg: LDAP 支持 TCP/IP 这对于访问 Internet 是必须的)。

现在市场上有关 LDAP 的产品有很多, ( eg : Microsoft 的 Active Directory、Lotus的Domino Directory、IBM的WebSphere中也集成了LDAP服务、LDAP的开源实现是OpenLDAP )

LDAP 的信息模型是建立在 条目 (entries) 的基础上,一个条目是一些属性的集合,并且具有一个全局唯一的可区分名称 DN, 一个条目可以通过 DN 来引用,每一个条目的属性具有一个类型和一个或者多个值。

  • 条目相当于数据库中的一条记录
  • 属性相当于数据表中的列
  • DN 相当于主键

LDAP 常用关键字列表

LDAP 通过属性 ObjectClass 来控制哪一个属性必须出现或允许出现在一个条目中,它的值决定了该条目必须遵守的模式规则

关键字 英文全称 含义
dc Domain Component 域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com
uid User Id 用户ID,如“tom”
ou Organization Unit 组织单位,类似于Linux文件系统中的子目录,它是一个容器对象,组织单位可以包含其他各种对象(包括其他组织单元),如“market”
cn Common Name 公共名称,如“Thomas Johansson”
sn Surname 姓,如“Johansson”
dn Distinguished Name 惟一辨别名,类似于Linux文件系统中的绝对路径,每个对象都有一个惟一的名称,如“uid= tom,ou=market,dc=example,dc=com”,在一个目录树中DN总是惟一的
rdn Relative dn 相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn= Thomas Johansson”
c Country 国家,如“CN”或“US”等。
o Organization 组织名,如“Example, Inc.”

LDAP 支持的操作: 查询目录、更新目录、增加条目、删除条目、改变条目名称、搜索信息

1. LDAP 协议简单介绍—目录

目录是一组具有类似属性、以一定逻辑和层次组合的信息 (eg: 通讯录,由字母顺序排列的名字、地址和电话号码组成)

目录服务是一种在分布式环境中发现目标的方法,目录具有两个主要组成部分:

  • 数据库,数据库是分布式的,并且有一个描述数据的规划
  • 访问和处理数据的各种协议

目录服务其实也是一种数据库系统,只是这种数据库结构是一种树形结构,而不是通常使用的关系数据库。(目录服务与关系数据库之间的主要区别在于:二者都允许对存储数据进行访问,只是目录主要用于读取,其查询的效率很高,而关系数据库则是为读写而设计的,``**目录服务不适合进行频繁更新,属于典型的分布式结构)**

LDAP是一个目录服务协议,目前存在众多版本的LDAP,而最常见的则是V2和V3两个版本,它们分别于1995年和1997年首次发布。

2. LDAP 基本模型

LDAP 的基本模型建立在 条目(entry) 的基础上,一个条目是一个或多个属性的集合,并且具有一个``**全局唯一**``的可区分名称 DN

LDAP 中会将数据组织成一个树形结构

LDAP - 图1

在上图的树形结构中,我们可以发现树的根节点是一个组织的域名 (dlw.com),其下分为三个部分 : managers、people、group, 可以将这三个组看做组织的三个部门。

上图中的数据如果使用关系型数据库来存储,那么我们可能需要设置多个表,一层一层的保存,当我们需要查找数据时,需要多表查询,复杂度增加

图中的每个结点用一个条目保存,不同类型的结点需要保存的数据可能不同,在 LDAP 中通过一个称为 ObjectClass 的类型来控制不同结点需要的数据 (属性)

那么我们如何查找一个数据?

前面我们多次提到,每个条目具有一个全局唯一的 “可区分名称 DN”,我们可以使用 DN 来找到目标数据。

DN 构造方式:

首先得到条目自己的名称(rdn,称为相对dn),然后开始向上逐级查找父结点,一直到根项为止。例如,对于图1-1中最右下方的结点,其dn为:

dn: cn=ldap, ou=group, o=dlw.com

LDAP主要的简称含义:

  • o-> organization(组织-公司)
  • ou-> organization unit(组织单元-部门)
  • c-> countryName(国家)
  • dc-> domainComponent(域名)
  • sn-> suer name(真实名称)
  • cn-> common name(常用名称)

3. LDAP 功能

  1. 基本功能:
    1. 查询操作
    2. 更新操作
    3. 复制操作 : LDAP是一种典型的分布式结构,提供复制操作,可将主服务器的数据的更新复制到设置的从服务器中。
    4. 认证和管理操作:允许客户端在目录中识别自己,并且能够控制一个会话的性质
  2. 高级功能:
    1. 账号统一集中管理
    2. 权限控制策略管理
    3. 密码控制策略管理
    4. 密码审计管理
    5. 主机控制管理
    6. 同步机制管理
    7. TLS/SASL 加密传输
    8. 高可用负载均衡架构
    9. 自定义 schema
    10. 各种集中平台账号集中管理

4. LDAP 协议特点

  • LDAP 是一种目录服务,保存在特殊数据库中,数据的读取速度远高于写入速度
  • LDAP 对查询做了优化,读取速度优于普通关系数据库
  • LDAP 不支持事务。不能进行回滚
  • LDAP 采用 服务器/客户端模式,服务器端用于存储数据,客户端提供操作目录信息树的工具,支持分布式结构。
  • LDAP 中的条目以树形结构组织和存储
  • LDAP 基于 Internet 协议,直接运行在 TCP/IP 或其他可靠的传输协议层上
  • LDAP 协议简单,通过使用查找操作实现列表操作和读操作
  • LDAP 通过引用机制实现分布式访问,通过客户端API实现分布式操作(对于应用透明),平衡了负载。
  • LDAP 实现具有低费用、易配置和易管理的特点,并提供了满足应用程序对目录服务所需求的特性。

5. LDAP 组织数据的方式

LDAP - 图2

LDAP - 图3

LDAP 目录数据结构:

  • 在 LDAP 中目录是按照树形结构组织—目录信息树 (DIT) , DIT 是一个主要进行读操作的数据库
  • DIT 由条目 (entry) 组成,条目相当于关系数据库中表的记录;条目是具有分辨名DN(Distinguished Name)的属性-值对(Attribute-value,简称AV)的集合

在目录树中如何组织数据:

  1. cn=Fran Smith,ou=employees,dc=foobar,dc=com
  2. ------------ -----------------
  3. 容器条目 BaseDN
  4. --------------------------------------------
  5. DN
  • 在UNIX文件系统中,最顶层是根目录(root),LDAP目录也通常用ROOT做根,通常称为BaseDN。
  • 因为历史(X.500)的原因,LDAP目录用OU(Organization Unit)从逻辑上把数据分开来。
    Ou 也是一种条目,容器条目
  • Ou 下就是真正的用户条目

LDAP - 图4

LDAP - 图5

什么是 DN ?

DN 即 distinguished name 的简称,在LDAP中,一个条目的分辨名叫做”DN “,DN 是该条目在整个树中的唯一名称标识;DN 相当于关系数据库表中的关键字(Primary Key);DN 是一个识别属性,通常用于检索

6. LDAP 提供的身份认证机制

  • 匿名认证: 不对用户进行认证
  • 基本认证 : 通过用户名和密码进行身份识别
  1. [root@ldap-server ~]# ldapadd -x -D "cn=root,dc=otas,dc=cn" -W -f base.ldif
  2. Enter LDAP Password: admin123
  3. adding new entry "dc=otas,dc=cn"
  4. adding new entry "ou=People,dc=otas,dc=cn"
  5. adding new entry "ou=Group,dc=otas,dc=cn"
  • SASL 认证 : 即LDAP提供的在SSL和TLS安全通道基础上进行的身份认证,包括数字证书的认证。

7. TLS 安全性

分布式 LDAP 是以明文的格式通过网络发送信息的,包括 client 访问sldap的密码。TLS(SSL 的后继者,由OpenSSL 包)加密机制来解决这个问题。

LDAP - 图6

  1. [root@ldap-server ~]# ldapsearch -x -LLL "uid=mac*"
  2. dn: uid=mac,ou=People,dc=otas,dc=cn 唯一标适
  3. uid: mac
  4. cn: mac

LDAP 基本概念和管理

1. Entry

Entry 也称为记录项,是 LDAP 中最基本的颗粒,通常对 LDAP 的 CRUD 都是以 Entry 为基本对象

  • DN : 每一个 Entry 都有一个唯一的标识名
  1. dn"cn=baby,ou=marketing,ou=people,dc=mydomain,dc=org"
  • rdn : 一般指dn逗号最左边的部分,如cn=baby。它与RootDN不同,RootDN通常与RootPW同时出现,特指管理LDAP中信息的最高权限用户。
  • Base DN:LDAP目录树的最顶部就是根,也就是所谓的“Base DN”,如”dc=mydomain,dc=org”。

2. schema

ObjectClass、AttributeType(对象类型)、Syntax (语法) 分布约定了条目、属性、值,他们之间关系如下图所示,他们共同组成了 `schema (模式)—对象类的集合`。目数据在导入时通常需要接受模式检查,它确保了目录中所有的条目数据结构都是一致的。

LDAP - 图7

LDAP - 图8

对于 LDAP 目录中保存的信息,可以使用 LDIF 格式来保存,这是一种标准文本文件格式,使用这种格式保存得的 LDAP 服务器数据库中的数据可方便读取和修改,这也是其他大多数服务配置文件所采取的格式。

在LDAP中,schema用来指定一个目录中所包含的对象(objects)的类型(objectClass),以及每一个类型(objectClass)中必须提供的属性(Atrribute)和可选的属性。可将schema理解为面向对象程序设计中的类,通过类定义一个具体的对象。LDIF中的数据条目可理解为是一个具体的对象,是通过schema来规划创建的。因此,schema是一个数据模型,用来决定数据按什么方式存储,并定义存储在不同的条目(Entry)下的数据之间的关系。schema需要在主配置文件slapd.conf中指定,以用来决定在目录中可以使用哪些objectClass。

在/etc/openldap/schema/目录中提供了许多schema文件,只需要在配置文件slapd.conf中使用include命令将需要使用的schema包含即可。例如,配置文件默认包含了以下schema文件:

  1. include /etc/openldap/schema/core.schema
  2. include /etc/openldap/schema/cosine.schema
  3. include /etc/openldap/schema/inetorgperson.schema
  4. include /etc/openldap/schema/nis.schema

3. 向目录数据库中添加数据

初始状态下,LDAP是一个空目录,即没有任何数据。可通过程序代码向目录数据库中添加数据,也可使用OpenLDAP客户端工具ldapadd命令来完成添加数据的操作,该命令可将一个LDIF文件中的条目添加到目录。因此,需要首先创建一个LDIF文件,然后再进行添加操作。

1. LDIF 文本条目格式

LDIF(LDAP Data Interchange Format,数据交换格式)是LDAP数据库信息的一种文本格式,用于数据的导入导出,每行都是”属性: 值”对。

LDIF用文本格式表示目录数据库的信息,以方便用户创建、阅读和修改。在LDIF文件中,一个条目的基本格式如下:

  1. # 注释
  2. dn: 条目名
  3. 属性描述:
  4. 属性描述:
  5. 属性描述:
  6. ... ...

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.

在以上文本中,各行含义如下:
第1行的dn定义该条目的标识。
第2~4行定义该条目的objectcCass,可以定义多个属性,如上面代码中定义了3个objectClass。条目的属性根据objectClass的不同而不同,有的objectClass有必须设置的属性。在2~4行的3个objectClass中,top没有必须定义的属性,dcobject必须定义属性dc,用来表示一个域名的部分,而organization必须定义属性o,用来表示一个组织的名称。
根据objectClass的要求,第5、6行分别定义属性dc和属性o的值。

4. ObjectClass

LDAP中,一个条目必须包含一个objectClass属性,且需要赋予至少一个值。每一个值将用作一条LDAP条目进行数据存储的模板;模板中包含了一个条目必须被赋值的属性和可选的属性

objectClass 有着严格的等级之分,最顶层是top和alias。例如,organizationalPerson这个objectClass就隶属于person,而person又隶属于top。

objectClass 可分为以下3类:

  1. 结构型(Structural):如 person organizationUnit
  2. 辅助型(Auxiliary):如extensibeObject
  3. 抽象型(Abstract):如top,抽象型的objectClass不能直接使用

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

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

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

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

LDAP - 图9LDAP - 图10

5. Attribute

属性(Attribute)类似于程序设计中的变量,可以被赋值。在OpenLDAP中声明了许多常用的Attribute(用户也可自己定义Attribute)。

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

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

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

LDAP - 图11

**温馨提示:objectClass是一种特殊的Attribute,它包含其他用到的Attribute以及其自身。**

对于不同的objectClass,通常具有一些必设属性值和一些可选属性值。例如,可使用person这个objectClass来表示系统中一个用户的条目,对于系统中用户通常需要有这样一些信息:姓名、电话、密码、描述等。如下图所示,对于person,通过cn和sn设置用户的名和姓,这是必须设置的,而其他属性则是可选的。

LDAP - 图12

LDAP - 图13

6. 创建 LDIF 文件

对以上内容有一定了解之后,就可以编写输入LDIF文件,编辑需要向目录数据库添加的条目了。
下面根据如下图所示的结构,创建LDIF文件dlw.com.ldif。

LDAP - 图14

对上图进行分析,该目录结构分为3层,有4个结点。根据上图可创建LDIF文件如下:
温馨提示:每个结点可用一个dn表示,对于每个结点,又可继续添加新的结点。如在根结点中可添加其他部门ou,在ou=managers结点也可继续添加其他管理人员的信息。

  1. 1: dn:dc=dlw,dc=com
  2. 2: objectclass:top
  3. 3: objectclass:dcobject
  4. 4: objectclass:organization
  5. 5: dc:dlw
  6. 6: o:dlw,Inc.
  7. 7:
  8. 8: dn:ou=managers, dc=dlw, dc=com
  9. 9: ou:managers
  10. 10:objectclass:organizationalUnit
  11. 11:
  12. 12: dn:cn=dlw,ou=managers,dc=dlw,dc=com
  13. 13: cn:dlw
  14. 14: sn:wangshibo
  15. 15: objectclass:person
  16. 16:
  17. 17: dn:cn=test,ou=managers,dc=dlw,dc=com
  18. 18: cn:test
  19. 19: sn:Test User
  20. 20: objectclass:person

以上文件中各行的含义如下:
第1~6行创建根结点,这部分在前面也有介绍,就不再重复了。
第7、11、16行为空行,用来分隔4个dn条目(4个结点)。
第8~10行定义cn=managers结点的条目,该条目的objectClass为organizationalUnit,因此需要用ou属性定义组织名称。
第12~15行定义cn=dlw结点的条目,该条目使用的objectClass为person,因此需设置cn和sn两个属性值。
第17~20行与第12~15行的意义相同。

7. 从 LDIF 文件添加到目录数据库

使用OpenLDAP客户端工具ldapadd命令,可将LDIF文件中的条目添加到目录数据库中,该命令的格式如下:

ldappadd 选项 LDIF文件

  1. 加增:ldapadd
  2. 选项:
  3. -x 进行简单认证
  4. -D 用来绑定服务器的DN
  5. -h 目录服务的地址
  6. -w 绑定DN的密码
  7. -f 使用ldif文件进行条目添加的文件
  8. ldapadd -x -D "cn=root,dc=dlw,dc=com" -w secret -f dlw.com.ldif

8. 查询数据

添加到目录中的条目被保存在目录数据库,在Linux命令界面下,可使用OpenLDAP客户端工具ldapsearch命令来进行查询。

  1. # 该命令的格式如下:
  2. ldapsearch 选项 过滤 属性值
  3. # 选项
  4. -x 进行简单认证
  5. -D 用来绑定服务器的DN
  6. -w 绑定DN的密码
  7. -b 指定要查询的根节点
  8. -H 制定要查询的服务器
  9. # 使用简单认证,用 "cn=root,dc=kevin,dc=com" 进行绑定,要查询的根是 "dc=kevin,dc=com"。这样会把绑定的用户能访问"dc=kevin,dc=com"下的所有数据显示出来。
  10. [root@openldap ~]# ldapsearch -x -D "cn=root,dc=kevin,dc=com" -w secret -b "dc=kevin,dc=com"
  11. [root@openldap ~]# ldapsearch -x -W -D "cn=administrator,cn=users,dc=osdn,dc=cn" -b "cn=administrator,cn=users,dc=osdn,dc=cn" -h troy.osdn.zzti.edu.cn
  12. [root@openldap ~]# ldapsearch -b "dc=canon-is,dc=jp" -H ldaps://192.168.10.192:389

9. 修改条目

使用OpenLDAP客户端工具ldapmodify命令可对目录数据库中的条目进行修改

  1. # 命令格式
  2. ldapmodify 选项
  3. # 使用ldapmodify命令不能修改条目的dn,但可以修改其他属性值
  4. # 选项
  5. -a 添加新的条目.缺省的是修改存在的条目.
  6. -C 自动追踪引用.
  7. -c 出错后继续执行程序并不中止.缺省情况下出错的立即停止.
  8. -D binddn 指定搜索的用户名(一般为一dn 值).
  9. -e 设置客户端证书文件,例: -e cert/client.crt
  10. -E 设置客户端证书私钥文件,例: -E cert/client.key
  11. -f file 从文件内读取条目的修改信息而不是从标准输入读取.
  12. -H ldapuri 指定连接到服务器uri。常见格式为ldap://hostname:port
  13. -h ldaphost 指定要连接的主机的名称/ip 地址.它和-p 一起使用.
  14. -p ldapport 指定要连接目录服务器的端口号.它和-h 一起使用.
  15. -M[M] 打开manage DSA IT 控制. -MM 把该控制设置为重要的.
  16. -n 用于调试到服务器的通讯.但并不实际执行搜索.服务器关闭时,返回错误;服务器打开时,常和-v 参数一起测试到服务器是否是一条通路.
  17. -v 运行在详细模块.在标准输出中打出一些比较详细的信息.比如:连接到服务器的ip 地址和端口号等.
  18. -V 启用证书认证功能,目录服务器使用客户端证书进行身份验证,必须与-ZZ 强制启用TLS 方式配合使用,并且匿名绑定到目录服务器.
  19. -W 指定了该参数,系统将弹出一提示入用户的密码.它和-w 参数相对使用.
  20. -w bindpasswd 直接指定用户的密码. 它和-W 参数相对使用.
  21. -x 使用简单认证.
  22. -Z[Z] 使用StartTLS 扩展操作.如果使用-ZZ,命令强制使用StartTLS 握手成功.
  23. # 交互式修改
  24. ldapmodify -x -D "cn=root,dc=dlw,dc=com" -W secret # 进入修改状态
  25. dn: cn=test, ou=managers, dc=dlw, dc=com # 查找需要修改的条目
  26. changetype: modify # 设置修改模式
  27. replace: sn # 设置需要替换的属性sn
  28. sn: Test User Modify # 属性sn重新设置一个值
  29. # 通过文件修改
  30. # 第一步,创建一个文件 modify
  31. dn: cn=test,ou=managers,dc=dlw,dc=com
  32. changetype: modify
  33. replace: sn
  34. sn: Test User
  35. # 执行命令
  36. ldapmodify -x -D "cn=root,dc=dlw,dc=com" -w secret -f modify

10. 删除条目

对于目录数据库中不用的条目,也可使用ldapdelete命令将其删除

  1. # 命令格式
  2. ldapdelete 选项 删除条目
  3. # 选项
  4. -x 进行简单认证
  5. -D 用来绑定服务器的DN
  6. -h 目录服务的地址
  7. -w 绑定DN的密码
  8. -f 使用ldif文件进行条目添加的文件
  9. # 删除目录数据库中的“cn=test,ou=managers,dc=dlw,dc=com”条目
  10. ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret "cn=test,ou=managers,dc=dlw,dc=com"
  11. # 使用ldapdelete命令只能删除树形结构中的叶结点条目,如果删除非叶结点条目,将出现错误提示,我们可以使用下面的命令
  12. ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret "dc=dlw,dc=com"

11. 设置使用者密码

  1. 设置使用者密码:ldappasswd
  2. 选项
  3. -x 进行简单认证
  4. -D 用来绑定服务器的DN
  5. -w 绑定DN的密码
  6. -S 提示的输入密码
  7. -s pass 把密码设置为pass
  8. -a pass 设置old passwdpass
  9. -A 提示的设置old passwd
  10. -H 是指要绑定的服务器
  11. -I 使用sasl会话方式
  12. 例子
  13. [root@openldap ~]# ldappasswd -x -D 'cm=root,dc=it,dc=com' -w secret 'uid=zyx,dc=it,dc=com' -S

12. 数据导出

使用ldapsearch命令对目录数据库进行搜索,然后通过重定向将搜索结果保存到一个文件中,可达到导出数据的目的。另外,导出数据更常用的是slapcat命令,

  1. # 命令格式 , 最常用的选项就是-l,表示导出为LDIF文件格式。
  2. slapcat 选项
  3. slapcat -l export.ldif

13. 设置主从 LDAP 服务器

在某些时候,为了对LDAP服务器进行负载均衡,可能希望设置多台LDAP服务器。对于设置多台LDAP服务器的关键问题是数据的同步问题,使用slurpd进程可进行主LDAP服务器向从LDAP服务器复制数据的操作。下面将介绍架设主从LDAP服务器的过程

14. 多台 LDAP 服务器工作过程

对于多台LDAP服务器,可设置一台为主服务器,其他的为从服务器。本节介绍一台从服务器的配置,若是多台从服务器也可按此步骤进行操作。
注意:在进行配置之前应首先确保每个LDAP服务器都已安装好OpenLDAP服务器程序,并能正确工作。

配置好主从LDAP服务器之后,在主服务器运行slurpd进程,该进程使用LDAP协议从主服务器的数据库更新从服务器的数据,具体操作过程如下:

  1. LDAP客户端向从服务器提交一个LDAP修改请求
  2. 从服务器给LDAP客户端返回一个指向主服务器的引用。
  3. LDAP客户端向主服务器提交LDAP修改请求。
  4. 主服务器对数据库中的数据进行修改,并将改变写入本机的日志文件
  5. 在主服务器运行的slurpd进程检查到日志中有新内容,通过日志的信息将改变发送给从服务器。
  6. 从服务器接收slurpd发来的信息,对本地数据进行修改。

以上过程就是使用slurpd进程进行数据复制的过程。从以上过程可看出,需要在主服务器的配置文件中设置要向哪些从服务器发送复制信息、主服务器还要设置一个记录数据改变的日志文件,而从服务器需要设置一个指向主服务器的链接

15. 复制数据库

首先,把主从服务器关闭。然后通过以下三步操作静态同步主从服务器上的数据:
把主服务器上/var/lib/ldap目录下的所有数据库文件全部拷贝到从服务器的同目录中,覆盖原有文件。
把主服务器上的/etc/ldap/schema目录下的所有schema文件拷贝到从服务器的同目录中,覆盖原有文件。
把主服务器上/etc/ldap/slapd.conf文件拷贝到从服务器的同目录中,覆盖原有文件。

其他补充说明

1. LDIF 文件示例

  1. 可以说LDIF文件是OpenLDAP操作数据或修改配置的一切来源,下面是实际通过客户端工具操作的具体示例。
  2. 1)添加组织或条目
  3. 创建一个Marketing部门,添加一个dn记录:
  4. [root@ldap-server ~]# cat add_entry.ldif
  5. dn: ou=Marketing, dc=example,dc=com
  6. changetype: add
  7. objectclass: top
  8. objectclass: organizationalUnit
  9. ou: Marketing
  10. dn: cn=Pete Minsky,ou=Marketing,dc=example,dc=com
  11. changetype: add
  12. objectclass: person
  13. objectclass: organizationalPerson
  14. objectclass: inetOrgPerson
  15. cn: Pete Minsky
  16. sn: Pete
  17. ou: Marketing
  18. description: sb, sx
  19. description: sx
  20. uid: pminsky
  21. [root@ldap-server ~]# ldapmodify -xWD 'cn=admin,dc=example,dc=com' -f add_entry.ldif
  22. 或去掉changetype
  23. [root@ldap-server ~]# ldapmodify -a -xWD 'cn=admin,dc=example,dc=com' -f add_entry.ldif
  24. [root@ldap-server ~]# ldapadd -xWD 'cn=admin,dc=example,dc=com' -f add.ldif
  25. 2)修改组织或条目
  26. 添加mail属性,修改sn的值,删除一个description属性:
  27. [root@ldap-server ~]# cat modify_entry.ldif
  28. dn: cn=Pete Minsky,ou=Marketing,dc=example,dc=com
  29. changetype: modify
  30. add: mail
  31. mail: pminsky@example.com
  32. -
  33. replace: sn
  34. sn: Minsky
  35. -
  36. delete: description
  37. description: sx
  38. [root@ldap-server ~]# ldapmodify -xWD 'cn=admin,dc=example,dc=com' -f modify_entry.ldif
  39. [root@ldap-server ~]# ldapsearch -xD 'cn=admin,dc=mydomain,dc=net' -b 'ou=People,dc=mydomain,dc=net' -s sub 'objectclass=*' -w tplink -LLL
  40. 3)重命名条目
  41. dn: cn=Pete Minsky,ou=Marketing,dc=example,dc=com
  42. changetype: modrdn
  43. newrdn: cn=Susan Jacobs
  44. deleteoldrdn: 1
  45. modrdn只允许修改dn最左边的部分,且不能重命名带叶子或分支的子树,如果要将一个用户移动到另一个部门下,只能在新部门创建dn,然后删除旧的dn
  46. 4)删除组织或条目
  47. LDAP协议只能删除无分支的叶子dn
  48. [root@ldap-server ~]# cat delete_entry.ldif
  49. dn: cn=Susan Jacobs,ou=Marketing,dc=example,dc=com
  50. changetype: delete
  51. [root@ldap-server ~]# ldapdelete -xWD "cn=admin,dc=example,dc=com" -h localhost -p 389 "cn=Susan Jacobs,ou=Marketing,dc=example,dc=com"
  52. 5LDIF配置backend
  53. OpenLDAP的配置采用以cn=config为根的目录树的形式组织起来,采用config作为database,默认情况下包括adminroot用户都没有访问权限,需要赋予读写权限,
  54. 然而赋予修改权限要求首先要提供认证信息,初始化安装后的cn=config是没有credentials
  55. [root@ldap-server ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f modify_config.ldif
  56. SASL/EXTERNAL authentication started
  57. SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
  58. SASL SSF: 0
  59. modifying entry "olcDatabase={0}config,cn=config"
  60. ldap_modify: Insufficient access (50)
  61. 所以这里不得不手动编辑olcDatabase={0}config.ldif文件,获得最初认证权限(虽然官方不推荐手动修改配置):
  62. [root@ldap-server ~]# vi /etc/ldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif
  63. olcRootPW: {SSHA}your_slappasswd_secret
  64. 重启slapd后便可以修改config
  65. [root@ldap-server ~]# /etc/init.d/slapd restart
  66. [root@ldap-server ~]# ldapwhoami -x -D cn=config -W
  67. 修改示例:
  68. [root@ldap-server ~]# ldapmodify -xWD 'cn=config'
  69. Enter LDAP Password:
  70. dn: olcDatabase={0}config,cn=config
  71. changetype: modify
  72. replace: olcRootDN
  73. olcRootDN: cn=config
  74. -
  75. replace: olcRootPW
  76. olcRootPW: {SSHA}your_slappasswd_secret
  77. modifying entry "olcDatabase={0}config,cn=config"
  78. 在/etc/ldap/slapd.d/cn=config/olcDatabase={0}config.ldifolcRootDN变成base64加密后的值(两个”:”)。
  79. 最后,如果要在slapd服务未启动的情况下修改配置可以通过以下命令转换成ldif中间文件:
  80. [root@ldap-server ~]# slapcat -n0 -F /etc/ldap/slapd.d/ > /tmp/config-in-portable-format.ldif
  81. 编辑ldif文件后,重新shengc slapd.d目录
  82. [root@ldap-server ~]# slapadd -n0 -F /tmp/slapd.d -l /tmp/config-in-portable-format.ldif

2. OpenLDAP 配置步骤

  1. OpenLDAP主配置文件slapd.conf,该配置文件一般保存在安装目录下的etc/openldap/目录下。它的初始内容如下:
  2. [root@ldap-server openldap]# cat slapd.conf
  3. #
  4. # See slapd.conf(5) for details on configuration options.
  5. # This file should NOT be world readable.
  6. #
  7. include /usr/local/etc/openldap/schema/core.schema
  8. # Define global ACLs to disable default read access.
  9. # Do not enable referrals until AFTER you have a working directory
  10. # service AND an understanding of referrals.
  11. #referral ldap://root.openldap.org
  12. pidfile /usr/local/var/run/slapd.pid
  13. argsfile /usr/local/var/run/slapd.args
  14. # Load dynamic backend modules:
  15. # modulepath /usr/local/libexec/openldap
  16. # moduleload back_bdb.la
  17. # moduleload back_hdb.la
  18. # moduleload back_ldap.la
  19. # Sample security restrictions
  20. # Require integrityprotection (prevent hijacking)
  21. # Require 112-bit (3DESor better) encryption for updates
  22. # Require 63-bitencryption for simple bind
  23. # security ssf=1 update_ssf=112 simple_bind=64
  24. # Sample access control policy:
  25. # Root DSE: allow anyoneto read it
  26. # Subschema (sub)entryDSE: allow anyone to read it
  27. # Other DSEs:
  28. # Allow selfwrite access
  29. # Allowauthenticated users read access
  30. # Allowanonymous users to authenticate
  31. # Directives needed toimplement policy:
  32. # access to dn.base="" by * read
  33. # access to dn.base="cn=Subschema" by * read
  34. # access to *
  35. # by self write
  36. # by users read
  37. # by anonymous auth
  38. #
  39. # if no access controls are present, the default policy
  40. # allows anyone and everyone to read anything but restricts
  41. # updates to rootdn. (e.g.,"access to * by * read")
  42. #
  43. # rootdn can always read and write EVERYTHING!
  44. #######################################################################
  45. # BDB database definitions
  46. #######################################################################
  47. database bdb
  48. suffix "dc=my-domain,dc=com"
  49. rootdn "cn=Manager,dc=my-domain,dc=com"
  50. # Cleartext passwords, especially for the rootdn, should
  51. # be avoid. See slappasswd(8)and slapd.conf(5) for details.
  52. # Use of strong authentication encouraged.
  53. rootpw secret
  54. # The database directory MUST exist prior to running slapd AND
  55. # should only be accessible by the slapd and slap tools.
  56. # Mode 700 recommended.
  57. directory /usr/local/var/openldap-data
  58. # Indices to maintain
  59. index objectClass eq
  60. ====================需要注意的==================
  61. 设置LDAP使用的Schema
  62. [root@openldap-server openldap]# vi slapd.conf
  63. 找到语句:
  64. include /usr/local/etc/openldap/schema/core.schema
  65. 在该语句的后面添加以下语句:
  66. include /usr/local/etc/openldap/schema/corba.schema
  67. include /usr/local/etc/openldap/schema/cosine.schema
  68. include /usr/local/etc/openldap/schema/dyngroup.schema
  69. include /usr/local/etc/openldap/schema/inetorgperson.schema
  70. include /usr/local/etc/openldap/schema/java.schema
  71. include /usr/local/etc/openldap/schema/misc.schema
  72. include /usr/local/etc/openldap/schema/nis.schema
  73. include /usr/local/etc/openldap/schema/openldap.schema
  74. 设置目录树的后缀
  75. 找到语句:
  76. suffix "dc=my-domain,dc=com"
  77. 将其改为:
  78. suffix "dc=example,dc=com"
  79. 设置LDAP管理员的DN
  80. 找到语句:
  81. rootdn "cn=Manager,dc=my-domain,dc=com"
  82. 将其改为:
  83. rootdn "cn=root,dc=example,dc=com"
  84. 设置LDAP管理员的口令
  85. 找到语句:
  86. rootpw secret
  87. 将其改为:
  88. rootpw 123456
  89. 注:修改密码的时候需要注意rootpw前面不能有空格,以及rootpw与密码之间用TAB键隔开。
  90. 设置数据库的存放路径
  91. # Indices to maintain
  92. index objectClass eq

3. 数据导入

a)手工输入
b).ldif文件格式录入
c)脚本自动录入
d)客户端工具录入

参考

第八十二课 - LDAP协议_哔哩哔哩_bilibili

LDAP学习笔记总结 - 散尽浮华 - 博客园