简述
OpenLDAP是一款轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP),属于开源集中账号管理架构的实现,且支持众多系统版本,被广大互联网公司所采用。
LDAP具有两个国家标准,分别是X.500和LDAP。OpenLDAP是基于X.500标准的,而且去除了X.500复杂的功能并且可以根据自我需求定制额外扩展功能,但与X.500也有不同之处,例如OpenLDAP支持TCP/IP协议等,目前TCP/IP是Internet上访问互联网的协议。
OpenLDAP则直接运行在更简单和更通用的TCP/IP或其他可靠的传输协议层上,避免了在OSI会话层和表示层的开销,使连接的建立和包的处理更简单、更快,对于互联网和企业网应用更理想。LDAP提供并实现目录服务的信息服务,目录服务是一种特殊的数据库系统,对于数据的读取、浏览、搜索有很好的效果。目录服务一般用来包含基于属性的描述性信息并支持精细复杂的过滤功能,但OpenLDAP目录服务不支持通用数据库的大量更新操作所需要的复杂的事务管理或回滚策略等。
OpenLDAP默认以Berkeley DB作为后端数据库,Berkeley DB数据库主要以散列的数据类型进行数据存储,如以键值对的方式进行存储。Berkeley DB是一类特殊的数据库,主要用于搜索、浏览、更新查询操作,一般对于一次写入数据、多次查询和搜索有很好的效果。Berkeley DB数据库是面向查询进行优化,面向读取进行优化的数据库。Berkeley DB不支持事务型数据库(MySQL、MariDB、Oracle等)所支持的高并发的吞吐量以及复杂的事务操作。
OpenLDAP目录中的信息是按照树形结构进行组织的,具体信息存储在条目(entry)中,条目可以看成关系数据库中的表记录,条目是具有区别名(Distinguished Name,DN)的属性(attribute),DN是用来引用条目,DN相当于关系数据库(Oracle/MySQL)中的主键(primary key),是唯一的。属性由类型(type)和一个或者多个值(value)组成,相当于关系数据库中字段的概念
功能
-
实现账号统一集中管理
-
权限控制管理(sudo)
-
密码控制策略管理
-
密码审计管理
-
密码控制策略
-
主机控制管理
-
同步机制管理
-
TLS/SASL加密传输
-
高可用负载均衡架构
-
自定义schema
-
各种应用平台集成账号管理
概念
目录树
在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目(Entry)
条目
条目,也叫记录项,是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象
LDAP目录的条目(entry)由属性(attribute)的一个聚集组成,并由一个唯一性的名字引用,即专有名称(distinguished name,DN)
对象类
对象类是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。比如人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码(userPassword)等属性,单位职工(organizationalPerson)是人员(person)的继承类,除了上述属性之外还含有职务(title)、邮政编码(postalCode)、通信地址(postalAddress)等属性
属性
每个条目都可以有很多属性(Attribute),比如常见的人都有姓名、地址、电话等属性。每个属性都有名称及对应的值,属性值可以有单个、多个
属性
基础字段
dc (Domain Component)
域名的部分,其格式是将完整的域名分成几部分。如域名为cssp.com变成dc=cssp,dc=com
ou(Organization Unit)
组织单位,组织单位可以包含其他各种对象(包括其他组织单元)
cn (Common Name)
常用名称,可用作分组的名字,或者用户的全名
dn (Distinguished Name)
每一个条目都有一个唯一的标识名,dn在ldap中全局唯一,相当于该条目的唯一ID。如上边示例中的:cn=group,dc=cssp,dc=com就是该条目的dn
rdn (Relative dn)
一般指dn逗号最左边的部分。如cn=group,dc=cssp,dc=com的rdn就是 cn=group
Base DN
LDAP目录树的最顶部就是根,比如上边示例中的base dn为 dc=cssp,dc=com
description
在不同类别中,对应不同类别的说明信息。比如用户的说明信息,分组的说明信息
用户字段
uid (User Id)
用户的用户名,通常为中文拼音,或者用邮箱地址的用户名部分。
sn (Surname)
用户的姓氏,对于中文环境下,可以直接用姓名填充。
givenName
用户的名字,不包含姓,对于中文语境下,可灵活运用该字段。
displayName
用户的显示名字,全名。
用户的邮箱。
title
用户的职位。
employeeNumber
用户的员工ID,也可以理解为工号。
employeeType
用户在单位中的角色。
departmentNumber
用户所在部门的名称,通常为部门名,而非部门号。
businessCategory
描述业务的种类,在中文语境中可灵活定义。
userPassword
用户密码。
jpegPhoto
用户的个人资料照片。
photo
用户的照片,如上这两个字段都可以用。
postalAddress
用户的邮政地址,也可以直接认为是用户地址。
entryUuid
此用户专属的固定通用标识符,类似union_id,通常用不到。
objectSid
此用户专属的通用标识符,与 Windows 安全标识符兼容。
uidNumber
用户的 POSIX UID 号码。如果为用户设置了 POSIX ID,这里则会显示此号码。否则,这里会显示专属的固定标识符。
gidNumber
用户主要群组的 POSIX GID 号码。如果为用户设置了 POSIX GID,这里则会显示此号码。否则,则会显示与用户的 UID 相同的号码。
homeDirectory
用户的 POSIX 主目录。默认为/home/<用户名>。
loginShell
用户的 POSIX 登录 shell。默认为/bin/bash。
carLicense
车牌,通常用不上这个字段。
homePhone
家庭固定电话,通常用不上这个字段。
homePostalAddress
邮编,通常用不上这个字段。
roomNumber
房间号码,通常用不上这个字段。
secretary
秘书,通常用不上这个字段。
分组字段
displayName
用户可理解的群组显示名称。
description
用户可理解的群组详细说明。
gidNumber
群组的 POSIX GID 号码。这是固定的专属 ID,但无法通过此 ID 高效地查找群组。
entryUuid
此群组专属的固定通用标识符。
member
此群组中成员的完全符合条件的名称列表。
memberUid
此群组中成员的用户名列表。
部署
openldap+phpldapadmin
安装openldap
yum安装
#yum install -y openldap openldap-clients openldap-servers
配置
1,复制一个默认配置到指定目录下,并授权,这一步一定要做,然后再启动服务,不然生产密码时会报错
#cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
2,ldap用户授权
#chown -R ldap.ldap /var/lib/ldap/DB_CONFIG
3,启动
#systemctl start | enable | status slapd
启用memberof功能
从openldap2.4.23版本开始,所有配置都保存在/etc/openldap/slapd.d目录下的cn=config文件夹内,不再使用slapd.conf作为配置文件。配置文件的后缀为 ldif,且每个配置文件都是通过命令自动生成的,任意打开一个配置文件,在开头都会有一行注释,说明此为自动生成的文件,请勿编辑,使用ldapmodify命令进行修改
安装openldap后,会有三个命令用于修改配置文件,分别为ldapadd, ldapmodify, ldapdelete,顾名思义就是添加,修改和删除。而需要修改或增加配置时,则需要先写一个ldif后缀的配置文件,然后通过命令将写的配置更新到slapd.d目录下的配置文件中.
修改配置过程
1,生成管理员密码,记录下这个密码,后面需要用到
#slappasswd -s 123456
{SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE
2,新增修改密码文件,ldif为后缀,文件名随意,不要在/etc/openldap/slapd.d/目录下创建类似文件
3,生成的文件为需要通过命令去动态修改ldap现有配置
#vim /etc/openldap/slapd.d/changepwd.ldif
----------------------------------------------------------------------
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE
----------------------------------------------------------------------
###第一行执行配置文件,这里就表示指定为 cn=config/olcDatabase={0}config 文件。/etc/openldap/slapd.d/目录下就能找到此文件
###第二行 changetype 指定类型为修改
###第三行 add 表示添加 olcRootPW 配置项
###第四行指定 olcRootPW 配置项的值
###在执行下面的命令前,你可以先查看原本的olcDatabase={0}config文件,里面是没有olcRootPW这个项的,执行命令后,你再看就会新增了olcRootPW项,而且内容是我们文件中指定的值加密后的字符串
4,执行命令,修改ldap配置,通过-f执行文件
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/slapd.d/changepwd.ldif
![](https://i-blog.csdnimg.cn/blog_migrate/ccb721dea62dc8c6bc2d9a71ec5666ab.png)
查看olcDatabase={0}config内容,新增了一个olcRootPW项
#cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif
![](https://i-blog.csdnimg.cn/blog_migrate/24444e0615b38473d4e3a25d74411872.png)
切记不能直接修改/etc/openldap/slapd.d/目录下的配置
5,向 LDAP 中导入一些基本的 Schema。这些 Schema 文件位于 /etc/openldap/schema/ 目录中,schema控制着条目拥有哪些对象类和属性,可以自行选择需要的进行导入,
依次执行下面的命令,导入基础的一些配置,我这里将所有的都导入一下,其中core.ldif是默认已经加载了的,不用导入
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif
#ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
6,修改域名,新增changedomain.ldif, 这里我自定义的域名为 filesec.com,管理员用户账号为admin。
如果要修改,则修改文件中相应的dc=filesec,dc=com为自己的域名
#vim /etc/openldap/slapd.d/changepwd.ldif
-------------------------------------------------------------------------
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=admin,dc=filesec,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=filesec,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=filesec,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=filesec,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=filesec,dc=com" write by * read
-------------------------------------------------------------------------
7,执行命令,修改配置
#ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/openldap/slapd.d/changepwd.ldif
![](https://i-blog.csdnimg.cn/blog_migrate/559f2e96a4fb1bcbf9841e7647d10868.png)
8,新增add-memberof.ldif
开启memberof支持并新增用户支持memberof配置
#vim /etc/openldap/slapd.d/add-memberof.ldif
-------------------------------------------------------------
dn: cn=module{0},cn=config
cn: modulle{0}
objectClass: olcModuleList
objectclass: top
olcModuleload: memberof.la
olcModulePath: /usr/lib64/openldap
dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
olcMemberOfMemberOfAD: memberOf
-------------------------------------------------------------
9,新增refint1.ldif文件
#vim /etc/openldap/slapd.d/refint1.ldif
-------------------------------------------------------------
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
-------------------------------------------------------------
10,新增refint2.ldif文件
#vim /etc/openldap/slapd.d/refint2.ldif
-------------------------------------------------------------
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember manager owner
-------------------------------------------------------------
11,依次执行下面命令,加载配置,顺序不能错
#ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /etc/openldap/slapd.d/add-memberof.ldif
#ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f /etc/openldap/slapd.d/refint1.ldif
#ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /etc/openldap/slapd.d/refint2.ldif
![](https://i-blog.csdnimg.cn/blog_migrate/d481f93b54f4276851e4a91d76b8533a.png)
创建用户
在上述基础上,我们来创建一个叫做 filesec company 的组织,并在其下创建一个 admin 的组织角色(该组织角色内的用户具有管理整个 LDAP 的权限)和 People 和 Group 两个组织单元
1,新增配置文件
#vim /etc/openldap/slapd.d/base.ldif
----------------------------------------------------------
dn: dc=filesec,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: filesec Company
dc: filesec
dn: cn=admin,dc=filesec,dc=com
objectClass: organizationalRole
cn: admin
dn: ou=People,dc=filesec,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=filesec,dc=com
objectClass: organizationalRole
cn: Group
----------------------------------------------------------
2,执行命令,添加配置, 这里要注意修改域名为自己配置的域名,然后需要输入上面我们生成的密码(明文)
#ldapadd -x -D cn=admin,dc=filesec,dc=com -W -f /etc/openldap/slapd.d/base.ldif
其中基准 dc=filesec,dc=com 是该树的根节点,其下有一个管理域 cn=admin,dc=filesec,dc=com 和两个组织单元 ou=People,dc=filesec,dc=com 及 ou=Group,dc=filesec,dc=com
安装phpldapadmin
web界面
1,安装php、php-ldap
#yum install -y php php-ldap
2,安装phpldapadmin
#rpm -ivh phpldapadmin-1.2.5-1.el7.noarch.rpm
![](https://i-blog.csdnimg.cn/blog_migrate/cd6ca4071c1c08afded298828f6c0d8d.png)
3,修改apache的phpldapadmin配置文件
修改如下内容,放开外网访问,这里只改了2.4版本的配置,因为centos7 默认安装的apache为2.4版本。所以只需要改2.4版本的配置就可以了
如果不知道自己apache版本,执行 rpm -qa|grep httpd 查看apache版本
vim /etc/httpd/conf.d/phpldapadmin.conf
-----------------------------------------------------------------
<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted
</IfModule>
-----------------------------------------------------------------
![](https://i-blog.csdnimg.cn/blog_migrate/70dff472e592fb7f74bf73a05647d3d2.png)
4,修改配置用DN登录ldap
#vim /etc/phpldapadmin/config.php
-----------------------------------------------------------------
#398行,默认是使用uid进行登录,我这里改为cn,也就是用户名
$servers->setValue('login','attr','cn');
#460行,关闭匿名登录,否则任何人都可以直接匿名登录查看所有人的信息
$servers->setValue('login','anon_bind',false);
#519行,设置用户属性的唯一性,这里我将cn,sn加上了,以确保用户名的唯一性
$servers->setValue('unique','attrs',array('mail','uid','uidNumber','cn','sn'));
-----------------------------------------------------------------
![](https://i-blog.csdnimg.cn/blog_migrate/8c5daa324baed1db71b7d35a9993f78f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/09b2447dc697f1aa7bcb07e1106e4bef.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0b777e12ae9e26a9b3f6839bb66370fc.png)
5,启动apache
#systemctl start httpd
#systemctl enable httpd
登录phpldapadmin界面
http://${IP}:${port}/phpldapadmin
![](https://i-blog.csdnimg.cn/blog_migrate/62d735bccc70b75335658a775f978873.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ac60df9c3a3c38613ad87b7db0ee47c9.png)