一、LDAP概念
LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。简单说来,LDAP是一个得到关于人或者资源的集中、静态数据的快速方式。 LDAP是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用,不过根据组织者的需要,它可以做得更加强大。

现在市场上有关LDAP的产品已有很多,各大软件公司都在他们的产品中集成了LDAP服务,如Microsoft的ActiveDirectory、Lotus的Domino Directory、IBM的WebSphere中也集成了LDAP服务。LDAP的开源实现是OpenLDAP,它比商业产品一点也不差,而且源码开放。

OpenLDAP 是最常用的目录服务之一,它是一个由开源社区及志愿者开发和管理的一个开源项目,提供了目录服务的所有功能,包括目录搜索、身份认证、安全通道、过滤器等等。大多数的 Linux 发行版里面都带有 OpenLDAP 的安装包。OpenLDAP 服务默认使用非加密的 TCP/IP 协议来接收服务的请求,并将查询结果传回到客户端。由于大多数目录服务都是用于系统的安全认证部分比如:用户登录和身份验证,所以它也支持使用基于 SSL/TLS 的加密协议来保证数据传送的保密性和完整性。OpenLDAP 是使用 OpenSSL 来实现 SSL/TLS 加密通信的。

LDAP的信息模型是建立在"条目"(entries)的基础上。一个条目是一些属性的集合,并且具有一个全局唯一的"可区分名称"DN,一个条目可以通过DN来引用。每一个条目的属性具有一个类型和一个或者多个值。类型通常是容易记忆的名称,比如"cn"是通用名称(common name) ,或者"mail"是电子邮件地址。条目的值的语法取决于属性类型。比如,cn属性可能具有一个值"Babs Jensen" 。一个mail属性可能包含"bbs@kevin.com" 。一个jpegphoto属性可能包含一幅JPEG(二进制)格式的图片。

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支持的目录操作
包括:查询目录、更新目录、增加条目、删除条目、改变条目名称,搜索信息,最常用的LDAP操作是搜索信息操作。LDAP搜索操作允许搜索目录的一部分,查找匹配某个搜索过滤器规则的条目,搜索在 dc=example,dc=com 条目之中或者之下的整个目录子树,查找一个名字叫做 Barbara Jensen 的个人,并且获取每一个找到的条目的电子邮件地址。

1.1   LDAP协议简单介绍
目录是一组具有类似属性、以一定逻辑和层次组合的信息。常见的例子是通讯簿,由以字母顺序排列的名字、地址和电话号码组成。
目录服务是一种在分布式环境中发现目标的方法。目录具有两个主要组成部分:
第一部分是数据库,数据库是分布式的,且拥有一个描述数据的规划。
第二部分则是访问和处理数据的各种协议。

录服务其实也是一种数据库系统,只是这种数据库是一种树形结构,而不是通常使用的关系数据库。目录服务与关系数据库之间的主要区别在于:二者都允许对存储数据进行访问,只是目录主要用于读取,其查询的效率很高,而关系数据库则是为读写而设计的。
温馨提示:目录服务不适于进行频繁的更新,属于典型的分布式结构。
LDAP是一个目录服务协议,目前存在众多版本的LDAP,而最常见的则是V2和V3两个版本,它们分别于1995年和1997年首次发布。

1.2   LDAP的基本模型
LDAP的基本模型是建立在"条目"(Entry)的基础上。一个条目是一个或多个属性的集合,并且具有一个全局唯一的"可区分名称"(用dn表示)。与关系型数据(后面简称数据库)进行类比,一个条目相当于数据库中的一条记录,而dn相当于数据库中记录的关键字,属性相当于数据库中的字段。
温馨提示:dn必须是全局唯一的。
LDAP中,将数据组织成一个树形结构,这与现实生活中的很多数据结构可以对应起来,而不像设计关系型数据库的表,需要进行多种变化。如下图所展示的就是一个树形结构的数据。

