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 实测
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:以新增模式处理 | 建新条目时用 |
-LLL | ldapsearch:逐条打印,去掉注释与空行装饰 | 常配 |
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 客户端冲突时的降级安装,如需回滚请先导出再重装。
参考链接
- OpenLDAP 软件:https://www.openldap.org/
- Ubuntu slapd 软件包:https://packages.ubuntu.com/jammy/slapd
- OpenLDAP 官方管理员指南:https://www.openldap.org/doc/admin24/