一、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 加密通信的。
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为:
1
|
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是一种典型的分布式结构,提供复制操作,可将主服务器的数据的更新复制到设置的从服务器中。
认证和管理操作:允许客户端在目录中识别自己,并且能够控制一个会话的性质。
1.4 LDAP协议的特点
LDAP是一种目录服务,保存在特殊的数据库中,数据的读取速度远高于写入速度。
LDAP对查询做了优化,读取速度优于普通关系数据库。
LDAP不支持事务、不能进行回滚,需要进行这些操作的应用只有选择关系数据库。
LDAP采用服务器/客户端模式,支持分布式结构。
LDAP中的条目以树形结构组织和存储。
LDAP基于Internet协议,直接运行在简单和通用的TCP/IP或其他可靠的传输协议层上,使连接的建立和包的处理简单、快捷,对于互联网和企业网应用都很方便。
LDAP协议简单,通过使用查找操作实现列表操作和读操作。
LDAP通过引用机制实现分布式访问,通过客户端API实现分布式操作(对于应用透明),平衡了负载。
LDAP实现具有低费用、易配置和易管理的特点,并提供了满足应用程序对目录服务所需求的特性。
二、管理LDAP
启动OpenLDAP服务器程序之后,接下来的操作就是通过客户端程序对目录进行操作,包括添加、修改、删除和搜索数据等操作。
2.1 了解schema
对于LDAP目录中保存的信息,可以使用LDIF(LDAP Interchange Format)格式来保存。这是一种标准文本文件格式,使用这种格式保存得的LDAP服务器数据库中的数据可方便读取和修改,这也是其他大多数服务配置文件所采取的格式。
LDIF文件常用来向目录导入或更改记录信息,这些信息需要按照LDAP中schema的格式进行组织,并会接受schema的检查,不符合其要求的格式将会出现报错信息。有关LDIF文件的格式和创建将在第4章进行介绍,这里简单介绍一下组织LDAP数据格式的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文件:
1
2
3
4
|
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.2 向目录数据库中添加数据
初始状态下,LDAP是一个空目录,即没有任何数据。可通过程序代码向目录数据库中添加数据,也可使用OpenLDAP客户端工具ldapadd命令来完成添加数据的操作,该命令可将一个LDIF文件中的条目添加到目录。因此,需要首先创建一个LDIF文件,然后再进行添加操作。
1)LDIF文本条目格式
LDIF用文本格式表示目录数据库的信息,以方便用户创建、阅读和修改。在LDIF文件中,一个条目的基本格式如下:
1
2
3
4
5
6
|
# 注释
dn: 条目名
属性描述: 值
属性描述: 值
属性描述: 值
... ...
|
dn行类似于关系数据库中一条记录的关键字,不能与其他dn重复。一个LDIF文件中可以包含多个条目,每个条目之间用一个空行分隔。
例如,以下内容组成一个条目:
1
2
3
4
5
6
|
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.3 了解objectClass
LDAP中,一个条目必须包含一个objectClass属性,且需要赋予至少一个值。每一个值将用作一条LDAP条目进行数据存储的模板;模板中包含了一个条目必须被赋值的属性和可选的属性。
objectClass有着严格的等级之分,最顶层是top和alias。例如,organizationalPerson这个objectClass就隶属于person,而person又隶属于top。
objectClass可分为以下3类:
结构型(Structural):如person和organizationUnit;
辅助型(Auxiliary):如extensibeObject;
抽象型(Abstract):如top,抽象型的objectClass不能直接使用。
在OpenLDAP的schema中定义了很多objectClass,下面列出部分常用的objectClass的名称。
● account
● alias
● dcobject
● domain
● ipHost
● organization
● organizationalRole
● organizationalUnit
● person
● organizationalPerson
● inetOrgPerson
● residentialPerson
● posixAccount
● posixGroup
2.4 了解Attribute
属性(Attribute)类似于程序设计中的变量,可以被赋值。在OpenLDAP中声明了许多常用的Attribute(用户也可自己定义Attribute)。常见的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.5 创建LDIF文件
对以上内容有一定了解之后,就可以编写输入LDIF文件,编辑需要向目录数据库添加的条目了。
下面根据如下图所示的结构,创建LDIF文件dlw.com.ldif。
对上图进行分析,该目录结构分为3层,有4个结点。根据上图可创建LDIF文件如下:
温馨提示:每个结点可用一个dn表示,对于每个结点,又可继续添加新的结点。如在根结点中可添加其他部门ou,在ou=managers结点也可继续添加其他管理人员的信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
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:dongliwei
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开头,这部分内容必须唯一,并且在向目录数据库添加这些数据时,也要确保这些数据不能与目录数据库中已有数据相同,否则,添加操作将中断。
2.6 从LDIF文件添加到目录数据库
使用OpenLDAP客户端工具ldapadd命令,可将LDIF文件中的条目添加到目录数据库中,该命令的格式如下:
# ldappadd 选项 LDIF文件
在ldappadd命令中常用的选项如下:
-x:进行简单认证。
-D:用来绑定服务器的dn。
-h:目录服务的地址。
-w:绑定dn的密码。
-f:使用LDIF文件进行条目添加的文件。
将前面编写的LDIF文件的条目数据添加到目录数据库中。
具体操作步骤如下:
1)检查dlw.com.ldif文件中的内容,需要注意的是,每个冒号后面都需要空一格,而每行结束处不能留有空格字符。
2)使用以下命令将dlw.com.ldif文件中的条目添加到目录中:
1
|
# ldapadd -x -D "cn=root,dc=dlw,dc=com" -w secret -f dlw.com.ldif
|
温馨提示:如果以上命令执行不成功,需要逐个字符检查dlw.com.ldif文件中的内容,特别注意空格的问题。
2.7 查询
添加到目录中的条目被保存在目录数据库,在Linux命令界面下,可使用OpenLDAP客户端工具ldapsearch命令来进行查询。该命令的格式如下:
# ldapsearch 选项 过滤 属性值
常用的选项有以下几个:
-x:进行简单认证。
-D:用来绑定服务器的dn。
-w:绑定dn的密码。
-b:指定要查询的根节点。
-H:制定要查询的服务器。
使用ldapsearch命令查询“dc=dlw, dc=com”下的所有条目,可使用以下命令:
1
|
# ldapsearch -x -b "dc=dlw,dc=com"
|
而如果使用以下命令,将查询显示sn中以字符wu开头的条目,将得到如下图所示的查询结果,只找到一个条目。
1
|
# ldapsearch -x -b 'dc=dlw,dc=com' 'sn=wu*'
|
2.8 修改条目
使用OpenLDAP客户端工具ldapmodify命令可对目录数据库中的条目进行修改。该命令的格式如下:
# ldapmodify 选项
该命令的选项也很多,常用选项与ldapadd类似,这里就不再列出了。
温馨提示:使用ldapmodify命令不能修改条目的dn,但可以修改其他属性值。
使用ldapmodify命令修改条目信息可以有两种方式:一种是交互式进行修改,另一种是通过文件进行修改。
1) 交互式修改
修改前面创建的条目"cn=test, ou=managers, dc=dlw, dc=com",将其sn属性修改为"Test User Modify",并添加一个description属性,设置其值为"add Attribute"。
首先输入以下命令,进行修改状态:
1
|
# ldapmodify -x -D "cn=root,dc=dlw,dc=com" -W secret
|
执行以上命令后,终端将等候用户输入需要修改条目的dn,输入以下内容:
1
2
3
4
|
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键退出修改命令。
使用以上命令修改条目的数据之后,可使用以下命令查看是否修改成功:
1
|
# ldapsearch -x -b 'dc=dlw,dc=com' 'cn=test'
|
2) 通过文件修改
通过前面的方式对条目进行修改时,很不方便,如果在交互方式时输错了某个字符,只能中断命令后重新进行修改。因此,更好的修改方法是首先将修改时输入的文字保存到一个文件中,然后以该文件作为输入进行修改。用这种方式进行操作,首先需要创建一个临时文件,用来保存需要进行的修改操作,下面演示这种方式的修改过程。
【例子】通过修改命令将前面LDAP数据库中的信息还原,即将sn属性由“Test User Modify”修改为“Test User”。
具体操作步骤如下:
[1] 使用vi编辑器创建一个文件modify,在其中输入以下内容:
1
2
3
4
|
dn: cn=
test
,ou=managers,
dc
=dlw,
dc
=com
changetype: modify
replace: sn
sn: Test User
|
从以上输入内容可看到,与在交互式时输入的内容完全相同。
技巧:使用文件方式修改条目,可方便修改和检查,若某个地方有输入错误,可修改后再调用ldapmodify进行修改,减少输入量。
[2] 使用以下命令调用modify的内容进行修改:
1
|
# ldapmodify -x -D "cn=root,dc=dlw,dc=com" -w secret -f modify
|
2.9 删除条目
对于目录数据库中不用的条目,也可使用ldapdelete命令将其删除。该命令的格式如下:
# ldapdelete 选项 删除条目
该命令使用的选项与ldapadd类似,就不再列出来了。
删除目录数据库中的“cn=test,ou=managers,dc=dlw,dc=com”条目,具体命令如下:
1
|
# ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret "cn=test,ou=managers,dc=dlw,dc=com"
|
顺利执行以上命令后,终端上将不会有任何信息输出,表示完成了删除操作。
使用ldapdelete命令只能删除树形结构中的叶结点条目,如果删除非叶结点条目,将出现错误提示。例如,执行以下命令删除根结点“dc=dlw,dc=com”,由于根结点下面还有结点,将显示如下图所示的错误提示信息:
应该使用命令:
1
|
# ldapdelete -x -D "cn=root,dc=dlw,dc=com" -w secret "dc=dlw,dc=com"
|
2.10 数据导出
通过ldapadd命令可向目录数据库中添加数据,在某些情况下,可能还需要进行反向操作,即将目录数据库中的数据导出。
使用ldapsearch命令对目录数据库进行搜索,然后通过重定向将搜索结果保存到一个文件中,可达到导出数据的目的。另外,导出数据更常用的是slapcat命令,该命令的格式如下:
# slapcat 选项
最常用的选项就是-l,表示导出为LDIF文件格式。
如将前面例子中创建的目录数据库导出为export.ldif文件,可使用以下命令:
1
|
# slapcat -l export.ldif
|
温馨提示:从导出结果可看出,除了使用ldapadd命令添加到目录数据库中的条目数据外,还导出了很多其他信息,包括条目录UUID、时间戳等信息。
2.11 设置主从LDAP服务器
在某些时候,为了对LDAP服务器进行负载均衡,可能希望设置多台LDAP服务器。对于设置多台LDAP服务器的关键问题是数据的同步问题,使用slurpd进程可进行主LDAP服务器向从LDAP服务器复制数据的操作。下面将介绍架设主从LDAP服务器的过程
2.12 多台LDAP服务器工作过程
对于多台LDAP服务器,可设置一台为主服务器,其他的为从服务器。本节介绍一台从服务器的配置,若是多台从服务器也可按此步骤进行操作。
注意:在进行配置之前应首先确保每个LDAP服务器都已安装好OpenLDAP服务器程序,并能正确工作。
配置好主从LDAP服务器之后,在主服务器运行slurpd进程,该进程使用LDAP协议从主服务器的数据库更新从服务器的数据,具体操作过程如下:
1)LDAP客户端向从服务器提交一个LDAP修改请求。
2)从服务器给LDAP客户端返回一个指向主服务器的引用。
3)LDAP客户端向主服务器提交LDAP修改请求。
4)主服务器对数据库中的数据进行修改,并将改变写入本机的日志文件。
5)在主服务器运行的slurpd进程检查到日志中有新内容,通过日志的信息将改变发送给从服务器。
6)从服务器接收slurpd发来的信息,对本地数据进行修改。
以上过程就是使用slurpd进程进行数据复制的过程。从以上过程可看出,需要在主服务器的配置文件中设置要向哪些从服务器发送复制信息、主服务器还要设置一个记录数据改变的日志文件,而从服务器需要设置一个指向主服务器的链接。
2.13 复制数据库
首先,把主从服务器关闭。然后通过以下三步操作静态同步主从服务器上的数据:
把主服务器上/var/lib/ldap目录下的所有数据库文件全部拷贝到从服务器的同目录中,覆盖原有文件。
把主服务器上的/etc/ldap/schema目录下的所有schema文件拷贝到从服务器的同目录中,覆盖原有文件。
把主服务器上/etc/ldap/slapd.conf文件拷贝到从服务器的同目录中,覆盖原有文件。
三、Centos7下完整部署LDAP的操作记录
3.1 服务器环境介绍
Centos7.2系统,64 bit,下面的操作都是在root账号下执行的(下面OpenLDAP部署机test-vm002的ip地址是172.16.220.133)
3.2 OpenLDAP服务部署过程
1) 安装ldap服务
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@
test
-vm002 ~]
# vim /root/ldap_install.sh
#!/bin/bash
echo
"install ldap rpm"
wget http:
//dl
.fedoraproject.org
/pub/epel/epel-release-latest-7
.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
yum
install
-y openldap openldap-clients openldap-servers migrationtools openldap-devel compat-openldap
cp
/usr/share/openldap-servers/DB_CONFIG
.example
/var/lib/ldap/DB_CONFIG
chown
ldap.
/var/lib/ldap/DB_CONFIG
systemctl start slapd
systemctl
enable
slapd
[root@
test
-vm002 ~]
# sh -x ldap_install.sh
|
默认情况下,slapd服务监听的是389端口
1
2
3
4
|
[root@
test
-vm002 ~]
# lsof -i:389
COMMAND PID USER FD TYPE DEVICE SIZE
/OFF
NODE NAME
slapd 2940 ldap 8u IPv4 23618 0t0 TCP *:ldap (LISTEN)
slapd 2940 ldap 9u IPv6 23619 0t0 TCP *:ldap (LISTEN)
|
2) 配置ldap服务
首先要设置ldap的管理员密码。生成经处理后的明文密码(这里我输入明文密码admin@123)
其中 {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx 就是加密处理后的明文密码,之后会用到这个密码。
1
2
3
4
|
[root@
test
-vm002 ~]
# slappasswd
New password:
Re-enter new password:
{SSHA}wfYgDRZdRyxTuwVg1bzpXjjgAWGNYeN3
|
导入chrootpw.ldif文件
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@
test
-vm002 ~]
# cd /etc/openldap/
[root@
test
-vm002 openldap]
# vim chrootpw.ldif
# specify the password generated above for "olcRootPW" section
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}wfYgDRZdRyxTuwVg1bzpXjjgAWGNYeN3
[root@
test
-vm002 openldap]
# ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.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"
|
导入基本Schema模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@
test
-vm002 openldap]
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
SASL
/EXTERNAL
authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry
"cn=cosine,cn=schema,cn=config"
[root@
test
-vm002 openldap]
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
SASL
/EXTERNAL
authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry
"cn=nis,cn=schema,cn=config"
[root@
test
-vm002 openldap]
# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
SASL
/EXTERNAL
authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry
"cn=inetorgperson,cn=schema,cn=config"
|
温馨提示:可以有选择的导入下面的Schema模式。这里只选择导入上面三个模式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-----------------------------------------------------------------------------------------------
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/cosine
.ldif
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/nis
.ldif
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/collective
.ldif
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/corba
.ldif
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/core
.ldif
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/duaconf
.ldif
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/dyngroup
.ldif
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/inetorgperson
.ldif
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/java
.ldif
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/misc
.ldif
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/openldap
.ldif
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/pmi
.ldif
ldapadd -Y EXTERNAL -H ldapi:
///
-D
"cn=config"
-f
/etc/openldap/schema/ppolicy
.ldif
-----------------------------------------------------------------------------------------------
|
在ldap的DB中设置域名
下面输入的明文密码仍是admin@123
1
2
3
4
|
[root@
test
-vm002 openldap]
# slappasswd
New password:
Re-enter new password:
{SSHA}cm
/LXtPjAlGzPWta
+Yn3mKiDH53rVfMD
|
导入chdomain.ldif文件,这里我使用的域名是huanqiu.com
[root@test-vm002 openldap]# vim chdomain.ldif # replace to your own domain name for "dc=***,dc=***" section # specify the password generated above for "olcRootPW" section dn: olcDatabase={1}monitor,cn=config changetype: modify replace: olcAccess olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=huanqiu,dc=com" read by * none dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=huanqiu,dc=com dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=Manager,dc=huanqiu,dc=com dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}cm/LXtPjAlGzPWta+Yn3mKiDH53rVfMD dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=huanqiu,dc=com" write by anonymous auth by self write by * none olcAccess: {1}to dn.base="" by * read olcAccess: {2}to * by dn="cn=Manager,dc=huanqiu,dc=com" write by * read [root@test-vm002 openldap]# ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={2}hdb,cn=config" modifying entry "olcDatabase={2}hdb,cn=config" modifying entry "olcDatabase={2}hdb,cn=config" modifying entry "olcDatabase={2}hdb,cn=config"
然后导入basedomain.ldif文件
[root@test-vm002 openldap]# vim basedomain.ldif # replace to your own domain name for "dc=***,dc=***" section dn: dc=srv,dc=world objectClass: top objectClass: dcObject objectclass: organization o: Server Com dc: Huanqiu dn: cn=Manager,dc=huanqiu,dc=com objectClass: organizationalRole cn: Manager description: Directory Manager dn: ou=People,dc=huanqiu,dc=com objectClass: organizationalUnit ou: People dn: ou=Group,dc=huanqiu,dc=com objectClass: organizationalUnit ou: Group 如下导入basedomain.ldif文件时需要输入的密码是admin@123 [root@test-vm002 openldap]# ldapadd -x -D cn=Manager,dc=huanqiu,dc=com -W -f basedomain.ldif Enter LDAP Password: adding new entry "dc=huanqiu,dc=com" adding new entry "cn=Manager,dc=huanqiu,dc=com" adding new entry "ou=People,dc=huanqiu,dc=com" adding new entry "ou=Group,dc=huanqiu,dc=com"
3)关闭防火墙(或开启防火墙,开放389端口访问)
1
2
3
|
[root@
test
-vm002 openldap]
# systemctl stop firewalld
[root@
test
-vm002 openldap]
# systemctl disable firewalld
[root@
test
-vm002 openldap]
# setenforce 0
|
4)添加一个ldap用户(如下,添加用户kevin)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
仍然输入明文密码admin@123
[root@
test
-vm002 openldap]
# slappasswd
New password:
Re-enter new password:
{SSHA}NKGiugr+3ceSiv3tkgKYU5w5ywpDy
/bP
[root@
test
-vm002 openldap]
# vim ldapuser.ldif
# create new
# replace to your own domain name for "dc=***,dc=***" section
dn: uid=kevin,ou=People,
dc
=huanqiu,
dc
=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Kevin
sn: Linux
userPassword: {SSHA}NKGiugr+3ceSiv3tkgKYU5w5ywpDy
/bP
loginShell:
/bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory:
/home/kevin
dn: cn=kevin,ou=Group,
dc
=huanqiu,
dc
=com
objectClass: posixGroup
cn: Kevin
gidNumber: 1000
memberUid: kevin
如下导入ldapuser.ldif文件时的需要输入的密码是上面的admin@123
[root@
test
-vm002 openldap]
# ldapadd -x -D cn=Manager,dc=huanqiu,dc=com -W -f ldapuser.ldif
Enter LDAP Password:
adding new entry
"uid=kevin,ou=People,dc=huanqiu,dc=com"
adding new entry
"cn=kevin,ou=Group,dc=huanqiu,dc=com"
|
添加本机的系统用户和群组到ldap目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
[root@
test
-vm002 openldap]
# vim ldapuser.sh
# extract local users and groups who have 1000-9999 digit UID
# replace "SUFFIX=***" to your own domain name
# this is an example
#!/bin/bash
SUFFIX=
'dc=huanqiu,dc=com'
LDIF=
'ldapuser.ldif'
echo
-n > $LDIF
GROUP_IDS=()
grep
"x:[1-9][0-9][0-9][0-9]:"
/etc/passwd
| (
while
read
TARGET_USER
do
USER_ID=
"$(echo "
$TARGET_USER
" | cut -d':' -f1)"
USER_NAME=
"$(echo "
$TARGET_USER
" | cut -d':' -f5 | cut -d' ' -f1,2)"
[ !
"$USER_NAME"
] && USER_NAME=
"$USER_ID"
LDAP_SN=
"$(echo "
$USER_NAME
" | cut -d' ' -f2)"
[ !
"$LDAP_SN"
] && LDAP_SN=
"$USER_NAME"
LASTCHANGE_FLAG=
"$(grep "
${USER_ID}:
" /etc/shadow | cut -d':' -f3)"
[ !
"$LASTCHANGE_FLAG"
] && LASTCHANGE_FLAG=
"0"
SHADOW_FLAG=
"$(grep "
${USER_ID}:
" /etc/shadow | cut -d':' -f9)"
[ !
"$SHADOW_FLAG"
] && SHADOW_FLAG=
"0"
GROUP_ID=
"$(echo "
$TARGET_USER
" | cut -d':' -f4)"
[ !
"$(echo "
${GROUP_IDS[@]}
" | grep "
$GROUP_ID
")"
] && GROUP_IDS=(
"${GROUP_IDS[@]}"
"$GROUP_ID"
)
echo
"dn: uid=$USER_ID,ou=People,$SUFFIX"
>> $LDIF
echo
"objectClass: inetOrgPerson"
>> $LDIF
echo
"objectClass: posixAccount"
>> $LDIF
echo
"objectClass: shadowAccount"
>> $LDIF
echo
"sn: $LDAP_SN"
>> $LDIF
echo
"givenName: $(echo "
$USER_NAME
" | awk '{print $1}')"
>> $LDIF
echo
"cn: $USER_NAME"
>> $LDIF
echo
"displayName: $USER_NAME"
>> $LDIF
echo
"uidNumber: $(echo "
$TARGET_USER
" | cut -d':' -f3)"
>> $LDIF
echo
"gidNumber: $(echo "
$TARGET_USER
" | cut -d':' -f4)"
>> $LDIF
echo
"userPassword: {crypt}$(grep "
${USER_ID}:
" /etc/shadow | cut -d':' -f2)"
>> $LDIF
echo
"gecos: $USER_NAME"
>> $LDIF
echo
"loginShell: $(echo "
$TARGET_USER
" | cut -d':' -f7)"
>> $LDIF
echo
"homeDirectory: $(echo "
$TARGET_USER
" | cut -d':' -f6)"
>> $LDIF
echo
"shadowExpire: $(passwd -S "
$USER_ID
" | awk '{print $7}')"
>> $LDIF
echo
"shadowFlag: $SHADOW_FLAG"
>> $LDIF
echo
"shadowWarning: $(passwd -S "
$USER_ID
" | awk '{print $6}')"
>> $LDIF
echo
"shadowMin: $(passwd -S "
$USER_ID
" | awk '{print $4}')"
>> $LDIF
echo
"shadowMax: $(passwd -S "
$USER_ID
" | awk '{print $5}')"
>> $LDIF
echo
"shadowLastChange: $LASTCHANGE_FLAG"
>> $LDIF
echo
>> $LDIF
done
for
TARGET_GROUP_ID
in
"${GROUP_IDS[@]}"
do
LDAP_CN=
"$(grep "
:${TARGET_GROUP_ID}:
" /etc/group | cut -d':' -f1)"
echo
"dn: cn=$LDAP_CN,ou=Group,$SUFFIX"
>> $LDIF
echo
"objectClass: posixGroup"
>> $LDIF
echo
"cn: $LDAP_CN"
>> $LDIF
echo
"gidNumber: $TARGET_GROUP_ID"
>> $LDIF
for
MEMBER_UID
in
$(
grep
":${TARGET_GROUP_ID}:"
/etc/passwd
|
cut
-d
':'
-f1,3)
do
UID_NUM=$(
echo
"$MEMBER_UID"
|
cut
-d
':'
-f2)
[ $UID_NUM -
ge
1000 -a $UID_NUM -
le
9999 ] &&
echo
"memberUid: $(echo "
$MEMBER_UID
" | cut -d':' -f1)"
>> $LDIF
done
echo
>> $LDIF
done
)
[root@
test
-vm002 openldap]
# chmod 755 ldapuser.sh
[root@
test
-vm002 openldap]
# sh ldapuser.sh
下面输入的密码仍然是admin@123
[root@
test
-vm002 openldap]
# ldapadd -x -D cn=Manager,dc=huanqiu,dc=com -W -f ldapuser.ldif
Enter LDAP Password:
adding new entry
"uid=admin,ou=People,dc=huanqiu,dc=com"
adding new entry
"uid=wangshibo,ou=People,dc=huanqiu,dc=com"
adding new entry
"uid=devs,ou=People,dc=huanqiu,dc=com"
adding new entry
"uid=huihui,ou=People,dc=huanqiu,dc=com"
adding new entry
"cn=admin,ou=Group,dc=huanqiu,dc=com"
adding new entry
"cn=wangshibo,ou=Group,dc=huanqiu,dc=com"
adding new entry
"cn=devs,ou=Group,dc=huanqiu,dc=com"
adding new entry
"cn=huihui,ou=Group,dc=huanqiu,dc=com"
|
5)安装phpLDAPadmin来web配置LDAP
安装和配置httpd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@
test
-vm002 ~]
# yum -y install httpd
[root@
test
-vm002 ~]
# rm -f /etc/httpd/conf.d/welcome.conf
[root@
test
-vm002 ~]
# vim /etc/httpd/conf/httpd.conf //修改下面几行内容
ServerName www.example.com:80
//
第96行
AllowOverride All
//
第151行
DirectoryIndex index.html index.cgi index.php
//
第164行
# add follows to the end //添加这几行
# server's response header
ServerTokens Prod
# keepalive is ON
KeepAlive On
[root@
test
-vm002 ~]
# systemctl start httpd
[root@
test
-vm002 ~]
# systemctl enable httpd
Created
symlink
from
/etc/systemd/system/multi-user
.target.wants
/httpd
.service to
/usr/lib/systemd/system/httpd
.service.
[root@
test
-vm002 ~]
# vim /var/www/html/index.html
this is
test
page
for
httpd!!!
|
安装php
1
2
3
4
5
6
7
8
9
10
|
[root@
test
-vm002 ~]
# yum -y install php php-mbstring php-pear
[root@
test
-vm002 ~]
# vim /etc/php.ini
date
.timezone =
"Asia/Shanghai"
//
第878行
[root@
test
-vm002 ~]
# systemctl restart httpd
[root@
test
-vm002 ~]
# vim /var/www/html/index.php
<?php
phpinfo();
?>
|
访问http://172.16.220.133/index.php
安装phpLDAP admin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
[root@
test
-vm002 ~]
# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
[root@
test
-vm002 ~]
# rpm -ivh epel-release-latest-7.noarch.rpm
[root@
test
-vm002 ~]
# yum repolist #检查是否已添加至源列表
[root@
test
-vm002 ~]
# yum --enablerepo=epel -y install phpldapadmin
登陆设置
[root@
test
-vm002 ~]
# vim /etc/phpldapadmin/config.php
$servers->setValue(
'login'
,
'attr'
,
'dn'
);
//
第387行,打开这行的注释.使用用户名登陆
//
$servers->setValue(
'login'
,
'attr'
,
'uid'
);
//
注释掉这行。禁止使用uid登陆
[root@
test
-vm002 ~]
# cat /etc/httpd/conf.d/phpldapadmin.conf
#
# Web-based tool for managing LDAP servers
#
Alias
/phpldapadmin
/usr/share/phpldapadmin/htdocs
Alias
/ldapadmin
/usr/share/phpldapadmin/htdocs
<Directory
/usr/share/phpldapadmin/htdocs
>
<IfModule mod_authz_core.c>
# Apache 2.4
Require
local
Require ip 172.16.220.0
/8
//
添加访问权限,由于我本地ip是172.16.220.19,所以这里设置这个网段的访问权限
<
/IfModule
>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from ::1
<
/IfModule
>
<
/Directory
>
[root@
test
-vm002 ~]
# systemctl restart httpd
[root@
test
-vm002 share]
# ps -ef|grep httpd
root 4150 1 0 01:13 ? 00:00:00
/usr/sbin/httpd
-DFOREGROUND
apache 4151 4150 0 01:13 ? 00:00:00
/usr/sbin/httpd
-DFOREGROUND
apache 4152 4150 0 01:13 ? 00:00:00
/usr/sbin/httpd
-DFOREGROUND
apache 4153 4150 0 01:13 ? 00:00:00
/usr/sbin/httpd
-DFOREGROUND
apache 4154 4150 0 01:13 ? 00:00:00
/usr/sbin/httpd
-DFOREGROUND
apache 4155 4150 0 01:13 ? 00:00:00
/usr/sbin/httpd
-DFOREGROUND
apache 4177 4150 0 01:13 ? 00:00:00
/usr/sbin/httpd
-DFOREGROUND
apache 4184 4150 0 01:13 ? 00:00:00
/usr/sbin/httpd
-DFOREGROUND
root 4188 3000 0 01:14 pts
/1
00:00:00
grep
--color=auto httpd
[root@
test
-vm002 share]
# chown -R apache.apache /usr/share/phpldapadmin
|
访问http://172.16.220.133/ldapadmin
登陆用户名:cn=Manager,dc=huanqiu,dc=com
密码是上面的admin@123