在上图所示的树形结构中,树的根结点是一个组织的域名(dlw.com),其下分为3个部分,分别是managers、people和group,可将这3个组看作组织中的3个部门:如managers用来管理所有管理人员,people用来管理登录系统的用户,group用来管理系统中的用户组。当然,在该图中还可继续增加其他分支。
对于图中所示的树形结构,使用关系数据库来保存数据的话,需要设置多个表,一层一层分别保存,当需要查找某个信息时,再逐层进行查询,最终得到结果。
若使用目录来保存该图中的数据,则更直观。图中每个结点用一个条目来保存,不同类型的结点需要保存的数据可能不同,在LDAP中通过一个称为objectClass的类型来控制不同结点需要的数据(称为属性)。

对于目录中的数据怎样进行引用呢?前面提到过,每一个条目都有一个dn,因为dn是唯一的,因此就可找到需要结点的数据。dn的构造方式如下:
首先得到条目自己的名称(rdn,称为相对dn),然后开始向上逐级查找父结点,一直到根项为止。例如,对于图1-1中最右下方的结点,其dn为:

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

通过这样的方式,即可唯一标识每一个结点。在现实生活中,有很多这种树形结构的数据,如计算机文件系统的目录结构、Internet中的域名等。这些类型的数据,只要不需要频繁的更新,都适合用目录来保存。

LDAP主要的简称含义:
o->   organization(组织-公司)
ou-> organization unit(组织单元-部门)
c->   countryName(国家)
dc-> domainComponent(域名)
sn-> suer name(真实名称)
cn-> common name(常用名称)

1.3   LDAP的功能
在LDAP的功能模型中定义了一系列利用LDAP协议的操作,主要包含以下4部分:
查询操作:允许查询目录和取得数据,其查询性能比关系数据库好。
更新操作:目录的更新操作没关系数据库方便,更新性能较差,但也同样允许进行添加、删除、修改等操作。
复制操作:前面也提到过,LDAP是一种典型的分布式结构,提供复制操作,可将主服务器的数据的更新复制到设置的从服务器中。
认证和管理操作:允许客户端在目录中识别自己,并且能够控制一个会话的性质。

Ldap具体高级功能:
实现账号统一集中管理;
权限控制策略管理;
密码控制策略管理;
密码审计管理;
主机控制管理;
同步机制管理;
TLS/SASL加密传输;
高可用负载均衡架构;
自定义schema;
各种集中平台账号集中管理;

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

1.5   LDAP目录服务
目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好象它的名字一样。

目录服务是由目录数据库和一套访问协议组成的系统。类似以下的信息适合储存在目录中:

  • 企业员工信息,如姓名、电话、邮箱等
  • 公司的物理设备信息,如服务器,它的IP地址、存放位置、厂商、购买时间等
  • 客户的联系信息
  • 软件包的配置信息
  • 公用证书和安全密匙

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

1.6   LDAP组织数据的方式

1.7  身份认证在LDAP中提供三种认证机制
a)匿名认证:即不对用户进行认证,该方法仅对完全公开的方式适用
b)基本认证:通过用户名和密码进行身份识别,又分为简单密码和MD5密码认证
[root@ldap-server ~]# ldapadd -x -D "cn=root,dc=otas,dc=cn" -W -f base.ldif
Enter LDAP Password: 输入admin123
adding new entry "dc=otas,dc=cn"
adding new entry "ou=People,dc=otas,dc=cn"
adding new entry "ou=Group,dc=otas,dc=cn"
c)SASL认证:即LDAP提供的在SSL和TLS安全通道基础上进行的身份认证,包括数字证书的认证。

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

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

在目录树中怎么组织数据
cn=Fran Smith,ou=employees,dc=foobar,dc=com
               ------------ -----------------
                 容器条目    BaseDN
--------------------------------------------
                 DN

->  在UNIX文件系统中,最顶层是根目录(root),LDAP目录也通常用ROOT做根,通常称为BaseDN。
->  因为历史(X.500)的原因,LDAP目录用OU(Organization Unit)从逻辑上把数据分开来。
Ou 也是一种条目,容器条目
->  Ou 下就是真正的用户条目

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

常见的两种dn设置:

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

二、LDAP基本概念及其管理

