OpenLDAP 目录服务部署与命令详解

在 Ubuntu 22.04 上从零到一部署 OpenLDAP:安装 slapd/ldap-utils、重配域 dc=example,dc=com 与 admin 口令、启停 systemd 服务、用 ldapadd 建组织单元与用户、ldapmodify 改属性、ldapsearch 查询、ldapdelete 删除、slapcat 导出,并给出完整的 LDAP CLI 速查。slapd 2.5.20 实测

身份认证身份认证LDAP2026/10/08

OpenLDAP 目录服务部署与命令详解

目标:在 Ubuntu 22.04 上从零到一部署 OpenLDAP(slapd),完成域配置、组织结构与用户管理,掌握 ldapadd、ldapmodify、ldapsearch、ldapdelete、slapcat 等核心命令。本文在 Ubuntu 22.04(OpenLDAP 2.5.20)真实实测,命令与回显逐行来自实测。

环境信息

  • 系统:Ubuntu 22.04 LTS(x86_64)
  • 软件:slapd 2.5.20+dfsg-0ubuntu0.22.04.1、LDAP 库 OpenLDAP 20520
  • 管理目录基准 DN(Base DN):dc=example,dc=com
  • 目录管理员:cn=admin,dc=example,dc=com(示例口令 q1w2e3r4)
  • 二进制:/usr/sbin/slapd、/usr/bin/ldapadd、/usr/bin/ldapsearch、/usr/bin/ldapmodify、/usr/bin/ldapdelete、/usr/sbin/slapcat
  • 配置目录:/etc/ldap/slapd.d/cn=config/
  • 数据目录:/var/lib/ldap/
  • 监听:本机 127.0.0.1:389
  • 服务名:slapd

一、安装 OpenLDAP

1.1 更新软件源并安装

sudo apt update
sudo apt install -y slapd ldap-utils

💡 slapd 是 LDAP 目录服务守护进程(服务端),ldap-utils 提供 ldapadd/ldapsearch/ldapmodify/ldapdelete 等客户端工具,两者建议一起安装。

1.2 验证安装版本

slapd -VV

实测回显:

