OpenLDAP部署
# 一、前置环境
- 系统: Centos7.8
- OpenLDAP: 2.4.44
# 二、安装部署软件包
openldap
安装其实非常简单,只是使用yum命令就可以完成安装操作。
# 2.1 yum安装
执行yum之后 会自动创建一个
ldap
的用户
yum install -y openldap openldap-clients openldap-servers compat-openldap openldap-devel
# 2.2 启动
监听端口389
systemctl enable slapd
systemctl start slapd
2
# 三、openldap配置
从OpenLDAP 2.4 版本开始,官方推荐使用动态配置(cn=config)及在/etc/openldap/slapd.d
目录下的cn=config
文件夹内而不是传统的静态配置文件(slapd.conf)。动态配置将数据库配置保存在 LDAP 数据库中,使用动态配置允许管理员在运行时修改服务器配置,而无需重启服务,以便更轻松地进行管理和修改。
# 3.1 常用管理命令
查看当前配置,列出 cn=config 数据库中的所有配置项及其 DN
[root@iZuf6e7po5t1w13q6mtt4lZ ~]# ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
dn: cn=config
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: olcDatabase={-1}frontend,cn=config
dn: olcDatabase={0}config,cn=config
dn: olcDatabase={1}monitor,cn=config
dn: olcDatabase={2}hdb,cn=config
2
3
4
5
6
7
8
9
10
11
12
13
14
添加配置项,此时我们需要先创建一个以
.ldif
为后缀的文件,然后执行修改命名,这样会动态的把配置新增至cn=config
目录下指定的配置文件中
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f your_ldif_file.ldif
修改配置
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f your_ldif_file.ldif
删除配置
ldapdelete -Q -Y EXTERNAL -H ldapi:/// dn_of_entry_to_delete
# 3.2 配置管理员密码
生成管理员密码hash值
# 管理员密码
[root@iZuf6e7po5t1w13q6mtt4lZ ~]# slappasswd -s 123456
{SSHA}EP+CWjDM2mwqLdoDvXtAU7OZ+vMvTatE
2
3
创建配置,上面我们说过所有的配置 都需要动态修改,因此我们需要先创建一个后缀为
.ldif
的文件 然后应用
# vim adminPass.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}EP+CWjDM2mwqLdoDvXtAU7OZ+vMvTatE
2
3
4
5
参数解释
dn: olcDatabase={0}config,cn=config
: 这是要修改的配置项的 DN(Distinguished Name),表示是cn=config
数据库下(/etc/openldap/slapd.d/cn\=config
目录) 的olcDatabase={0}config
配置。这个配置项指的是cn=config
数据库的配置,也称为config
配置。changetype: modify
: 表示此 LDIF 文件中包含要进行的修改操作。add: olcRootPW
: 表示要添加一个新的属性olcRootPW
(超级用户密码)。olcRootPW: {SSHA}kUhPHG2ffoZKzwl/pUxQg6W+WaFwpjQ/
: 这是超级用户密码的哈希值。在这个例子中,密码的哈希值是 {SSHA}kUhPHG2ffoZKzwl/pUxQg6W+WaFwpjQ/,它是一个基于 SSHA 算法的密码哈希值。
执行命令,执行之后,会在
olcDatabase={0}config
中新增olcRootPW
配置
[root@iZuf6e7po5t1w13q6mtt4lZ ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f adminPass.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"
2
3
4
5
# 3.3 导入默认schema
在 OpenLDAP
中,自带了一些常用的基本架构(Schema),以支持通用的 LDAP 对象类和属性。这些自带的 Schema 可以在安装 OpenLDAP 后直接使用,无需额外的配置或安装,这些目录位于/etc/openldap/schema/
目录下。
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
2
3
4
5
6
7
8
9
10
11
12
常用说明:
core
: 这是 OpenLDAP 的核心架构,包含了基本的 LDAP 对象类和属性定义。它定义了 LDAP 的基本元素,如 "dc"(域组件)和 "ou"(组织单位)等。这个架构会在安装 OpenLDAP 时自动加载。cosine
: 这是 Internet 常见架构之一,它定义了一些通用的对象类和属性,如 "inetOrgPerson"(Internet 组织人员)和 "mail"(电子邮件地址)等。inetorgperson
: 这个架构定义了 "inetOrgPerson" 对象类,它扩展了 "organizationalPerson",并增加了一些用于互联网组织的属性,如邮件地址和电话号码等。nis
: 这是 Network Information Service (NIS) 架构,用于支持 UNIX/Linux 系统中的 NIS 映射。它定义了一些 NIS 相关的对象类和属性,如 "posixAccount"(UNIX 账户)和 "posixGroup"(UNIX 用户组)等。collective
: 这个架构定义了 "collectiveAttribute" 对象类,它用于在集体条目中存储共享属性。集体属性不会直接应用于条目本身,而是在查询时进行合并展示。
# 3.4 管理域配置
管理域是指用于存储配置和管理数据的特定域(DIT,Directory Information Tree)。这个域通常被称为配置数据库(cn=config)或管理数据库,它用于存储 OpenLDAP 服务器的运行配置和其他管理信息。配置数据库是一个特殊的数据库,使用动态配置方式,以 LDIF(LDAP Data Interchange Format)的形式存储配置信息。
准备域名: ldap.tbchip.com,此域名作为根域 ,编辑配置文件时注意空行及缩进
# vim domain.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=ldap,dc=tbchip,dc=com" read
by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=ldap,dc=tbchip,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=ldap,dc=tbchip,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}kUhPHG2ffoZKzwl/pUxQg6W+WaFwpjQ/
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
# 访问控制规则 只允许登录的用户进行修改自己密码
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=ldap01,dc=pwb,dc=com" write by anonymous auth by self write by * none
# 访问控制规则 允许所有用户 对根目录有读操作权限
olcAccess: {1}to dn.base="" by * read
# 访问控制规则 允许管理员admin用户有操作写权限
olcAccess: {2}to * by dn="cn=admin,dc=ldap,dc=tbchip,dc=com" write by * read
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
参数说明
dn: olcDatabase={2}hdb,cn=config
: 这是要修改的配置项的 DN(Distinguished Name),表示是 cn=config 数据库下的 "hdb" 后端数据库配置。这个配置项指的是hdb
后端数据库的配置。changetype: modify
: 表示此 LDIF 文件中包含要进行的修改操作。replace: olcSuffix
: 表示要替换(修改) "olcSuffix" 属性的值。olcSuffix: dc=ldap,dc=tbchip,dc=com
: 这是要将根域(Suffix)修改为的新值。在这个例子中,根域被修改为 "dc=ldap,dc=tbchip,dc=com"。olcAccess
:定义了监视数据库的访问控制规则。
执行命令,应用新配置
[root@iZuf6e7po5t1w13q6mtt4lZ ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f domain.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"
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"
2
3
4
5
6
7
8
9
10
11
12
13
# 3.5 启用memberof功能
memberof
功能是 OpenLDAP
中的一个重要模块,它用于处理组成员关系。它提供了一种方便的方法来管理用户和组之间的关系,使得管理用户组和组成员更加简单和高效。
编辑memberof配置文件,开启memberof支持并新增用户支持memberof配置
dn: cn=module{0},cn=config
cn: module{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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
配置说明
# 加载 "memberof" 模块
dn: cn=module{0},cn=config
# "memberof" 模块的通用名称
cn: module{0}
# 模块列表
objectClass: olcModuleList
# 条目的最上级
objectclass: top
# 加载 "memberof" 模块的配置。memberof.la 是模块的库文件
olcModuleload: memberof.la
# 指定 "memberof" 模块的路径
olcModulePath: /usr/lib64/openldap
# 配置 "memberof" 功能的 overlay,它会添加在 "hdb" 后端数据库上
dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
# objectClass 表示 overlay 配置条目 其实就是"memberof" 相关的配置
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
# "memberof" 功能的具体配置选项
# ignore 忽略悬挂成员关系,当删除组或用户时,不会检查并更新悬挂的成员关系。
olcMemberOfDangling: ignore
# TRUE 开启对成员关系的引用完整性检查,确保 member 和 memberOf 属性保持同步。
olcMemberOfRefInt: TRUE
# 指定组对象类为 "groupOfUniqueNames",表示组使用的对象类是 "groupOfUniqueNames"。
olcMemberOfGroupOC: groupOfUniqueNames
# 指定成员属性为 "uniqueMember",表示用户条目中使用 "uniqueMember" 属性作为成员。
olcMemberOfMemberAD: uniqueMember
# 指定 "memberOf" 属性,表示组条目中使用 "memberOf" 属性存储成员关系。
olcMemberOfMemberOfAD: memberOf
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
加载refint模块,在 LDAP 中,"refint" 模块通过确保 "member" 和 "memberOf" 属性之间的引用关系保持一致,来实现引用完整性检查。
# vim mod-refint.ldif
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
2
3
4
5
"refint" 模块的配置项,以下配置会确保 "memberof"、"uniqueMember"、"manager" 和 "owner" 属性之间的引用关系始终保持一致。如果一个属性的值发生了更改或删除,"refint" 模块会自动更新相关引用,以保持数据的完整性。
# vim add-refint.ldif
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember manager owner
2
3
4
5
6
7
8
依次执行下面命令,加载配置
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f memberof.ldif
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f mod-refint.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add-refint.ldif
2
3
经过以上配置,ldap的配置就算修改完成,接下来我们来使用即可
# 四、创建组织
# 4.1 组织
组织是 LDAP 目录结构中的最顶层单位。它通常代表一个实际的组织、公司或机构,如一个大学、企业、政府机构等。组织在 LDAP 中被表示为 "o"(organization)属性的值。组织是一个可选的顶层条目,它用于对目录进行逻辑划分和命名空间的管理。
创建 一个losinx组织,并在其下创建一个 admin 的组织角色
# losin-ou.ldif
dn: dc=ldap,dc=tbchip,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: losinx
dc: ldap
dn: cn=admin,dc=ldap,dc=tbchip,dc=com
objectClass: organizationalRole
cn: admin
2
3
4
5
6
7
8
9
10
11
执行命令 创建组织,需要注意
dc=ldap,dc=tbchip,dc=com
配置要对应自己的根域
[root@iZuf6e7po5t1w13q6mtt4lZ ~]# ldapadd -x -D cn=admin,dc=ldap,dc=tbchip,dc=com -W -f losinx-ou.ldif
Enter LDAP Password:
adding new entry "dc=ldap,dc=tbchip,dc=com"
adding new entry "cn=admin,dc=ldap,dc=tbchip,dc=com"
2
3
4
5
# 4.2 组织单元
组织单元是 LDAP 目录结构中的一个较低层级的单位。它用于更细粒度地划分和组织目录中的条目。组织单元在 LDAP 中被表示为 "ou"(organizational unit)属性的值。组织单元是一个可选的条目,用于更好地组织和管理目录中的条目。
创建Groups和Users组织单元
dn: ou=Groups,dc=ldap,dc=tbchip,dc=com
objectClass: organizationalUnit
ou: Groups
dn: ou=Users,dc=ldap,dc=tbchip,dc=com
objectClass: organizationalRole
cn: Users
2
3
4
5
6
7
执行命令
[root@iZuf6e7po5t1w13q6mtt4lZ ~]# ldapadd -x -D cn=admin,dc=ldap,dc=tbchip,dc=com -W -f losinx-ou.ldif
Enter LDAP Password:
adding new entry "ou=Groups,dc=ldap,dc=tbchip,dc=com"
adding new entry "ou=Users,dc=ldap,dc=tbchip,dc=com"
2
3
4
5
说明
通过以上的所有步骤,我们就设置好了一个 LDAP 目录树:其中dc=ldap,dc=tbchip,dc=com
是该树的根节点,其下有一个管理域 cn=admin,dc=ldap,dc=tbchip,dc=com
和两个组织单元 ou=Users,dc=ldap,dc=tbchip,dc=com
及 ou=Groups,dc=ldap,dc=tbchip,dc=com
# 五、用户及组管理
# 5.1 创建用户
为用户生成密码hash值
[root@iZuf6e7po5t1w13q6mtt4lZ ~]# slappasswd -s 123456
{SSHA}Iu1xMEVDhljSoipHz3ovsIxfirdXmGAm
2
编辑用户文件,添加一个tchua的用户,在名为Public的ou下
# vim tchua-user.ldif
dn: cn=tchua,ou=Users,dc=ldap,dc=tbchip,dc=com
objectClass: inetOrgPerson
cn: tchua
sn: Hua
userPassword: {SSHA}Iu1xMEVDhljSoipHz3ovsIxfirdXmGAm
2
3
4
5
6
执行命令添加用户
[root@iZuf6e7po5t1w13q6mtt4lZ ~]# ldapadd -x -D "cn=admin,dc=ldap,dc=tbchip,dc=com" -W -f tchua-user.ldif
Enter LDAP Password:
adding new entry "cn=tchua,ou=Users,dc=ldap,dc=tbchip,dc=com"
2
3
# 5.2 创建组
编辑创建组文件,添加一个用户组名为wms的cn,在名为Public的ou下,并把上面的tchua用户加如该组
# vim wms-group.ldif
dn: cn=wms,ou=Groups,dc=ldap,dc=tbchip,dc=com
changetype: add
add: cn
cn: wms
objectClass: groupOfUniqueNames
uniqueMember: cn=tchua,ou=Users,dc=ldap,dc=tbchip,dc=com
2
3
4
5
6
7
# 六、图形化
OpenLDAP
我们可以把它当做数据库,没有酷炫的图形界面的,这种反人类的设计真的不是给人用的,虽然也有图形化的工具,但是也丑的不行且不好用,接下来我们介绍下使用最多的phpLDAPadmin
图形化的工具。
# 6.1 yum安装
yum install -y phpldapadmin
# 6.2 修改配置
上面安装后,会使用apache服务提供web服务,我们需要修改下相关配置
# vim /etc/httpd/conf.d/phpldapadmin.conf
<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted
</IfModule>
2
3
4
5
# 6.3 修改登录配置
# 398行,默认是使用uid进行登录,我这里改为cn,也就是用户名
$servers->setValue('login','attr','cn');
# 460行,关闭匿名登录,否则任何人都可以直接匿名登录查看所有人的信息
# 打开注释,修改为false
$servers->setValue('login','anon_bind',false);
# 519行,设置用户属性的唯一性,这里我将cn,sn加上了,以确保用户名的唯一性
$servers->setValue('unique','attrs',array('mail','uid','uidNumber','cn','sn'));
2
3
4
5
6
7
8
9
# 6.4 启动访问
systemctl enable httpd
systemctl start httpd
2
浏览器输入: 服务器IP/ldapadmin,使用开始创建的admin/123456
登录即可
# 6.5 创建用户
- 创建组
tchua001
- 创建用户