启动OpenLDAP服务器程序之后,接下来的操作就是通过客户端程序对目录进行操作,包括添加、修改、删除和搜索数据等操作。

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

  • dn:每一个条目都有一个唯一的标识名(distinguished Name ,DN),如上图中一个 dn:"cn=baby,ou=marketing,ou=people,dc=mydomain,dc=org" 。通过DN的层次型语法结构,可以方便地表示出条目在LDAP树中的位置,通常用于检索。
  • rdn:一般指dn逗号最左边的部分,如cn=baby。它与RootDN不同,RootDN通常与RootPW同时出现,特指管理LDAP中信息的最高权限用户。
  • Base DN:LDAP目录树的最顶部就是根,也就是所谓的“Base DN",如"dc=mydomain,dc=org"。

2.2  schema

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

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

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

LDIF文件常用来向目录导入或更改记录信息,这些信息需要按照LDAP中schema的格式进行组织,并会接受schema的检查,不符合其要求的格式将会出现报错信息。

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

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

include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema

温馨提示:通常使用系统提供的schema就可解决大部分应用。管理员也可以自己设计制定schema,一般包括属性定义(AttributeDefinition)、类定义(ClassDefinition)以及语法定义(SyntaxDefinition)等部分。这里就不介绍具体的设计方法了。

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

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

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

# 注释
dn: 条目名
属性描述: 值
属性描述: 值
属性描述: 值
... ...

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的值。

2.4   objectClass
LDAP中,一个条目必须包含一个objectClass属性,且需要赋予至少一个值。每一个值将用作一条LDAP条目进行数据存储的模板;模板中包含了一个条目必须被赋值的属性和可选的属性。
objectClass有着严格的等级之分,最顶层是top和alias。例如,organizationalPerson这个objectClass就隶属于person,而person又隶属于top。
objectClass可分为以下3类:
结构型(Structural):如person和organizationUnit;
辅助型(Auxiliary):如extensibeObject;
抽象型(Abstract):如top,抽象型的objectClass不能直接使用。

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

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

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

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

在OpenLDAP的schema中定义了很多objectClass,下面列出部分常用的objectClass的名称。
● account
● alias
● dcobject
● domain
● ipHost
● organization
● organizationalRole
● organizationalUnit
● person
● organizationalPerson
● inetOrgPerson
● residentialPerson
● posixAccount
● posixGroup

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

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

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

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

常见的Attribute含义如下:
● c:国家。
● cn:common name,指一个对象的名字。如果指人,需要使用其全名。
● dc:domain Component,常用来指一个域名的一部分。
● givenName:指一个人的名字,不能用来指姓。
● l:指一个地名,如一个城市或者其他地理区域的名字。
● mail:电子信箱地址。
● o:organizationName,指一个组织的名字。
● ou:organizationalUnitName,指一个组织单元的名字。
● sn:surname,指一个人的姓。
● telephoneNumber:电话号码,应该带有所在的国家的代码。
● uid:userid,通常指某个用户的登录名,与Linux系统中用户的uid不同。

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

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

下面列出部分常用objectClass要求必设的属性。
● account:userid。
● organization:o。
● person:cn和sn。
● organizationalPerson:与person相同。
● organizationalRole:cn。
● organizationUnit:ou。
● posixGroup:cn、gidNumber。
● posixAccount:cn、gidNumber、homeDirectory、uid、uidNumber。

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

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

1: dn:dc=dlw,dc=com
2: objectclass:top
3: objectclass:dcobject
4: objectclass:organization
5: dc:dlw
6: o:dlw,Inc.
7:
8: dn:ou=managers, dc=dlw, dc=com
9: ou:managers
10: objectclass:organizationalUnit
11:
12: dn:cn=dlw,ou=managers,dc=dlw,dc=com
13: cn:dlw
14: sn:wangshibo
15: objectclass:person
16:
17: dn:cn=test,ou=managers,dc=dlw,dc=com
18: cn:test
19: sn:Test User
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行的意义相同。

在以上LDIF文件中,第1、8、12、17行以dn开头,这部分内容必须唯一,并且在向目录数据库添加这些数据时,也要确保这些数据不能与目录数据库中已有数据相同,否则,添加操作将中断。

================ldap命令的使用============

