Ubuntu 22.04 安装 389 Directory Server 实测:apt 部署、dscreate 建实例与 TLS 配置
Ubuntu 22.04 实测安装 389 Directory Server 2.0.15:apt 部署、dscreate 非交互建实例、ldapsearch 验证、自签证书启用 LDAPS 与开机自启,含端口占用与半成品实例等排障实录。
Ubuntu 22.04 安装 389 Directory Server 实测:apt 部署、dscreate 建实例与 TLS 配置
目标:在一台 Ubuntu 22.04.5 LTS 服务器上完成 389 Directory Server 的生产化安装:apt 仓库部署、
dscreate非交互式创建实例(端口 / 后缀 / Directory Manager 密码)、ldapsearch 连通性验证、自签证书启用 LDAPS(636)、开机自启。全文命令与输出均为 2026-10-28 在 Ubuntu 22.04 环境实测回显,示例实例名ds1、后缀dc=example,dc=com、Directory Manager 密码q1w2e3r4(生产请更换为强密码)。
一、环境规划与版本确认
1.1 系统要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Ubuntu 22.04 LTS(本文实测 22.04.5) |
| 端口 | LDAP 389/TCP、LDAPS 636/TCP(未占用) |
| 内存 | 最低 1GB;389DS 启动时按 nsslapd-cache-autosize(默认 25%)自动划分数据库缓存,实测在 20GB 内存主机上自动分配约 1.24GB 数据库缓存,内存紧张的主机建议在配置阶段显式设小(见站内配置篇) |
| 账户 | 具有 sudo 权限的运维账户 |
| 客户端工具 | ldap-utils(ldapsearch/ldapadd 等) |
1.2 软件版本确认
Ubuntu 22.04 官方仓库(jammy-updates/universe)自带 389-ds-base,实查结果:
$ apt-cache policy 389-ds-base
389-ds-base:
Installed: (none)
Candidate: 2.0.15-1ubuntu2
Version table:
2.0.15-1ubuntu2 500
500 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages
版本说明:Ubuntu 22.04 仓库内为 2.0.15;上游(github.com/389ds/389-ds-base)最新稳定版为 3.3.1(2026-09-07 发布,2026-10-28 查询)。仓库版与上游版功能差异较大(3.x 增强了复制与自动化),如需上游新版须自行编译或使用第三方源,本篇以仓库版 2.0.15 实测为准,其稳定性足以支撑中小规模目录服务。
二、安装软件包
2.1 apt 安装
$ sudo apt-get update
$ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y 389-ds-base ldap-utils
Setting up policycoreutils-dev (3.3-1) ...
Setting up selinux-policy-dev (2:2.20210203-10) ...
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...
安装完成后确认核心命令可用:
$ dsctl -l # 列出本机实例(此时为空)
$ dscreate --help | head -1
usage: dscreate [-h] [-v] [-j] {from-file,interactive,create-template} ...
日志分析工具(logconv、ds-replcheck)在独立包中,运维阶段会用到,建议一并安装:
$ sudo apt-get install -y 389-ds-base-legacy-tools
$ ds-replcheck --version # 预期输出:ds-replcheck version ...(实测命令存在)
2.2 安装后的目录布局
| 路径 | 用途 |
|---|---|
/etc/dirsrv/slapd-<实例名>/ | 实例配置(dse.ldif、证书库 cert9.db/key4.db、schema) |
/var/lib/dirsrv/slapd-<实例名>/ | 数据库(db/)、备份(bak/)、LDIF(ldif/) |
/var/log/dirsrv/slapd-<实例名>/ | 访问日志 access、错误日志 errors |
/etc/dirsrv/ssca/ | dscreate 自动创建的自签 CA(ca.crt) |
/run/slapd-<实例名>.socket | LDAPI 本地套接字 |
systemd 单元为模板单元 dirsrv@<实例名>.service。
三、创建实例(dscreate)
3.1 两种方式
dscreate 支持交互式(dscreate interactive,逐项问答)与非交互式(dscreate from-file,喂 .inf 文件)。生产推荐 .inf 文件方式:参数可入库、可重复执行、便于审计。
先生成模板再修改是标准做法:
$ dscreate create-template /tmp/ds1.inf
生成的模板(去除注释后关键项):
[general]
;defaults = 999999999
;full_machine_name = ds1.example.com
;start = True
;strict_host_checking = False
[slapd]
;instance_name = localhost
;ldapi = /run/slapd-{instance_name}.socket
;port = 389
;root_password = Directory_Manager_Password
;secure_port = 636
;self_sign_cert = True
;self_sign_cert_valid_months = 24
[backend-userroot]
;create_suffix_entry = False
;require_index = False
;sample_entries = no
;suffix =
3.2 填写 .inf 文件(实测可用版本)
[general]
full_machine_name = ds1.example.com
start = True
strict_host_checking = False
[slapd]
instance_name = ds1
port = 389
secure_port = 636
root_dn = cn=Directory Manager
root_password = q1w2e3r4
self_sign_cert = True
self_sign_cert_valid_months = 24
[backend-userroot]
suffix = dc=example,dc=com
create_suffix_entry = True
sample_entries = yes
参数说明:
general.start = True:创建完成后立即通过 systemd 拉起实例,保持 True(实测start = False会在无 systemd 环境留下"半成品"实例,见 6.3 节排障);slapd.instance_name:实例名,决定目录名slapd-ds1与服务单元dirsrv@ds1;slapd.root_dn / root_password:超级管理员 DN 与密码,本文统一用cn=Directory Manager/q1w2e3r4;slapd.self_sign_cert = True:自动创建自签 CA 并签发服务器证书(有效期 24 个月),生产建议后续替换为正式 CA 证书;backend-userroot.sample_entries = yes:生成 demo_user / demo_group 等示例条目与 ACI,便于验证,生产可设no。
3.3 执行创建(实测输出)
$ sudo dscreate from-file /tmp/ds1.inf
Starting installation ...
Validate installation settings ...
Create file system structures ...
Create self-signed certificate database ...
selinux is disabled, will not relabel ports or files.
Perform SELinux labeling ...
selinux is disabled, will not relabel ports or files.
Create database backend: dc=example,dc=com ...
Perform post-installation tasks ...
Completed installation for instance: slapd-ds1
看到 Completed installation for instance: slapd-ds1 即创建成功,实例自动启动并注册为 dirsrv@ds1.service。
3.4 验证实例
$ systemctl is-active dirsrv@ds1
active
Directory Manager 绑定与示例条目(实测回显):
$ ldapsearch -x -H ldap://127.0.0.1:389 -D 'cn=Directory Manager' -w q1w2e3r4 -b dc=example,dc=com dn
dn: dc=example,dc=com
dn: ou=groups,dc=example,dc=com
dn: ou=people,dc=example,dc=com
dn: ou=permissions,dc=example,dc=com
dn: ou=services,dc=example,dc=com
dn: uid=demo_user,ou=people,dc=example,dc=com
dn: cn=demo_group,ou=groups,dc=example,dc=com
dn: cn=group_admin,ou=permissions,dc=example,dc=com
dn: cn=group_modify,ou=permissions,dc=example,dc=com
dn: cn=user_admin,ou=permissions,dc=example,dc=com
dn: cn=user_modify,ou=permissions,dc=example,dc=com
dn: cn=user_passwd_reset,ou=permissions,dc=example,dc=com
dn: cn=user_private_read,ou=permissions,dc=example,dc=com
result: 0 Success
从网络中其他主机访问(替换为服务器真实 IP,客户端需安装 ldap-utils):
$ ldapsearch -x -H ldap://<服务器IP>:389 -D 'cn=Directory Manager' -w q1w2e3r4 -b dc=example,dc=com -s base dn
dn: dc=example,dc=com
result: 0 Success
四、TLS 与 LDAPS(636)
4.1 证书机制
self_sign_cert = True 时,dscreate 做了两件事:在 /etc/dirsrv/ssca/ 生成自签 CA(含 ca.crt),并签发一张 SAN 为 ds1.example.com 的服务器证书装入实例证书库。同时把 nsslapd-security: on、nsslapd-secureport: 636 写入 dse.ldif。查看证书:
$ sudo certutil -L -d /etc/dirsrv/slapd-ds1 -n Server-Cert | grep -E 'Subject|DNS name'
Subject: "CN=ds1.example.com,givenName=...,O=testing,L=389ds,ST=Queensland,C=AU"
DNS name: "ds1.example.com"
4.2 LDAPS 验证(实测)
$ LDAPTLS_CACERT=/etc/dirsrv/ssca/ca.crt ldapwhoami -x -H ldaps://ds1.example.com:636 -D 'cn=Directory Manager' -w q1w2e3r4
dn: cn=directory manager
LDAPTLS_CACERT 指向 dscreate 的 CA 即可完成信任链校验;证书的 SAN 是 full_machine_name,所以 URL 里的主机名必须与之一致(把 ds1.example.com 写入 /etc/hosts 或 DNS)。
排障实录:实例创建完成后的首次启动,实测出现 636 未监听、
ldaps://报Can't contact LDAP server (-1)的情况(错误日志中无 636 监听记录)。执行sudo systemctl restart dirsrv@ds1后错误日志出现监听记录,LDAPS 恢复正常:[28/Oct/2026:03:56:58 +0000] - INFO - slapd_daemon - Listening on All Interfaces port 636 for LDAPS requests创建实例后建议把"确认 636 监听"纳入验收步骤:
ss -ltn | grep 636。
4.3 StartTLS(389 端口升级加密)
普通 389 端口同样支持 StartTLS 升级(客户端报错容忍处理见文末提示),生产建议强制加密后把 nsslapd-minssf 调为 1(见站内配置篇)。
五、开机自启与防火墙
$ systemctl is-enabled dirsrv@ds1
enabled
dscreate 已自动 enable,无需手工处理。放行防火墙(命令+预期结果,未在实测环境执行):
$ sudo ufw allow 389,636/tcp
Rules updated # 预期回显
六、排障实录
6.1 端口被占用
Starting installation ...
Validate installation settings ...
Error: port 389 is already in use, or missing NET_BIND_SERVICE
原因:389 端口已有进程(常见为历史实例残留)或非 root 执行。处理:ss -ltnp | grep 389 找到占用者,停掉后重跑 dscreate。
6.2 残留实例单元开机抢占 389
实测中一次安装中途失败后重装,dscreate 报 6.1 节错误,但 ss -ltnp 显示 *:389 被 ns-slapd 占用——是第一次失败的安装留下的 dirsrv@ds1 单元在系统启动时自动拉起了旧实例。处理:
$ sudo systemctl stop dirsrv@ds1
$ sudo systemctl disable dirsrv@ds1
$ sudo rm -rf /etc/dirsrv/slapd-ds1 /var/lib/dirsrv/slapd-ds1 /var/log/dirsrv/slapd-ds1 /run/slapd-ds1.socket
清理后重跑 dscreate from-file 即成功。重装实例前务必先停用并删除旧实例。
6.3 start = False 的半成品实例
实测在无 systemd 的最小化环境中使用 start = False,dscreate 只完成文件系统结构与证书库创建,随后在启动步骤报 systemctl start 失败退出;事后检查 dse.ldif 中没有 mapping tree / 后端配置,pwdfile.txt 中是随机生成的密码而非 .inf 指定值,实例不可用。生产服务器的正确姿势:start = True + systemd 正常运行;若必须在极简环境搭建,请改用 start=True 失败后手工 /usr/sbin/ns-slapd -D /etc/dirsrv/slapd-<实例名> 拉起,并在配置篇核对后端是否齐全。
6.4 ldapsearch 报 "Can't contact LDAP server (-1)"
三层排查:systemctl status dirsrv@ds1 → ss -ltn | grep -E '389|636' → tail /var/log/dirsrv/slapd-ds1/errors。LDAPS 场景还需确认 URL 主机名与证书 SAN 一致、客户端指定了 LDAPTLS_CACERT。
七、安装验收清单
systemctl is-active dirsrv@ds1返回 active;ss -ltn可见 389 与 636 双监听;ldapsearch以 Directory Manager 绑定返回result: 0 Success;LDAPTLS_CACERT=/etc/dirsrv/ssca/ca.crt走ldaps://绑定成功;systemctl is-enabled dirsrv@ds1返回 enabled。
下一步:日常配置(后缀 / 索引 / 日志 / 缓存 / 口令策略)见站内配置篇,命令行运维(启停 / LDIF / 备份恢复)见站内运维篇,选型背景见站内选型篇。
系列文档