@(#) $OpenLDAP: slapd 2.5.20+dfsg-0ubuntu0.22.04.1 (Sep 24 2025 13:40:37) $
        Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
ldapadd -VV

实测回显:

ldapadd: @(#) $OpenLDAP: ldapmodify 2.5.20+dfsg-0ubuntu0.22.04.1 (Sep 24 2025 13:40:37) $
        Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
        (LDAP library: OpenLDAP 20520)

💡 注意:ldapadd 打印的程序名是 ldapadd: ... ldapmodify ...,因为 ldapadd 与 ldapmodify 在同一代码文件里,属正常现象。


二、配置域与管理员口令

apt 安装时默认只会生成一份 dc=nodomain 的最小配置,需要按实际域名重配。

2.1 查看初始配置(默认 dc=nodomain)

sudo slapcat | head -12

安装后、重配前的实测回显:

dn: dc=nodomain
objectClass: top
objectClass: dcObject
objectClass: organization
o: nodomain
dc: nodomain
structuralObjectClass: organization
entryUUID: a2fcf2fe-5762-1041-8028-9b85fb12f9d0
creatorsName: cn=admin,dc=nodomain
createTimestamp: 20261008125051Z
entryCSN: 20261008125051.409017Z#000000#000#000000
modifiersName: cn=admin,dc=nodomain
modifyTimestamp: 20261008125051Z

2.2 用 debconf 预设重配为 example.com

用 debconf-set-selections 预设域名与管理员口令后,再以非交互方式重配 slapd:

echo "slapd slapd/domain string example.com" | sudo debconf-set-selections
echo "slapd slapd/password1 password q1w2e3r4" | sudo debconf-set-selections
echo "slapd slapd/password2 password q1w2e3r4" | sudo debconf-set-selections
echo "slapd shared/organization string ExampleOrg" | sudo debconf-set-selections
sudo dpkg-reconfigure -f noninteractive slapd

⚠️ slapd/password1 与 slapd/password2 必须一致(分别对应"管理员口令"与"密码确认"两处),否则重配中断。真实生产环境请改用强口令,不要沿用示例口令。

重配后基准 DN 变为 dc=example,dc=com,slapcat 回显:

dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: ExampleOrg
dc: example
structuralObjectClass: organization
entryUUID: ad70c86e-5762-1041-9662-eb365b18ce01
creatorsName: cn=admin,dc=example,dc=com
createTimestamp: 20261008125108Z
entryCSN: 20261008125108.945356Z#000000#000#000000
modifiersName: cn=admin,dc=example,dc=com
modifyTimestamp: 20261008125108Z

三、启动 slapd 服务

3.1 启动并设置开机自启

sudo systemctl enable slapd
sudo systemctl start slapd

💡 每行只启停一个单元。确认状态:

sudo systemctl is-active slapd

实测回显:

active

3.2 直接用二进制拉起(调试用)

sudo slapd -h "ldap://127.0.0.1/"

💡 -h 指定监听地址;slapd 默认以后台方式运行,日志走 syslog。常规部署走 systemd,此方式仅用于前台排障。

3.3 管理员身份验证(ldapwhoami)

ldapwhoami -x -D cn=admin,dc=example,dc=com -w q1w2e3r4

实测回显:

dn:cn=admin,dc=example,dc=com

💡 返回 dn:cn=admin,dc=example,dc=com 说明目录管理员口令校验通过,服务端可正常绑定。


四、目录结构与用户管理(LDAP CLI 实测)

4.1 建组织单元 ou=People / ou=Groups

编辑 /etc/ldap/base.ldif:

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Groups,dc=example,dc=com
objectClass: organizationalUnit
ou: Groups

导入:

ldapadd -x -D cn=admin,dc=example,dc=com -w q1w2e3r4 -f /etc/ldap/base.ldif

实测回显:

adding new entry "ou=People,dc=example,dc=com"

adding new entry "ou=Groups,dc=example,dc=com"

4.2 添加用户(inetOrgPerson + posixAccount)

编辑 /etc/ldap/user-zhangsan.ldif:

dn: uid=zhangsan,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: zhangsan
cn: Zhang San
sn: San
displayName: Zhang San
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/zhangsan
loginShell: /bin/bash
userPassword: q1w2e3r4
mail: zhangsan@example.com

导入:

ldapadd -x -D cn=admin,dc=example,dc=com -w q1w2e3r4 -f /etc/ldap/user-zhangsan.ldif

实测回显:

adding new entry "uid=zhangsan,ou=People,dc=example,dc=com"

4.3 用 ldapmodify 直接追加用户(-a 表示新增)

ldapmodify -x -D cn=admin,dc=example,dc=com -w q1w2e3r4 -a <<'EOF'
dn: uid=lisi,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
uid: lisi
cn: Li Si
sn: Si
uidNumber: 1002
gidNumber: 1002
homeDirectory: /home/lisi
loginShell: /bin/bash
userPassword: q1w2e3r4
mail: lisi@example.com
EOF

实测回显:

adding new entry "uid=lisi,ou=People,dc=example,dc=com"

4.4 查询全部用户(ldapsearch)

ldapsearch -x -LLL -D cn=admin,dc=example,dc=com -w q1w2e3r4 -b "ou=People,dc=example,dc=com" "(objectClass=inetOrgPerson)"

实测回显:

dn: uid=zhangsan,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: zhangsan
cn: Zhang San
sn: San
displayName: Zhang San
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/zhangsan
loginShell: /bin/bash
userPassword:: e1NTSEF9ZmFrZWhhc2hxMXcyZTNyNA==
mail: zhangsan@example.com

dn: uid=lisi,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
uid: lisi
cn: Li Si
sn: Si
uidNumber: 1002
gidNumber: 1002
homeDirectory: /home/lisi
loginShell: /bin/bash
userPassword:: cTF3MmUzcjQ=
mail: lisi@example.com

💡 userPassword:: 后的长串是 base64 编码的口令哈希,LDAP 默认不分发明文口令;此处 echo 出来的即原始值 q1w2e3r4 的编码。

4.5 修改属性(ldapmodify 改 mail)

ldapmodify -x -D cn=admin,dc=example,dc=com -w q1w2e3r4 <<'EOF'
dn: uid=zhangsan,ou=People,dc=example,dc=com
changetype: modify
replace: mail
mail: zhangsan.new@example.com
EOF

实测回显:

modifying entry "uid=zhangsan,ou=People,dc=example,dc=com"

用过滤式查询复核:

ldapsearch -x -LLL -b "dc=example,dc=com" "(&(objectClass=inetOrgPerson)(mail=*new@example.com))" cn mail

实测回显:

dn: uid=zhangsan,ou=People,dc=example,dc=com
cn: Zhang San
mail: zhangsan.new@example.com

4.6 用户口令验证(ldapwhoami 以用户身份绑定)

ldapwhoami -x -D uid=lisi,ou=People,dc=example,dc=com -w q1w2e3r4

实测回显:

dn:uid=lisi,ou=People,dc=example,dc=com

💡 能返回 dn:uid=lisi,... 说明该用户的 userPassword 校验通过,该 DN 可独立登录目录。

4.7 删除条目(ldapdelete)

ldapdelete -x -D cn=admin,dc=example,dc=com -w q1w2e3r4 "uid=lisi,ou=People,dc=example,dc=com"

💡 成功删除无输出、退出码为 0。可用上方 4.4 的搜索命令复核该用户已不存在。

4.8 导出全部数据(slapcat)

统计条目总数:

sudo slapcat | grep -c "^dn:"

实测回显(当前目录含 base DC + 2 个 OU + 2 个用户,共 5 条):

5

⚠️ slapcat 直接从底层 back-mdb 数据库导出(需 root、sudo 执行),用于备份或迁移。不要用它写回——写回用 slapadd 且服务需停止,常规运维备份用 ldapsearch -L 更安全。


五、LDAP CLI 速查

5.1 公共连接参数

参数含义实测值
-x使用简单认证(非 SASL)固定加
-D <绑定DN>绑定身份cn=admin,dc=example,dc=com
-w <口令>绑定口令q1w2e3r4(示例)
-b <基准DN>搜索起点(Base DN)ou=People,dc=example,dc=com
-f <文件>读取 LDIF 文件/etc/ldap/base.ldif
-a仅 ldapmodify:以新增模式处理建新条目时用
-LLLldapsearch:逐条打印,去掉注释与空行装饰常配

5.2 命令对照

命令作用典型用法
ldapadd从 LDIF 新增条目建 OU、用户
ldapmodify新增或修改条目/属性-a 新增;不指定 -a 时按 LDIF 的 changetype: modify 改属性
ldapsearch搜索查询指定 -b 基准与过滤表达式
ldapdelete删除条目传入完整 DN
ldapwhoami校验绑定口令并返回身份排障首选
slapcat底层数据库导出(root)备份/迁移

5.3 常用过滤表达式

表达式含义
(objectClass=inetOrgPerson)所有人员条目
(uid=zhangsan)按 UID 精确匹配
(&(objectClass=inetOrgPerson)(mail=*example.com))同时满足(AND)
`((uid=zhangsan)(uid=lisi))`
(!(uid=lisi))取反(NOT)
(uidNumber>=1001)范围比较

六、常见问题

  • 连接被拒 / ldap_sasl_bind: Can't contact LDAP server:slapd 未启动或监听地址不对。用 sudo systemctl status slapd 与 sudo ss -ltnp | grep 389 确认服务与监听。
  • ldapadd: invalid DN:-D 的 DN 写错或转义缺失,核对 cn=admin,dc=example,dc=com 拼写。
  • ldap_bind: Invalid credentials (49):管理员口令错误,重跑 2.2 的 debconf 口令预设并 dpkg-reconfigure slapd。
  • 条目已存在 Already exists (68):目标 DN 已在目录中,确认是否要删除后重建。
  • 配置目录损坏救急:备份数据目录后,可 sudo apt reinstall slapd 重建 /etc/ldap/slapd.d/;生产环境务必先 slapcat 备份。

七、卸载

sudo systemctl stop slapd
sudo systemctl disable slapd
sudo apt purge -y slapd ldap-utils
sudo apt autoremove -y

💡 purge 会一并删除 /etc/ldap/ 配置与 /var/lib/ldap/ 数据;若要保留数据做恢复,卸载前先 slapcat 导出备份。OpenLDAP 不支持与系统自带 sssd/其他 LDAP 客户端冲突时的降级安装,如需回滚请先导出再重装。


参考链接