1)增加增:ldapadd
选项:
-x 进行简单认证
-D 用来绑定服务器的DN
-h 目录服务的地址
-w 绑定DN的密码
-f 使用ldif文件进行条目添加的文件 例子:
将 test.ldif 中的数据导入 ldap
[root@openldap ~]# ldapadd -x -D "cn=root,dc=kevin,dc=com" -w secret -f /root/test.ldif 2)删除:ldapdelete
例子
[root@openldap ~]# ldapdelete -x -D "cn=Manager,dc=test,dc=com" -w secret "uid=test1,ou=People,dc=test,dc=com"
[root@openldap ~]# ldapdelete -x -D 'cn=root,dc=it,dc=com' -w secert 'uid=zyx,dc=it,dc=com' 3)修改:ldapmodify
选项
-a 添加新的条目.缺省的是修改存在的条目.
-C 自动追踪引用.
-c 出错后继续执行程序并不中止.缺省情况下出错的立即停止.
-D binddn 指定搜索的用户名(一般为一dn 值).
-e 设置客户端证书文件,例: -e cert/client.crt
-E 设置客户端证书私钥文件,例: -E cert/client.key
-f file 从文件内读取条目的修改信息而不是从标准输入读取.
-H ldapuri 指定连接到服务器uri。常见格式为ldap://hostname:port
-h ldaphost 指定要连接的主机的名称/ip 地址.它和-p 一起使用.
-p ldapport 指定要连接目录服务器的端口号.它和-h 一起使用.
-M[M] 打开manage DSA IT 控制. -MM 把该控制设置为重要的.
-n 用于调试到服务器的通讯.但并不实际执行搜索.服务器关闭时,返回错误;服务器打开时,常和-v 参数一起测试到服务器是否是一条通路.
-v 运行在详细模块.在标准输出中打出一些比较详细的信息.比如:连接到服务器的ip 地址和端口号等.
-V 启用证书认证功能,目录服务器使用客户端证书进行身份验证,必须与-ZZ 强制启用TLS 方式配合使用,并且匿名绑定到目录服务器.
-W 指定了该参数,系统将弹出一提示入用户的密码.它和-w 参数相对使用.
-w bindpasswd 直接指定用户的密码. 它和-W 参数相对使用.
-x 使用简单认证.
-Z[Z] 使用StartTLS 扩展操作.如果使用-ZZ,命令强制使用StartTLS 握手成功. 例子
[root@openldap ~]# ldapmodify -x -D "cn=root,dc=it,dc=com" -W -f modify.ldif 4)查询:ldapsearch
选项
-x 进行简单认证
-D 用来绑定服务器的DN
-w 绑定DN的密码
-b 指定要查询的根节点
-H 制定要查询的服务器 例子
[root@openldap ~]# ldapsearch -x -D "cn=root,dc=kevin,dc=com" -w secret -b "dc=kevin,dc=com"
使用简单认证,用 "cn=root,dc=kevin,dc=com" 进行绑定,要查询的根是 "dc=kevin,dc=com"。这样会把绑定的用户能访问"dc=kevin,dc=com"下的所有数据显示出来。 [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
[root@openldap ~]# ldapsearch -b "dc=canon-is,dc=jp" -H ldaps://192.168.10.192:389 5)设置使用者密码:ldappasswd
选项
-x 进行简单认证
-D 用来绑定服务器的DN
-w 绑定DN的密码
-S 提示的输入密码
-s pass 把密码设置为pass
-a pass 设置old passwd为pass
-A 提示的设置old passwd
-H 是指要绑定的服务器
-I 使用sasl会话方式 例子
[root@openldap ~]# ldappasswd -x -D 'cm=root,dc=it,dc=com' -w secret 'uid=zyx,dc=it,dc=com' -S

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

在ldappadd命令中常用的选项如下:
-x:进行简单认证。
-D:用来绑定服务器的dn。
-h:目录服务的地址。
-w:绑定dn的密码。
-f:使用LDIF文件进行条目添加的文件。

将前面编写的LDIF文件的条目数据添加到目录数据库中。
具体操作步骤如下:
1)检查dlw.com.ldif文件中的内容,需要注意的是,每个冒号后面都需要空一格,而每行结束处不能留有空格字符。
2)使用以下命令将dlw.com.ldif文件中的条目添加到目录中:

# ldapadd -x -D "cn=root,dc=dlw,dc=com" -w secret -f dlw.com.ldif

温馨提示:如果以上命令执行不成功,需要逐个字符检查dlw.com.ldif文件中的内容,特别注意空格的问题。

2.8   查询
添加到目录中的条目被保存在目录数据库,在Linux命令界面下,可使用OpenLDAP客户端工具ldapsearch命令来进行查询。该命令的格式如下:
# ldapsearch 选项 过滤 属性值

常用的选项有以下几个:
-x:进行简单认证。
-D:用来绑定服务器的dn。
-w:绑定dn的密码。
-b:指定要查询的根节点。
-H:制定要查询的服务器。

使用ldapsearch命令查询“dc=dlw, dc=com”下的所有条目,可使用以下命令:

# ldapsearch -x -b "dc=dlw,dc=com"

而如果使用以下命令,将查询显示sn中以字符wu开头的条目,将得到如下图所示的查询结果,只找到一个条目。

# ldapsearch -x -b 'dc=dlw,dc=com' 'sn=wu*'

2.9   修改条目
使用OpenLDAP客户端工具ldapmodify命令可对目录数据库中的条目进行修改。该命令的格式如下:
# ldapmodify 选项

该命令的选项也很多,常用选项与ldapadd类似,这里就不再列出了。
温馨提示:使用ldapmodify命令不能修改条目的dn,但可以修改其他属性值。
使用ldapmodify命令修改条目信息可以有两种方式:一种是交互式进行修改,另一种是通过文件进行修改。

1) 交互式修改
修改前面创建的条目"cn=test, ou=managers, dc=dlw, dc=com",将其sn属性修改为"Test User Modify",并添加一个description属性,设置其值为"add Attribute"。
首先输入以下命令,进行修改状态:

# ldapmodify -x -D "cn=root,dc=dlw,dc=com" -W secret

执行以上命令后,终端将等候用户输入需要修改条目的dn,输入以下内容:

dn: cn=test, ou=managers, dc=dlw, dc=com
changetype: modify
replace: sn
sn: Test User Modify

以上输入内容中,第1行查找需要修改的条目,第2行设置修改模式,第3行设置需要替换的属性sn,第4行给属性sn重新设置一个值,替换该属性原有的值。
输入完以上内容之后再按Enter键,程序将按以上设置更新数据,然后按Ctrl+C键退出修改命令。

使用以上命令修改条目的数据之后,可使用以下命令查看是否修改成功:

# ldapsearch -x -b 'dc=dlw,dc=com' 'cn=test'

2) 通过文件修改
通过前面的方式对条目进行修改时,很不方便,如果在交互方式时输错了某个字符,只能中断命令后重新进行修改。因此,更好的修改方法是首先将修改时输入的文字保存到一个文件中,然后以该文件作为输入进行修改。用这种方式进行操作,首先需要创建一个临时文件,用来保存需要进行的修改操作,下面演示这种方式的修改过程。

【例子】通过修改命令将前面LDAP数据库中的信息还原,即将sn属性由“Test User Modify”修改为“Test User”
具体操作步骤如下:
[1]  使用vi编辑器创建一个文件modify,在其中输入以下内容:

dn: cn=test,ou=managers,dc=dlw,dc=com
changetype: modify
replace: sn
sn: Test User

从以上输入内容可看到,与在交互式时输入的内容完全相同。
技巧:使用文件方式修改条目,可方便修改和检查,若某个地方有输入错误,可修改后再调用ldapmodify进行修改,减少输入量。

[2] 使用以下命令调用modify的内容进行修改:

# ldapmodify -x -D "cn=root,dc=dlw,dc=com" -w secret -f modify

2.10   删除条目
对于目录数据库中不用的条目,也可使用ldapdelete命令将其删除。该命令的格式如下:
# ldapdelete 选项 删除条目

该命令使用的选项与ldapadd类似,就不再列出来了。
删除目录数据库中的“cn=test,ou=managers,dc=dlw,dc=com”条目,具体命令如下:

# ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret "cn=test,ou=managers,dc=dlw,dc=com"

