Debian OpenLDAP(slapd)目录服务:Base DN、用户组与查询验证
1. 服务介绍
OpenLDAP 是基于 LDAP 协议的目录服务,用于集中存储用户、组织、组和认证相关信息。Samba、Apache、邮件系统、Linux 登录和企业应用可以通过 LDAP 统一查询账号,减少多套本地账号带来的维护成本。
本文在 Debian 上使用 slapd 创建 chinaskills.cn 目录树,建立用户组 ldsgp 和 usr01、usr02、usr03 三个用户,并用 ldapsearch、ldapwhoami、slapcat 和日志命令验证目录条目、认证和服务状态。
2. 准备运行环境
• 操作系统:Debian Linux,使用 systemd 管理 slapd。
• 权限:root 或具备 sudo 权限的管理员账号。
• 主机名:LDAP 服务端使用稳定主机名和 DNS 解析;客户端连接时不要依赖临时 IP。
• 目录参数:本文使用 Base DN 为 dc=chinaskills,dc=cn,管理员 DN 为 cn=admin,dc=chinaskills,dc=cn。
• 网络:LDAP 使用 TCP 389;启用 LDAPS 后使用 TCP 636。只向需要访问的客户端网段开放端口。
• 工具:服务端安装 slapd、ldap-utils;客户端只安装 ldap-utils 即可执行查询和认证测试。
• 密码:管理员密码和用户密码只在交互提示或受保护的密码哈希中使用,不写入公开文章。
• 备份:修改目录结构、ACL 或 TLS 配置前,先使用 slapcat 导出目录数据和配置备份。
3. 相关知识与注意点
• LDAP 目录以树形 DN 组织数据。Base DN 决定搜索范围,条目的 DN 必须在目录树中唯一。
• slapd 是 OpenLDAP 服务进程,ldapadd、ldapmodify、ldapsearch 和 ldapwhoami 是常用客户端工具。
• 用户条目通常使用 inetOrgPerson;需要映射 Linux UID 时,再增加 posixAccount、uidNumber、gidNumber、homeDirectory 和 loginShell。
• 组条目可以使用 posixGroup 与 memberUid;应用使用 groupOfNames 时,应改用 member 属性并提供成员 DN。
• LDIF 文件用于批量增加和修改条目。导入前检查空格、DN、objectClass 和属性名称,失败后查看 LDAP 返回码。
• 明文 LDAP 适合隔离实验。生产环境应启用 StartTLS 或 LDAPS,保护密码和目录查询内容。
• LDAP 认证成功不代表 Samba、Apache 或 PAM 已接入。接入后还要分别验证 NSS/PAM、应用配置、权限和日志。
• ACL 决定谁能读取、修改目录。管理员 DN 不应作为普通应用账号长期使用,生产环境应创建最小权限服务账号。
4. 实验步骤
4.1 安装 OpenLDAP 服务和工具
在 LDAP 服务端执行:
apt update
apt install -y slapd ldap-utils
systemctl enable --now slapd
systemctl status slapd --no-pager
如果安装过程没有完成目录参数配置,执行交互式重新配置:
dpkg-reconfigure slapd
配置时使用实际域名和组织名称:
• DNS domain name:chinaskills.cn
• Organization name:ChinaSkills
• Directory administrator DN:默认由 slapd 根据域名生成
• Database backend:按 Debian 默认 MDB
• Purge database when slapd is removed:按备份策略选择
• Move old database:首次部署按实际情况选择
确认根 DN:
ldapsearch -x -LLL -H ldap://127.0.0.1 -b '' -s base namingContexts
4.2 备份目录数据和配置
修改前导出当前目录:
mkdir -p /root/ldap-backup
slapcat -n 0 -l /root/ldap-backup/config.ldif
slapcat -n 1 -l /root/ldap-backup/data.ldif
ls -lh /root/ldap-backup
不同 Debian 环境的数据库编号可能不同。用 slapcat -b 或配置内容确认目标数据库,不能盲目覆盖备份文件。
4.3 创建组织单位和用户组
创建 LDIF 文件:
vim /root/ldap-base.ldif
写入目录条目。密码属性使用占位哈希;先用 slappasswd 生成真实哈希,不把真实密码写入文件:
dn: ou=People,dc=chinaskills,dc=cn
objectClass: organizationalUnit
ou: People
dn: ou=Groups,dc=chinaskills,dc=cn
objectClass: organizationalUnit
ou: Groups
dn: cn=ldsgp,ou=Groups,dc=chinaskills,dc=cn
objectClass: posixGroup
cn: ldsgp
gidNumber: 10000
memberUid: usr01
memberUid: usr02
memberUid: usr03
生成哈希并导入组织单位和组:
slappasswd
ldapadd -x -D 'cn=admin,dc=chinaskills,dc=cn' -W -f /root/ldap-base.ldif
导入完成后查询组:
ldapsearch -x -LLL -H ldap://127.0.0.1 \
-D 'cn=admin,dc=chinaskills,dc=cn' -W \
-b 'ou=Groups,dc=chinaskills,dc=cn' \
'(objectClass=posixGroup)' cn gidNumber memberUid
4.4 创建 usr01、usr02、usr03
为每个账号准备唯一 uidNumber。示例只展示 usr01,密码字段使用 slappasswd 生成的哈希替换 HASH_VALUE:
dn: uid=usr01,ou=People,dc=chinaskills,dc=cn
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: usr01
cn: usr01
sn: User01
uidNumber: 11001
gidNumber: 10000
homeDirectory: /home/usr01
loginShell: /bin/bash
userPassword: HASH_VALUE
usr02、usr03 使用相同属性结构,分别替换 uid、cn、sn、uidNumber 和密码哈希。将账号条目保存为 /root/ldap-users.ldif,然后导入:
ldapadd -x -D 'cn=admin,dc=chinaskills,dc=cn' -W -f /root/ldap-users.ldif
查询用户:
ldapsearch -x -LLL -H ldap://127.0.0.1 \
-b 'ou=People,dc=chinaskills,dc=cn' \
'(&(objectClass=posixAccount)(uid=*))' \
uid cn uidNumber gidNumber homeDirectory
4.5 修改和删除条目
修改条目使用 LDIF,避免直接编辑数据库文件:
vim /root/ldap-modify.ldif
dn: uid=usr01,ou=People,dc=chinaskills,dc=cn
changetype: modify
replace: loginShell
loginShell: /bin/bash
执行修改并复查:
ldapmodify -x -D 'cn=admin,dc=chinaskills,dc=cn' -W -f /root/ldap-modify.ldif
ldapsearch -x -LLL -b 'uid=usr01,ou=People,dc=chinaskills,dc=cn' loginShell
删除条目前先确认 DN 和业务依赖:
ldapdelete -x -D 'cn=admin,dc=chinaskills,dc=cn' -W \
'uid=usr01,ou=People,dc=chinaskills,dc=cn'
5. 验证与排错
5.1 服务、端口和配置
systemctl is-active slapd
systemctl status slapd --no-pager
ss -lntp | grep -E ':389|:636'
slapcat -n 0 >/dev/null
journalctl -u slapd -n 80 --no-pager
5.2 目录树和用户组
ldapsearch -x -LLL -H ldap://127.0.0.1 \
-b 'dc=chinaskills,dc=cn' \
'(objectClass=*)' dn | head -n 40
ldapsearch -x -LLL -H ldap://127.0.0.1 \
-b 'ou=Groups,dc=chinaskills,dc=cn' \
'(cn=ldsgp)' cn gidNumber memberUid
ldapsearch -x -LLL -H ldap://127.0.0.1 \
-b 'ou=People,dc=chinaskills,dc=cn' \
'(|(uid=usr01)(uid=usr02)(uid=usr03))' uid cn
5.3 管理员和用户认证
管理员认证:
ldapwhoami -x \
-D 'cn=admin,dc=chinaskills,dc=cn' -W
用户认证:
ldapwhoami -x \
-D 'uid=usr01,ou=People,dc=chinaskills,dc=cn' -W
若认证失败,按顺序检查 DN 拼写、密码哈希、Base DN、ACL 和 slapd 日志。不要用 getent passwd 判断 LDAP 是否正常,除非已经完成 NSS/PAM 接入。
5.4 LDAP 客户端查询
在客户端安装工具并指定服务端:
apt update
apt install -y ldap-utils
ldapsearch -x -LLL \
-H ldap://LDAP_SERVER_IP \
-b 'dc=chinaskills,dc=cn' \
'(uid=usr01)' uid cn
如果改用 StartTLS 或 LDAPS,使用实际证书和 CA 配置后再验证:
ldapsearch -x -ZZ -H ldap://LDAP_SERVER_IP \
-b 'dc=chinaskills,dc=cn' '(objectClass=*)' dn
5.5 Samba、Apache 和 PAM 接入边界
LDAP 服务本身正常,只代表目录可查询、账号可认证。接入其他服务后分别验证:
testparm -s
apachectl configtest
systemctl status smbd apache2 --no-pager
journalctl -b --no-pager | grep -Ei 'ldap|pam|nss' | tail -n 50
Samba、Apache 和 PAM 的具体模块、绑定账号、TLS 信任和 ACL 要按各自服务配置,不能只凭 ldapsearch 成功判断全部接入完成。
6. 小结
OpenLDAP 配置链路是:安装 slapd、确定 Base DN、创建组织单位、创建组和用户、设置 ACL、用 ldapsearch 查询、用 ldapwhoami 验证认证,再分别验证 Samba、Apache 或 PAM 接入。
排错时先看服务状态和 TCP 389/636,再看 Base DN、条目 DN、ACL、密码哈希和日志。生产环境应使用 TLS、最小权限服务账号、备份和审计;真实密码、固定公网地址和密钥不应写入发布文档。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_44524357/article/details/167080464



