qetfw头像
关注

Debian OpenLDAP(slapd)目录服务:Base DN、用户组与查询验证

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

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--