顺利执行以上命令后,终端上将不会有任何信息输出,表示完成了删除操作。
使用ldapdelete命令只能删除树形结构中的叶结点条目,如果删除非叶结点条目,将出现错误提示。例如,执行以下命令删除根结点“dc=dlw,dc=com”,由于根结点下面还有结点,将显示如下图所示的错误提示信息:

应该使用命令:

# ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret "dc=dlw,dc=com"  

2.11   数据导出
通过ldapadd命令可向目录数据库中添加数据,在某些情况下,可能还需要进行反向操作,即将目录数据库中的数据导出。
使用ldapsearch命令对目录数据库进行搜索,然后通过重定向将搜索结果保存到一个文件中,可达到导出数据的目的。另外,导出数据更常用的是slapcat命令,该命令的格式如下:
# slapcat 选项

最常用的选项就是-l,表示导出为LDIF文件格式
如将前面例子中创建的目录数据库导出为export.ldif文件,可使用以下命令:

# slapcat -l export.ldif

温馨提示:从导出结果可看出,除了使用ldapadd命令添加到目录数据库中的条目数据外,还导出了很多其他信息,包括条目录UUID、时间戳等信息。

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

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

配置好主从LDAP服务器之后,在主服务器运行slurpd进程,该进程使用LDAP协议从主服务器的数据库更新从服务器的数据,具体操作过程如下:
1)LDAP客户端向从服务器提交一个LDAP修改请求。
2)从服务器给LDAP客户端返回一个指向主服务器的引用。
3)LDAP客户端向主服务器提交LDAP修改请求。
4)主服务器对数据库中的数据进行修改,并将改变写入本机的日志文件。
5)在主服务器运行的slurpd进程检查到日志中有新内容,通过日志的信息将改变发送给从服务器。
6)从服务器接收slurpd发来的信息,对本地数据进行修改。

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

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

三、其他补充说明

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

3.2  ldif文件示例

