# CentOS 7 搭建 LDAP 目录服务
1. 服务介绍
LDAP(Lightweight Directory Access Protocol)用于集中保存用户、用户组、组织结构和认证属性。企业可让 Linux 登录、Apache、Samba、邮件系统等服务共用一套账号目录,减少多台服务器重复创建账号的问题。本实验使用 OpenLDAP 创建 dc=chinaskills,dc=cn 目录树,并添加组织单元、用户和用户组。
2. 准备运行环境
• 操作系统:CentOS 7.x。
• 服务器主机名:ldap 或按实验拓扑设置。
• 操作账号:root 或具备 sudo 权限的管理员账号。
• 网络要求:服务器使用固定 IP,客户端能够解析并访问 LDAP 服务器。
• 软件要求:YUM 软件源可用。
• 时间要求:服务端和客户端时间保持一致,后续启用 TLS 或集中认证时可减少证书和认证异常。
bash
cat /etc/centos-release
hostnamectl
ip addr
ip route
getent hosts ldap
3. 相关知识
• LDAP 默认使用 TCP 389;LDAPS 默认使用 TCP 636。
• DN 是条目的完整名称,例如 uid=zsuser,ou=users,dc=chinaskills,dc=cn。
• Base DN 是目录树查询起点,本实验为 dc=chinaskills,dc=cn。
• 管理员 DN 为 cn=admin,dc=chinaskills,dc=cn。
• LDIF 是 LDAP 条目导入格式。属性名和属性值之间必须保留冒号及空格,多个条目之间建议留空行。
• slappasswd 用于生成 SSHA 密码摘要;不要把管理员明文密码直接写入公开配置。
• 不建议直接随意修改 slapd.d 中的动态配置。修改前先备份,并使用 slaptest 检查配置。
• 查询失败时重点检查 Base DN、绑定 DN、密码、访问控制、服务监听和日志。
4. 实验步骤
4.1 安装并启动 OpenLDAP
bash
yum install -y openldap-servers openldap-clients
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap /var/lib/ldap/DB_CONFIG
systemctl enable --now slapd
systemctl status slapd --no-pager
4.2 生成管理员密码摘要
bash
slappasswd
输入两次管理员密码,保存生成的 {SSHA} 开头摘要。

4.3 配置客户端默认查询参数
编辑 /etc/openldap/ldap.conf:
bash
vi /etc/openldap/ldap.conf
示例:
text
BASE dc=chinaskills,dc=cn
URI ldap://127.0.0.1

4.4 配置数据库后缀和管理员 DN
修改前备份动态配置目录:
bash
cp -a /etc/openldap/slapd.d /etc/openldap/slapd.d.bak
vi '/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif'
按实验目录规划检查或修改以下属性:
text
olcSuffix: dc=chinaskills,dc=cn
olcRootDN: cn=admin,dc=chinaskills,dc=cn
olcRootPW: {SSHA}替换为slappasswd生成的摘要

4.5 配置监控数据库访问
bash
vi '/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif'
确认监控规则中的管理员 DN 与本实验一致。

检查配置并重启服务:
bash
slaptest -u
chown -R ldap:ldap /etc/openldap/slapd.d /var/lib/ldap
systemctl restart slapd
4.6 导入常用 Schema
bash
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
若返回 Already exists,说明对应 Schema 已导入,不要重复处理。
4.7 创建根域条目
创建 rootdn.ldif:
bash
cat > rootdn.ldif <<'EOF'
dn: dc=chinaskills,dc=cn
objectClass: top
objectClass: dcObject
objectClass: organization
o: chinaskills
dc: chinaskills
EOF
导入根域:
bash
ldapadd -x -D 'cn=admin,dc=chinaskills,dc=cn' -W -f rootdn.ldif

4.8 创建用户和用户组组织单元
创建 group.ldif:
bash
cat > group.ldif <<'EOF'
dn: ou=users,dc=chinaskills,dc=cn
objectClass: organizationalUnit
ou: users
dn: ou=group,dc=chinaskills,dc=cn
objectClass: organizationalUnit
ou: group
EOF
导入组织单元:
bash
ldapadd -x -D 'cn=admin,dc=chinaskills,dc=cn' -W -f group.ldif
4.9 创建 LDAP 用户
以 zsuser 为例创建 zsuser.ldif:
bash
cat > zsuser.ldif <<'EOF'
dn: uid=zsuser,ou=users,dc=chinaskills,dc=cn
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
uid: zsuser
cn: zsuser
userPassword: ChinaSkill21
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0
loginShell: /bin/bash
uidNumber: 1008
gidNumber: 1008
homeDirectory: /home/zsuser
gecos: zsuser
EOF
导入用户:
bash
ldapadd -x -D 'cn=admin,dc=chinaskills,dc=cn' -W -f zsuser.ldif
按相同格式创建 lsusr 和 wuusr,确保每个用户的 uidNumber 唯一,且 homeDirectory 与用户名对应:
text
lsusr: uidNumber 1009, gidNumber 1009, homeDirectory /home/lsusr
wuusr: uidNumber 1010, gidNumber 1010, homeDirectory /home/wuusr
4.10 创建用户组并添加成员
创建 download.ldif:
bash
cat > download.ldif <<'EOF'
dn: cn=download,ou=group,dc=chinaskills,dc=cn
objectClass: posixGroup
gidNumber: 10001
cn: download
memberUid: zsuser
memberUid: lsusr
memberUid: wuusr
EOF
导入用户组:
bash
ldapadd -x -D 'cn=admin,dc=chinaskills,dc=cn' -W -f download.ldif
如需让 Apache 使用 LDAP 认证,可安装对应模块:
bash
yum install -y mod_ldap
5. 验证结果
5.1 服务端验证
bash
systemctl is-active slapd
ss -lntp | grep ':389'
slaptest -u
ldapsearch -x -H ldap://127.0.0.1 -b 'dc=chinaskills,dc=cn' -LLL dn
ldapsearch -x -H ldap://127.0.0.1 -D 'cn=admin,dc=chinaskills,dc=cn' -W -b 'ou=users,dc=chinaskills,dc=cn' '(objectClass=posixAccount)' uid uidNumber gidNumber homeDirectory
ldapsearch -x -H ldap://127.0.0.1 -D 'cn=admin,dc=chinaskills,dc=cn' -W -b 'ou=group,dc=chinaskills,dc=cn' '(cn=download)' memberUid
journalctl -u slapd -n 50 --no-pager
5.2 客户端验证
客户端安装查询工具后执行:
bash
yum install -y openldap-clients
ldapsearch -x -H ldap://LDAP服务器IP -b 'dc=chinaskills,dc=cn' -LLL dn
ldapwhoami -x -H ldap://LDAP服务器IP -D 'cn=admin,dc=chinaskills,dc=cn' -W
能够查询根域、用户和 download 用户组,ldapwhoami 返回管理员 DN,服务端 389 端口正常监听,说明 LDAP 目录服务配置成功。
6. 常见故障排查
• Invalid credentials (49):检查绑定 DN 和密码是否正确。
• No such object (32):检查查询 Base DN 是否已经导入。
• Can't contact LDAP server (-1):检查 slapd 状态、389 端口、防火墙和服务器地址。
• Schema 导入失败:检查是否重复导入,以及 LDIF 路径是否正确。
• 用户无法登录:LDAP 查询成功不等于系统已启用 LDAP 登录,还需配置 SSSD 或 NSS/PAM。