LDAP 的全称是 Lightweight Directory Access Protocol,即轻量级目录访问协议,它是一种开放的、厂商无关的、行业标准的应用协议,用于在 IP (Internet Protocol) 网络上访问和维护分布式目录信息服务。LDAP 的一个常见用途是提供一个存储用户名和密码的中心位置,允许不同的应用程序和服务连接到 LDAP 服务器来验证用户。具体到实际情况,一些公司在员工入职的时候会给其发放一个账号,员工可以用该账号登录所有的内部通用系统,比如:GitLab,Jenkins 和 jira 等,到员工离职的时候,原先发放的账号将一次性被回收。
能提供 LDAP 服务的开源项目有很多,这里选用较为成熟的开源服务器 OpenLDAP,下面介绍如何在CentOS 安装和配置 OpenLDAP。
安装 OpenLDAP 相关的软件
在命令行输入下面的命令去安装 OpenLDAP 服务器和客户端:
yum -y install openldap openldap-servers openldap-clients
启动服务
启动 OpenLDAP 服务并将其设置到开机启动
bash
systemctl start slapd.service
systemctl enable slapd.service
运行上述命令将得到如下图所示的结果:

允许外部连接
css
firewall-cmd --permanent --add-port=389/tcp --add-port=389/udp
firewall-cmd --reload
setsebool -P allow_ypbind=1 authlogin_nsswitch_use_ldap=1
setsebool -P httpd_can_connect_ldap on
编辑默认配置
在使用 OpenLDAP 服务器之前,必须确保服务器配置正确。因此,必须检查写在 ldap.conf 文件中的默认配置。
- 打开 ldap.conf file
bash
vim /etc/openldap/ldap.conf
- 取消以下内容的注释
shell
#BASE dc=example,dc=com
#URI ldap://ldap.example.com ldap://ldap-master.example.com:666
- 编辑 BASE 和 URI 字段,如下
ini
BASE dc=ldap,dc=heyudesign,dc=cn
URI http://121.153.198.133
将 BASE 替换为你的域名,将 URI 替换为你的完整域名或 LDAP 服务器的 IP 地址。
配置 root 用户
如果要在 LDAP 环境下执行管理任务,那么必须修改 LDAP 的 root 用户。另外必须创建 LDIF 文件,其中包含你希望在 LDAP 服务器上更改的内容,然后用 ldapadd 工具将该 LDIF 文件应用到服务器,以更改 OpenLDAP 中的内容。
下面的 9 个步骤修改 LDAP 默认的 root 用户,使其能够管理服务器中的所有条目:
-
在你选择的目录中创建一个 LDIF 文件。
vim rootpw.ldif
-
为 root 用户创建秘密
slappasswd -s 12345678
-s 后的参数可以替换成其他密码,上述命令将输出类似 {SSHA}pbGNe3ILso3VgHdLLZbFArwsZ3zr5t5q 的 hash 值。
- 往第一步创建的 LDIF 文件填写内容,如下
makefile
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}pbGNe3ILso3VgHdLLZbFArwsZ3zr5t5q
- 将 LDIF 文件应用到服务器
arduino
ldapadd -Y EXTERNAL -H ldapi:/// -f rootpw.ldif
运行上述命令得到的结果如下图所示

- 导入 LDAP 基本 schemas
arduino
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/openldap.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
- 配置对 LDAP 服务器的访问,并将 Manager 用户添加到服务器
创建 manager.ldif 文件,写入下面的内容
vbnet
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=ldap,dc=heyudesign,dc=cn" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=ldap,dc=heyudesign,dc=cn
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=ldap,dc=heyudesign,dc=cn
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}pbGNe3ILso3VgHdLLZbFArwsZ3zr5t5q
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=ldap,dc=heyudesign,dc=cn" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=ldap,dc=heyudesign,dc=cn" write by * read
- 将 olcRootPW 对应的值替换成第二步用 slappasswd 输出的值
- 将 dc=ldap,dc=heyudesign,dc=cn 替换成实际的 BASE DN
- 应用manager.ldif
arduino
ldapmodify -Y EXTERNAL -H ldapi:/// -f manager.ldif
运行上述命令得到的结果如下图所示

- 创建组
创建一个名为 org.ldif 的文件,写入下面的内容
makefile
dn: dc=ldap,dc=heyudesign,dc=cn
objectClass: top
objectClass: dcObject
objectClass: organization
o: ldap Organization
dc: ldap
dn: cn=Manager,dc=ldap,dc=heyudesign,dc=cn
objectClass: organizationalRole
cn: Manager
description: LDAP Manager
dn: ou=rpausers,dc=ldap,dc=heyudesign,dc=cn
objectClass: organizationalUnit
ou: rpaUsers
- 将 dc=ldap,dc=heyudesign,dc=cn 替换成实际的 BASE DN
- 将 ldap 和 rpaUsers 替换成你要想的组名
- 应用 org.ldif
ini
ldapadd -x -D cn=Manager,dc=ldap,dc=heyudesign,dc=cn -W -f org.ldif
根据提示输入 root 用户的密码,一切顺利将得到下图所示的结果

安装管理工具
接下来安装 PHPLDAPAdmin,用它管理 LDAP,这里涉及5个步骤
-
安装 PHPLDAPAdmin
yum install -y phpldapadmin
-
修改 phpldapadmin.conf
bash
vim /etc/httpd/conf.d/phpldapadmin.conf
将 phpldapadmin.conf 文件中的 Require local 改成 Require all granted,其目的是开启外网访问
- 修改 config.php
arduino
vim /etc/phpldapadmin/config.php
取消以下内容的注释
php
$config->custom->appearance['timezone'] = 'Australia/Melbourne';
// 这里写你的Base DN
$servers->setValue('server','base',array('dc=ldap,dc=heyudesign,dc=cn'));
$servers->setValue('server','host','127.0.0.1');
$servers->setValue('server','port',389);
$servers->setValue('login','attr','dn');
$servers->setValue('appearance','show_create',true);
$servers->setValue('login','anon_bind',false); // 不允许匿名登录
注释以下内容
bash
$servers->setValue('login','attr','uid');
- 启动 httpd 服务
bash
systemctl start httpd
systemctl enable httpd
- 在本地浏览器访问 http://server_ip/phpldapadmin/, 将得到下图所示的内容

- 登录之后,界面的左侧将显示之前用 org.ldif 创建的组,如下图所示

你可以单击上图中显示的创建一个子条目按钮,新建后的条目将显示在左侧列表。上图显示了新增的子条目,一个是用户(he yu),另一个是用户所属的组(user)。