可以说LDIF文件是OpenLDAP操作数据或修改配置的一切来源,下面是实际通过客户端工具操作的具体示例。
1)添加组织或条目
创建一个Marketing部门,添加一个dn记录:
[root@ldap-server ~]# cat add_entry.ldif
dn: ou=Marketing, dc=example,dc=com
changetype: add
objectclass: top
objectclass: organizationalUnit
ou: Marketing dn: cn=Pete Minsky,ou=Marketing,dc=example,dc=com
changetype: add
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Pete Minsky
sn: Pete
ou: Marketing
description: sb, sx
description: sx
uid: pminsky [root@ldap-server ~]# ldapmodify -xWD 'cn=admin,dc=example,dc=com' -f add_entry.ldif 或去掉changetype后
[root@ldap-server ~]# ldapmodify -a -xWD 'cn=admin,dc=example,dc=com' -f add_entry.ldif
[root@ldap-server ~]# ldapadd -xWD 'cn=admin,dc=example,dc=com' -f add.ldif 2)修改组织或条目
添加mail属性,修改sn的值,删除一个description属性:
[root@ldap-server ~]# cat modify_entry.ldif
dn: cn=Pete Minsky,ou=Marketing,dc=example,dc=com
changetype: modify
add: mail
mail: pminsky@example.com
-
replace: sn
sn: Minsky
-
delete: description
description: sx [root@ldap-server ~]# ldapmodify -xWD 'cn=admin,dc=example,dc=com' -f modify_entry.ldif
[root@ldap-server ~]# ldapsearch -xD 'cn=admin,dc=mydomain,dc=net' -b 'ou=People,dc=mydomain,dc=net' -s sub 'objectclass=*' -w tplink -LLL 3)重命名条目
dn: cn=Pete Minsky,ou=Marketing,dc=example,dc=com
changetype: modrdn
newrdn: cn=Susan Jacobs
deleteoldrdn: 1 modrdn只允许修改dn最左边的部分,且不能重命名带叶子或分支的子树,如果要将一个用户移动到另一个部门下,只能在新部门创建dn,然后删除旧的dn。 4)删除组织或条目
LDAP协议只能删除无分支的叶子dn:
[root@ldap-server ~]# cat delete_entry.ldif
dn: cn=Susan Jacobs,ou=Marketing,dc=example,dc=com
changetype: delete 或
[root@ldap-server ~]# ldapdelete -xWD "cn=admin,dc=example,dc=com" -h localhost -p 389 "cn=Susan Jacobs,ou=Marketing,dc=example,dc=com" 5)LDIF配置backend
OpenLDAP的配置采用以cn=config为根的目录树的形式组织起来,采用config作为database,默认情况下包括admin或root用户都没有访问权限,需要赋予读写权限,
然而赋予修改权限要求首先要提供认证信息,初始化安装后的cn=config是没有credentials
[root@ldap-server ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f modify_config.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
ldap_modify: Insufficient access (50) 所以这里不得不手动编辑olcDatabase={0}config.ldif文件,获得最初认证权限(虽然官方不推荐手动修改配置):
[root@ldap-server ~]# vi /etc/ldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif
olcRootPW: {SSHA}your_slappasswd_secret 重启slapd后便可以修改config:
[root@ldap-server ~]# /etc/init.d/slapd restart
[root@ldap-server ~]# ldapwhoami -x -D cn=config -W 修改示例:
[root@ldap-server ~]# ldapmodify -xWD 'cn=config'
Enter LDAP Password:
dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=config
-
replace: olcRootPW
olcRootPW: {SSHA}your_slappasswd_secret modifying entry "olcDatabase={0}config,cn=config" 在/etc/ldap/slapd.d/cn=config/olcDatabase={0}config.ldif中olcRootDN变成base64加密后的值(两个”:”)。 最后,如果要在slapd服务未启动的情况下修改配置可以通过以下命令转换成ldif中间文件:
[root@ldap-server ~]# slapcat -n0 -F /etc/ldap/slapd.d/ > /tmp/config-in-portable-format.ldif
编辑ldif文件后,重新shengc slapd.d目录
[root@ldap-server ~]# slapadd -n0 -F /tmp/slapd.d -l /tmp/config-in-portable-format.ldif

3.3 OpenLDAP配置步骤

OpenLDAP主配置文件slapd.conf,该配置文件一般保存在安装目录下的etc/openldap/目录下。它的初始内容如下:
[root@ldap-server openldap]# cat slapd.conf
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include /usr/local/etc/openldap/schema/core.schema
# Define global ACLs to disable default read access.
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org
pidfile /usr/local/var/run/slapd.pid
argsfile /usr/local/var/run/slapd.args
# Load dynamic backend modules:
# modulepath /usr/local/libexec/openldap
# moduleload back_bdb.la
# moduleload back_hdb.la
# moduleload back_ldap.la
# Sample security restrictions
# Require integrityprotection (prevent hijacking)
# Require 112-bit (3DESor better) encryption for updates
# Require 63-bitencryption for simple bind
# security ssf=1 update_ssf=112 simple_bind=64
# Sample access control policy:
# Root DSE: allow anyoneto read it
# Subschema (sub)entryDSE: allow anyone to read it
# Other DSEs:
# Allow selfwrite access
# Allowauthenticated users read access
# Allowanonymous users to authenticate
# Directives needed toimplement policy:
# access to dn.base="" by * read
# access to dn.base="cn=Subschema" by * read
# access to *
# by self write
# by users read
# by anonymous auth
#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn. (e.g.,"access to * by * read")
#
# rootdn can always read and write EVERYTHING!
#######################################################################
# BDB database definitions
#######################################################################
database bdb
suffix "dc=my-domain,dc=com"
rootdn "cn=Manager,dc=my-domain,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8)and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw secret
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory /usr/local/var/openldap-data
# Indices to maintain
index objectClass eq ====================需要注意的==================
设置LDAP使用的Schema
[root@openldap-server openldap]# vi slapd.conf
找到语句:
include /usr/local/etc/openldap/schema/core.schema
在该语句的后面添加以下语句:
include /usr/local/etc/openldap/schema/corba.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/dyngroup.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/java.schema
include /usr/local/etc/openldap/schema/misc.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/openldap.schema 设置目录树的后缀
找到语句:
suffix "dc=my-domain,dc=com"
将其改为:
suffix "dc=example,dc=com" 设置LDAP管理员的DN
找到语句:
rootdn "cn=Manager,dc=my-domain,dc=com"
将其改为:
rootdn "cn=root,dc=example,dc=com" 设置LDAP管理员的口令
找到语句:
rootpw secret
将其改为:
rootpw 123456 注:修改密码的时候需要注意rootpw前面不能有空格,以及rootpw与密码之间用TAB键隔开。 设置数据库的存放路径
# Indices to maintain
index objectClass eq 注:蓝色部分可以根据需要进行修改!

3.4 数据导入
数据导入的方式主要有四种
a)手工输入
b).ldif文件格式录入
c)脚本自动录入
d)客户端工具录入

LDAP学习笔记总结的更多相关文章

  1. Oracle User Management FAQ翻译及学习笔记

    转载 最近了解到AME 的东西,很迫切,先转载一篇 [@more@] Oracle User Management FAQ翻译及学习笔记 写在前面 本文主要是翻译的英文版的Oracle User Ma ...

  2. VSTO学习笔记(四)从SharePoint 2010中下载文件

    原文:VSTO学习笔记(四)从SharePoint 2010中下载文件 上一次我们开发了一个简单的64位COM加载项,虽然功能很简单,但是包括了开发一个64位COM加载项的大部分过程.本次我们来给CO ...

  3. Spring Security Architecture and Implementation(架构和实现)学习笔记

    Spring Security 关于spring-security的官网文档学习笔记,主要是第8章 Architecture and Implementation(架构和实现)内容 参考: https ...

  4. Linux 学习笔记 5 文件的下载、压缩、解压、初步认识yum

    写在前面 上节我们通过简单的几组命令,已经完全的实现了文件的移动.删除.更名.以及复制,我们最常用的基本玩法,本节将带着大家学习压缩.解压的相关步骤. Linux 学习笔记 4 创建.复制.移动.文件 ...

  5. MongoDB学习笔记:快速入门

    MongoDB学习笔记:快速入门   一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...

  6. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  7. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  8. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  9. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

随机推荐

  1. 阿里云搭建JAVA WEB环境(SQL Server + TomCat + 配置域名)

    假期刚刚搭完,先写个提纲,今晚写完: 1.申请一个月的免费的云服务器ECS; 2.在云服务器上安装Java开发环境+Sql Server+Tomcat; 3.购买域名并认证,绑定服务器共有IP地址; ...

  2. linux系统日志自动切割工具----logrotate

    参考资料 :https://www.cnblogs.com/kevingrace/p/6307298.html 对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务 ...

  3. Eclipse更新maven项目仓库依赖

    ALT+F5 弹出 选择需要更新的项目, 点击ok, 就开始下载更新依赖的jar包了

  4. 17秋 软件工程 第六次作业 Beta冲刺 总结博客

    题目:团队作业--Beta冲刺 17秋 软件工程 第六次作业 Beta冲刺 总结博客 Beta冲刺过程中各个成员的贡献百分比 世强:15.5% 陈翔:14.5% 树民:12.0% 媛媛:14.0% 港 ...

  5. (11)Python包

  6. 原生JS添加类名 删除类名

    为 <div> 元素添加 class: document.getElementById("myDIV").classList.add("mystyle&quo ...

  7. Arduino IDE for ESP8266 项目云盒子(4)组网

  8. MATLAB——单层感知器

    1.创建一个感知器 实例 % example4_1.m p=[-,;-,] % 输入向量有两个分量,两个分量取值范围均为-~ % p = % % - % - t=; % 共有1个输出节点 net=ne ...

  9. 【Codeforces Round 464】Codeforces #265 (Div. 1)

    模拟RD265 ABC三题,Rank58 Codeforces 464 A 题意:给定一个字符串,求比这个字符串字典序大并且和它长度相等的第一个不含有长度大于等于2的回文串的字符串. 思路:首先我们枚 ...

  10. [01] 初识SpringBoot:Hello World

    引用百科的一句话来说,SpringBoot是一款全新框架,设计目的是为了简化新Spring应用的初始搭建以及开发过程. 怎么讲呢,首先要明确的就是SpringBoot不是替代Spring的一种解决方案 ...