Wren:DS 5.1.1 配置参数详解
详解 Wren:DS 5.1.1 配置面:config.ldif 与在线 cn=config 修改通道实测对比、179 个配置条目总览、全局/后端/连接处理器/密码策略/TLS/日志/复制/缓存/JVM 堆参数逐项讲解,附实测行为与生产配置模板。
Wren:DS 5.1.1 配置参数详解
目标:把 Wren:DS 5.1.1 的全部配置面——主配置文件
config.ldif、全局参数、后端与索引、连接处理器、密码策略、TLS、日志、复制、缓存与工作队列、REST 端点、插件、JVM 堆参数——逐项讲清默认值、修改方法与生效方式,关键参数附本机实测行为。全文参数值与命令回显均为 2026-11-02 在测试服务器wrends01(已按 《Ubuntu 22.04 安装 Wren:DS 5.1.1 指南》 完成安装)上的实测记录。
一、环境信息
| 项目 | 值 | 取证方式 |
|---|---|---|
| 主机名 | wrends01 | hostname |
| Wren:DS | 5.1.1(Build 2026-05-22T13:11:32Z) | start-ds --version |
| JDK | OpenJDK 17.0.20.1 | java -version |
| 安装目录 | /opt/wren-ds | 下文基准路径 |
| 主配置文件 | /opt/wren-ds/config/config.ldif | 实测共 179 个配置条目 |
| LDAP 端口 | 1389 | config.ldif 中 ds-cfg-listen-port |
| LDAPS 端口 | 1636 | 同上 |
| 管理连接器端口 | 4444 | 同上 |
| 业务后缀 | dc=example,dc=com | ds-cfg-base-dn |
| JVM 堆 | -Xms256m -Xmx256m | ps -ef 实测 |
统计配置条目总数:
root@wrends01:~# grep -c '^dn:' /opt/wren-ds/config/config.ldif
179
二、前置条件
- Wren:DS 5.1.1 已完成安装并处于运行状态(安装过程见 《Ubuntu 22.04 安装 Wren:DS 5.1.1 指南》)。
- 具备 root 或目录管理员身份:本文所有 LDAP 操作以
cn=Directory Manager/q1w2e3r4绑定。 - 服务器已安装
ldap-utils(ldapsearch/ldapmodify可用)。 - 修改配置前先备份:
cp /opt/wren-ds/config/config.ldif /opt/wren-ds/config/config.ldif.bak。
三、参数查看与修改方式
Wren:DS 的配置全部存放在 cn=config 这棵 LDAP 树里,config/config.ldif 就是它的磁盘形态。查看与修改共有四条通道,能力差异很大,先实测清楚。
3.1 直接读 config.ldif(查看首选)
任何参数的当前值都可以直接 grep 主配置文件:
root@wrends01:~# grep -n 'ds-cfg-lookthrough-limit' /opt/wren-ds/config/config.ldif
40:ds-cfg-lookthrough-limit: 5000
1513:ds-rlim-lookthrough-limit: 0
第 40 行是全局配置 cn=config 的值,第 1513 行是某个条目上的资源限制覆盖(0 表示不限制)。读文件永远安全,但改文件要分在线/停机两种情况,见 3.2 与 3.4。
3.2 在线修改:走 LDAP 端口操作 cn=config(推荐通道,实测有效)
cn=config 树可以通过普通 LDAP 端口(1389)直接读写,改动立即生效并即时回写磁盘,不需要重启。这是本篇实测下来唯一可靠的在线配置通道。
先看当前值:
root@wrends01:~# cd /opt/wren-ds
root@wrends01:/opt/wren-ds# ./bin/ldapsearch -p 1389 -D 'cn=Directory Manager' -w q1w2e3r4 \
-b 'cn=config' -s base '(objectClass=ds-cfg-root-config)' ds-cfg-size-limit ds-cfg-lookthrough-limit
dn: cn=config
ds-cfg-size-limit: 1000
ds-cfg-lookthrough-limit: 5000
在线改 lookthrough-limit 从 5000 到 4000:
root@wrends01:/opt/wren-ds# printf 'dn: cn=config\nchangetype: modify\nreplace: ds-cfg-lookthrough-limit\nds-cfg-lookthrough-limit: 4000\n' > /tmp/cfg1.ldif
root@wrends01:/opt/wren-ds# ./bin/ldapmodify -p 1389 -D 'cn=Directory Manager' -w q1w2e3r4 -f /tmp/cfg1.ldif
Processing MODIFY request for cn=config
MODIFY operation successful for DN cn=config
立即验证内存态与磁盘态:
root@wrends01:/opt/wren-ds# ./bin/ldapsearch -p 1389 -D 'cn=Directory Manager' -w q1w2e3r4 \
-b 'cn=config' -s base '(objectClass=*)' ds-cfg-lookthrough-limit | grep lookthrough
ds-cfg-lookthrough-limit: 4000
root@wrends01:/opt/wren-ds# grep -n 'lookthrough' config/config.ldif
40:ds-cfg-lookthrough-limit: 4000
1513:ds-rlim-lookthrough-limit: 0
磁盘文件同步更新,无需重启。实测完成后已改回 5000:
41:ds-cfg-lookthrough-limit: 5000
1513:ds-rlim-lookthrough-limit: 0
结论:
ldapmodify操作cn=config是 5.1.1 上最可靠的在线配置通道。改错可随时改回,但语法错误会被 schema 校验直接拒绝(服务端ds-cfg-check-schema: true)。
3.3 dsconfig 走管理连接器(实测存在 TLS 缺陷)
dsconfig 是官方配置工具,必须经管理连接器(4444)。实测首次连接会弹证书信任菜单:
root@wrends01:/opt/wren-ds# ./bin/dsconfig list-backends -h 127.0.0.1 -p 4444 \
-D 'cn=Directory Manager' -w q1w2e3r4
Server Certificate:
User DN : O=Administration Connector RSA Self-Signed Certificate, CN=wrends01
Validity : From 'Mon Nov 02 12:40:30 GMT 2026'
To 'Sun Oct 28 12:40:30 GMT 2046'
Issuer : O=Administration Connector RSA Self-Signed Certificate, CN=wrends01
Do you trust this server certificate?
1) No
2) Yes, for this session only
3) Yes, also add it to a truststore
4) View certificate details
Enter choice: [2]:
选 2 之后,TLS 握手能过(openssl s_client 对 4444 用 TLS 1.2 握手成功),但 LDAP 会话随即被掐断:
The Backends could not be listed due to a communications problem: Server
Connection Closed
status 同样失败:
root@wrends01:/opt/wren-ds# ./bin/status -D 'cn=Directory Manager' -w q1w2e3r4
Unable to connect to the server at "wrends01" on port 4444
这是 5.1.1 在 OpenJDK 17.0.20 上的 TLS 传输层缺陷(服务端 logs/errors 伴随 GRIZZLY0013 异常,实测累计 29 条),影响 LDAPS、StartTLS 与管理连接器全部 TLS 路径,不是证书配置错误。因此在线配置以 3.2 的 cn=config LDAP 通道为准,dsconfig 留作上游修复后的备用工具,其语法见 《Wren:DS 5.1.1 常用 CLI 命令与工具详解》。
3.4 停机修改 config.ldif(兜底通道)
服务无法启动或需要批量改配置时:stop-ds → 编辑 config/config.ldif → start-ds。注意两点:
- 服务运行中直接编辑文件不会被热加载,且进程退出时可能用内存态覆盖你的修改;
- 改错导致起不来时,用备份文件回滚。
3.5 修改方式选择
| 场景 | 通道 | 是否需重启 | 实测状态 |
|---|---|---|---|
| 查看任意参数 | 读 config.ldif / ldapsearch cn=config | 否 | 可用 |
| 在线改参数 | ldapmodify cn=config(1389 端口) | 否 | 可用,即时生效并落盘 |
| 在线改参数 | dsconfig(4444) | 否 | TLS 缺陷不可用 |
| 批量/纠错 | 停机编辑 config.ldif | 是 | 可用 |
| JVM 堆参数 | config/java.properties | 是 | 可用 |
四、参数体系总览
179 个配置条目按功能族归类如下(族名与 cn=config 下的子容器一一对应):
| 配置族 | 容器 DN | 条目数(实测) | 决定什么 |
|---|---|---|---|
| 全局行为 | cn=config | 1 | 大小/时间/扫描限制、schema 校验、匿名策略、默认口令策略 |
| 后端 | cn=Backends,cn=config | 7 | 数据存储:userRoot/adminRoot/schema/tasks/monitor/backup/ads-truststore |
| 索引 | cn=Index,ds-cfg-backend-id=userRoot,... | 13 | 每个属性一种索引类型与匹配规则 |
| 连接处理器 | cn=Connection Handlers,cn=config | 5 | LDAP/LDAPS/HTTP/JMX/LDIF 监听端口与 TLS |
| 管理连接器 | cn=Administration Connector,cn=config | 1 | 4444 管理端口与 admin-cert |
| 密码策略 | cn=Password Policies,cn=config | 2 | Default/Root 两套策略 |
| 口令校验器 | cn=Password Validators,cn=config | 7 | 长度/字符集/字典/重复字符等规则 |
| 口令存储方案 | cn=Password Storage Schemes,cn=config | 17 | SSHA/SSHA512/PBKDF2/Bcrypt 等 |
| 日志 | cn=Loggers,cn=config + 轮转/保留策略 | 8+7 | access/errors/audit/debug/http 各日志器 |
| 复制 | cn=Synchronization Providers,cn=config | 2 | 多主同步提供者与域 |
| 条目缓存 | cn=Entry Caches,cn=config | 2 | FIFO / Soft Reference |
| 工作队列 | cn=Work Queue,cn=config | 1 | 请求排队容量 |
| HTTP 端点 | cn=HTTP Endpoints,cn=config | 2 | REST /api 与管理 /admin |
| 插件 | cn=Plugins,cn=config | 10 | LastMod/Entry UUID/引用完整性等 |
| Root DN | cn=Root DNs,cn=config | 1 | Directory Manager 身份与资源限制 |
| 密钥/信任库 | cn=Key Manager Providers / cn=Trust Manager Providers | 4+4 | keystore/truststore 与 pin 文件 |
| 虚拟属性/分组/监控 | 其余容器 | 其余 | isMemberOf、动态组、监控提供者等 |
五、核心参数分类详解
5.1 全局服务器参数(cn=config)
实测本机全部值(节选,完整 179 条以 ldapsearch -b 'cn=config' -s base 为准):
root@wrends01:/opt/wren-ds# awk 'BEGIN{p=0} /^dn: /{p=($0=="dn: cn=config")} p' config/config.ldif
dn: cn=config
objectClass: top
objectClass: ds-cfg-root-config
cn: config
ds-cfg-check-schema: true
ds-cfg-add-missing-rdn-attributes: true
ds-cfg-allow-attribute-name-exceptions: false
ds-cfg-invalid-attribute-syntax-behavior: reject
ds-cfg-single-structural-objectclass-behavior: reject
ds-cfg-notify-abandoned-operations: false
ds-cfg-proxied-authorization-identity-mapper: cn=Exact Match,cn=Identity Mappers,cn=config
ds-cfg-size-limit: 1000
ds-cfg-time-limit: 60 seconds
ds-cfg-lookthrough-limit: 5000
ds-cfg-writability-mode: enabled
ds-cfg-bind-with-dn-requires-password: true
ds-cfg-reject-unauthenticated-requests: false
ds-cfg-default-password-policy: cn=Default Password Policy,cn=Password Policies,cn=config
ds-cfg-return-bind-error-messages: false
ds-cfg-idle-time-limit: 0 seconds
ds-cfg-save-config-on-successful-startup: true
ds-cfg-etime-resolution: milliseconds
ds-cfg-max-allowed-client-connections: 0
ds-cfg-max-psearches: -1
重点参数逐项:
| 参数 | 实测默认 | 含义与调整建议 |
|---|---|---|
ds-cfg-size-limit | 1000 | 单次搜索默认返回条目上限,客户端可用 SLAP 请求控件在权限内突破;Root DN 上为 0(不限制) |
ds-cfg-time-limit | 60 seconds | 单次搜索最长执行时间 |
ds-cfg-lookthrough-limit | 5000 | 单次搜索最多扫描条目数,防大过滤拖垮服务器;3.2 节已实测可在线改 |
ds-cfg-check-schema | true | 写入/修改做 schema 校验;批量导入脏数据时才临时关闭 |
ds-cfg-writability-mode | enabled | 全局写开关,lockdown 模式用于只读发布窗口 |
ds-cfg-bind-with-dn-requires-password | true | 带 DN 的 bind 必须给口令,实测拒绝空口令(见下) |
ds-cfg-reject-unauthenticated-requests | false | 是否禁止匿名请求,实测匿名搜索可用(见下) |
ds-cfg-max-allowed-client-connections | 0 | 0=不限制;生产建议按内存设上限保护 JVM |
ds-cfg-return-bind-error-messages | false | false 时 bind 失败只回 invalid-credentials,不泄露原因 |
空口令 bind 实测(验证 bind-with-dn-requires-password: true):
root@wrends01:/opt/wren-ds# ./bin/ldapsearch -p 1389 -D 'cn=Directory Manager' -w '' \
-b 'dc=example,dc=com' -s base '(objectClass=*)' dn
Additional Information: Unable to process the simple bind request because it
contained a bind DN but no password, which is forbidden by the server
configuration
access 日志同步记录 result=53:
[02/Nov/2026:14:15:57 +0000] BIND REQ conn=18 op=0 msgID=1 version=3 type=SIMPLE dn="cn=Directory Manager"
[02/Nov/2026:14:15:57 +0000] BIND RES conn=18 op=0 msgID=1 result=53 message="Unable to process the simple bind request because it contained a bind DN but no password, which is forbidden by the server configuration" etime=1
匿名请求实测(验证 reject-unauthenticated-requests: false):
root@wrends01:/opt/wren-ds# ./bin/ldapsearch -p 1389 -b 'dc=example,dc=com' -s base '(objectClass=*)' dn
dn: dc=example,dc=com
不带任何凭据即可读回后缀根条目。生产环境若不需要匿名查根条目,应把该参数改为 true(在线改法同 3.2)。
ds-cfg-allowed-task 列出了允许经 cn=tasks 提交的后端任务(实测 15 种:AddSchemaFileTask、BackupTask、DisconnectClientTask、EnterLockdownModeTask、ExportTask、ImportTask、InitializeTargetTask、InitializeTask、SetGenerationIdTask、LeaveLockdownModeTask、RebuildTask、RestoreTask、ShutdownTask、PurgeConflictsHistoricalTask、ResetChangeNumberTask),这是 《Wren:DS 5.1.1 常用 CLI 命令与工具详解》 中 backup/restore/rebuild-index 在线模式的权限基础。
5.2 后端与索引(cn=Backends)
用户数据后端 userRoot 实测配置:
dn: ds-cfg-backend-id=userRoot,cn=Backends,cn=config
objectClass: top
objectClass: ds-cfg-backend
objectClass: ds-cfg-local-backend
objectClass: ds-cfg-pluggable-backend
objectClass: ds-cfg-je-backend
ds-cfg-java-class: org.opends.server.backends.jeb.JEBackend
ds-cfg-backend-id: userRoot
ds-cfg-enabled: true
ds-cfg-db-directory: db
ds-cfg-writability-mode: enabled
ds-cfg-base-dn: dc=example,dc=com
💡 技术拓展:Wren:DS 的后端类型不止 JE 一种。常见后端对比——
后端 存储 特点 适用 JE(Pluggable/Local) Berkeley DB JE 带索引、支持复制与在线任务 生产主力,本文所用 LDIF Backend 纯文本 LDIF 无索引、改文件即生效 只读小数据集(如 schema) Memory Backend 纯内存 重启即失 monitor/tasks 等内部树 JDBC/Remote Backend 外部数据库/远端 LDAP 数据不落地 虚拟化已有数据源 本文环境用户数据落在默认 JE 后端
userRoot,目录/opt/wren-ds/db。
除 userRoot 外实测还有 6 个后端:adminRoot(管理树)、ads-truststore(复制信任库)、backup(备份任务树)、monitor(监控计数器)、schema(schema 定义)、tasks(任务队列)。
userRoot 默认建了 13 个属性索引(实测清单):aci、cn、ds-sync-conflict、ds-sync-hist、entryUUID、givenName、mail、member、objectClass、sn、telephoneNumber、uid、uniqueMember。索引类型与匹配规则可在对应条目(dn: ds-cfg-attribute=uid,cn=Index,...)查看,新增索引条目后需 rebuild-index 离线重建才对新旧数据生效(离线约束见 《Ubuntu 22.04 安装 Wren:DS 5.1.1 指南》 排障 11.3:在线跑会报 EnvironmentLockedException)。
5.3 连接处理器(端口与网络行为)
LDAP 明文处理器实测全量:
dn: cn=LDAP Connection Handler,cn=Connection Handlers,cn=config
ds-cfg-java-class: org.forgerock.opendj.reactive.LDAPConnectionHandler2
ds-cfg-enabled: true
ds-cfg-listen-address: 0.0.0.0
ds-cfg-listen-port: 1389
ds-cfg-accept-backlog: 128
ds-cfg-allow-ldap-v2: true
ds-cfg-keep-stats: true
ds-cfg-use-tcp-keep-alive: true
ds-cfg-use-tcp-no-delay: true
ds-cfg-allow-tcp-reuse-address: true
ds-cfg-send-rejection-notice: true
ds-cfg-max-request-size: 5 megabytes
ds-cfg-buffer-size: 4096 bytes
ds-cfg-max-blocked-write-time-limit: 2 minutes
ds-cfg-use-ssl: false
ds-cfg-ssl-cert-nickname: server-cert
ds-cfg-ssl-protocol: TLSv1.2
ds-cfg-allow-start-tls: TRUE
ds-cfg-key-manager-provider: cn=JKS,cn=Key Manager Providers,cn=config
ds-cfg-trust-manager-provider: cn=JKS,cn=Trust Manager Providers,cn=config
| 参数 | 实测默认 | 说明 |
|---|---|---|
ds-cfg-accept-backlog | 128 | TCP accept 队列,与 ss -ltn 里 Send-Q 128 一致 |
ds-cfg-max-request-size | 5 megabytes | 单条 PDU 上限,导入大批量 LDIF 时注意单条目大小 |
ds-cfg-use-tcp-keep-alive | true | 空闲连接保活探测 |
ds-cfg-allow-ldap-v2 | true | 兼容 LDAPv2,纯 v3 环境可关 |
ds-cfg-allow-start-tls | TRUE | 明文端口上允许 StartTLS 升级(实测结果见 5.5) |
LDAPS 处理器差异项实测:ds-cfg-use-ssl: true、ds-cfg-listen-port: 1636、ds-cfg-ssl-protocol: TLSv1.2。HTTP 处理器(REST)默认 ds-cfg-enabled: false、ds-cfg-listen-port: 8080,见 5.9。管理连接器独立成条:
dn: cn=Administration Connector,cn=config
ds-cfg-listen-address: 0.0.0.0
ds-cfg-listen-port: 4444
ds-cfg-ssl-protocol: TLSv1.2
ds-cfg-ssl-cert-nickname: admin-cert
ds-cfg-key-manager-provider: cn=Administration,cn=Key Manager Providers,cn=config
ds-cfg-trust-manager-provider: cn=Administration,cn=Trust Manager Providers,cn=config
5.4 密码策略与存储方案
Default 策略实测关键值:
dn: cn=Default Password Policy,cn=Password Policies,cn=config
ds-cfg-java-class: org.opends.server.core.PasswordPolicyFactory
ds-cfg-password-attribute: userPassword
ds-cfg-password-validator: cn=Length-Based Password Validator,cn=Password Validators,cn=config
ds-cfg-default-password-storage-scheme: cn=Salted SHA-1,cn=Password Storage Schemes,cn=config
ds-cfg-allow-user-password-changes: true
ds-cfg-lockout-failure-count: 0
ds-cfg-idle-lockout-interval: 0 seconds
ds-cfg-max-password-age: 0 seconds
ds-cfg-min-password-age: 0 seconds
ds-cfg-password-history-count: 0
ds-cfg-password-change-requires-current-password: false
ds-cfg-require-secure-authentication: false
ds-cfg-require-secure-password-changes: false
ds-cfg-state-update-failure-policy: reactive
长度校验器实测:
dn: cn=Length-Based Password Validator,cn=Password Validators,cn=config
ds-cfg-min-password-length: 6
ds-cfg-max-password-length: 0
弱口令拒绝实测:给新用户设 3 位口令被策略拦截:
root@wrends01:/opt/wren-ds# printf 'dn: uid=carol,ou=people,dc=example,dc=com\nchangetype: add\nobjectClass: top\nobjectClass: person\nobjectClass: organizationalPerson\nobjectClass: inetOrgPerson\nuid: carol\ncn: Carol\nsn: Zhou\nuserPassword: abc\n' > /tmp/carol.ldif
root@wrends01:/opt/wren-ds# ./bin/ldapmodify -p 1389 -D 'cn=Directory Manager' -w q1w2e3r4 -f /tmp/carol.ldif
Processing ADD request for uid=carol,ou=people,dc=example,dc=com
The LDAP modify request failed: 19 (Constraint Violation)
Additional Information: The password value for attribute userPassword was
found to be unacceptable: The provided password is shorter than the minimum
required length of 6 characters
把口令换成 12 位后 ADD 成功。读回 userPassword 验证默认存储方案:
root@wrends01:/opt/wren-ds# ./bin/ldapsearch -p 1389 -D 'cn=Directory Manager' -w q1w2e3r4 \
-b 'uid=carol,ou=people,dc=example,dc=com' '(objectClass=inetOrgPerson)' userPassword
dn: uid=carol,ou=people,dc=example,dc=com
userPassword: {SSHA}bRCYj2c66w5vyau7p5x1e/q86dhM4Gcj1IO1gw==
💡 技术拓展:口令存储方案(把明文口令变成目录里那串密文的算法)远不止 SSHA。5.1.1 实测注册了 17 种,主流几类对比——
方案 前缀 特点 适用 Salted SHA-1 {SSHA}快、有盐,SHA-1 碰撞弱点不影响口令存储但强度一般 默认值,兼容老客户端 Salted SHA-512 {SSHA512}同族更强摘要,Root DN 默认用它 折中之选 PBES2/PBKDF2 {PBKDF2}迭代拉伸,抗离线爆破 生产推荐 Bcrypt {BCRYPT}自适应成本因子 抗 GPU 爆破,验证慢 AES/3DES {AES}等可逆加密 需要把口令转发给后端系统的场景 Clear {CLEAR}明文 仅测试 本机普通用户实测落在默认
{SSHA},Root DN 落在{SSHA512};生产建议把ds-cfg-default-password-storage-scheme在线改为 PBKDF2 或 SSHA512。
其余校验器(实测均存在,默认仅 Length-Based 启用):Character Set、Dictionary、Repeated Characters、Similarity-Based、Unique Characters、Attribute Value。策略里所有锁定期限(lockout-failure-count、idle-lockout-interval、max-password-age、password-history-count)默认 0 即关闭,生产按需在线开启。Root 策略与 Default 策略的差异实测只有两处:存储方案 SSHA512、ds-cfg-password-change-requires-current-password: true。
5.5 TLS 与密钥管理
密钥体系实测四件套:
| 文件 | 用途 | 对应配置 |
|---|---|---|
config/keystore + keystore.pin | LDAP/LDAPS/StartTLS 服务端证书 server-cert | cn=JKS,cn=Key Manager Providers |
config/admin-keystore + admin-keystore.pin | 管理连接器证书 admin-cert | cn=Administration,cn=Key Manager Providers |
config/truststore | 服务端信任库 | cn=JKS,cn=Trust Manager Providers |
config/ads-truststore + .pin | 复制节点互信 | cn=Blind Trust / ads-truststore 后端 |
实测 keystore 内容:
root@wrends01:/opt/wren-ds# keytool -list -keystore config/keystore -storepass "$(cat config/keystore.pin)"
Keystore type: JKS
Keystore provider: SUN
Your keystore contains 1 entry
server-cert, Nov 2, 2026, PrivateKeyEntry,
Certificate fingerprint (SHA-256): 39:9A:91:83:AB:E4:0B:2F:AC:2B:07:3D:AE:25:4C:30:7B:94:86:2E:04:23:6E:A8:67:E2:C5:89:A1:98:48:F8
cn=Crypto Manager 实测 ds-cfg-ssl-cert-nickname: ads-certificate、ds-cfg-ssl-encryption: false(复制通道口令加密关闭)。
TLS 路径实测结论(本机 OpenJDK 17.0.20.1 + 5.1.1):
- LDAPS 1636:
openssl s_client -tls1_2握手成功、证书可取回,但ldapsearch -H ldaps://报Can't contact LDAP server (-1)(B1 排障 11.1 已录); - StartTLS 1389:用自带客户端
-q实测失败:
root@wrends01:/opt/wren-ds# ./bin/ldapsearch -p 1389 -q -D 'cn=Directory Manager' -w q1w2e3r4 \
-b 'dc=example,dc=com' -s base '(objectClass=*)' dn
The LDAP search request failed: 81 (Server Connection Closed)
Additional Information: An error occurred during establishment of a
connection: org.forgerock.opendj.ldap.LdapException: Local Error: SSL
handshake failed
- 管理连接器 4444:握手成功但会话即断(3.3 实测)。
- 服务端
logs/errors实测累计 29 条GRIZZLY0013: Exception during FilterChain execution ... ArrayIndexOutOfBoundsException ... SSLBaseFilter.java。
结论:5.1.1 的 TLS 传输层在该 JDK 组合下整体不可用,加密需求要么换 JDK 做回归,要么在网络层用 stunnel/反向代理终结 TLS,明文端口只绑回环或受控网段。
5.6 日志体系
access 日志器实测:
dn: cn=File-Based Access Logger,cn=Loggers,cn=config
ds-cfg-java-class: org.opends.server.loggers.TextAccessLogPublisher
ds-cfg-enabled: true
ds-cfg-log-file: logs/access
ds-cfg-log-file-permissions: 640
ds-cfg-suppress-internal-operations: true
ds-cfg-asynchronous: true
ds-cfg-rotation-policy: cn=24 Hours Time Limit Rotation Policy,cn=Log Rotation Policies,cn=config
ds-cfg-rotation-policy: cn=Size Limit Rotation Policy,cn=Log Rotation Policies,cn=config
ds-cfg-retention-policy: cn=File Count Retention Policy,cn=Log Retention Policies,cn=config
error 日志器实测:ds-cfg-default-severity 同时含 warning/error/notice,ds-cfg-asynchronous: false(错误日志同步写,保证崩溃前不丢),轮转 7 天 + 大小双策略。
实测日志目录与文件格式:
root@wrends01:/opt/wren-ds# ls -la logs/
total 268
drwxr-xr-x 2 root root 4096 Nov 2 14:11 .
drwxr-xr-x 18 root root 4096 Nov 2 12:40 ..
-rw-r----- 1 root root 33555 Nov 2 14:15 access
-rw-r----- 1 root root 2506 Nov 2 14:15 audit
-rw-r----- 1 root root 83785 Nov 2 14:14 errors
-rw-r--r-- 1 root root 94423 Nov 2 14:15 ldap-access.audit.json
-rw-r----- 1 root root 0 Nov 2 12:40 replication
-rw-r--r-- 1 root root 21035 Nov 2 14:14 server.out
-rw-r----- 1 root root 3 Nov 2 14:11 server.pid
access 日志一行一操作,实测样例(BIND/SEARCH/DISCONNECT 三段式,含耗时 etime 毫秒):
[02/Nov/2026:12:40:32 +0000] BIND REQ conn=0 op=0 msgID=1 version=3 type=SIMPLE dn="cn=Directory Manager"
[02/Nov/2026:12:40:32 +0000] BIND RES conn=0 op=0 msgID=1 result=0 authDN="cn=Directory Manager,cn=Root DNs,cn=config" etime=5
[02/Nov/2026:12:40:32 +0000] DISCONNECT conn=0 reason="Client Disconnect"
审计日志器实测默认就是启用状态(cn=File-Based Audit Logger enabled=true,logs/audit),且 JSON 版 access 审计(ldap-access.audit.json)也在写——排障时优先看这两个文件而不是 errors。
5.7 复制(多主同步)
提供者实测:
dn: cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config
ds-cfg-enabled: true
ds-cfg-java-class: org.opends.server.replication.plugin.MultimasterReplication
dn: cn=domains,cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config
objectClass: ds-cfg-branch
cn: domains
提供者默认启用但 cn=domains 为空,config.ldif 中实测无任何 ds-cfg-replication-server 条目——即本机是单节点、未初始化复制域。启用复制的官方路径是 dsreplication enable(需管理连接器),受 5.5 的 TLS 缺陷阻塞,实测无法在本机完成双节点初始化,故复制参数表仅给出配置面结构:每个复制域一个 cn=<baseDN>,cn=domains,... 条目,节点间用 4444 管理端口 + ads-truststore 互信,冲突解决依赖 ds-sync-conflict/ds-sync-hist 索引(5.2 实测存在)。待上游修复 TLS 后按官方 Admin Guide 的 dsreplication 流程实施。
5.8 条目缓存与工作队列
实测两个条目缓存器均为关闭:
dn: cn=FIFO,cn=Entry Caches,cn=config
ds-cfg-enabled: false
ds-cfg-cache-level: 1
ds-cfg-java-class: org.opends.server.extensions.FIFOEntryCache
dn: cn=Soft Reference,cn=Entry Caches,cn=config
ds-cfg-enabled: false
ds-cfg-cache-level: 2
ds-cfg-java-class: org.opends.server.extensions.SoftReferenceEntryCache
💡 技术拓展:条目缓存的淘汰策略不止 FIFO/软引用两种。对比——
策略 机制 特点 FIFO 先进先出淘汰 开销最小,命中率一般 Soft Reference 交给 JVM GC 按内存压力回收 与堆大小自适应 LRU(其他目录服务常见) 最近最少使用 命中率高但维护成本大 5.1.1 出厂两者皆关(实测),JE 后端自带页缓存兜底;高读场景可在线开启 FIFO 并配合堆内存调优。
工作队列实测:
dn: cn=Work Queue,cn=config
ds-cfg-java-class: org.opends.server.extensions.TraditionalWorkQueue
ds-cfg-max-work-queue-capacity: 1000
排队容量 1000,超出后新连接被拒(配合 max-allowed-client-connections 做入口限流)。
5.9 REST/HTTP 端点
HTTP 处理器默认关闭(5.3 实测),但端点配置已就位:
dn: ds-cfg-base-path=/api,cn=HTTP Endpoints,cn=config
objectClass: ds-cfg-rest2ldap-endpoint
ds-cfg-enabled: true
ds-cfg-base-path: /api
ds-cfg-config-directory: config/rest2ldap/endpoints/api
dn: ds-cfg-base-path=/admin,cn=HTTP Endpoints,cn=config
即:打开 cn=HTTP Connection Handler 的 ds-cfg-enabled 后,/api 提供 rest2ldap 数据接口(配置在 config/rest2ldap/endpoints/api),/admin 提供管理界面。这是 Wren:DS 区别于传统 LDAP 服务器的核心能力之一(选型依据见 《Wren:DS 介绍与选型指南》)。REST 接口的启用与调用属 API 篇范畴,本篇只交代配置面。
5.10 插件与 Root DN
实测默认启用的插件(cn=Plugins 下 ds-cfg-enabled: true):
dn: cn=Change Number Control,cn=Plugins,cn=config
dn: cn=Entry UUID,cn=Plugins,cn=config
dn: cn=Fractional Replication LDIF Import,cn=Plugins,cn=config
dn: cn=LastMod,cn=Plugins,cn=config
dn: cn=LDAP Attribute Description List,cn=Plugins,cn=config
dn: cn=Password Policy Import,cn=Plugins,cn=config
dn: cn=Profiler,cn=Plugins,cn=config
UID Unique Attribute 实测 ds-cfg-enabled: false——即默认不强制 uid 全局唯一(靠 schema 语法与索引去重),多值 uid 冲突场景应在线开启它。Referential Integrity、7-Bit Clean 也默认关闭。
Root DN 条目实测:
dn: cn=Directory Manager,cn=Root DNs,cn=config
ds-cfg-alternate-bind-dn: cn=Directory Manager
ds-rlim-size-limit: 0
ds-rlim-time-limit: 0
ds-rlim-idle-time-limit: 0
ds-rlim-lookthrough-limit: 0
ds-pwp-password-policy-dn: cn=Root Password Policy,cn=Password Policies,cn=config
userPassword: {SSHA512}fNKBmVosm/WYiSqRtF795pOTvWTQLsbMjzUMfRUQgeLWAQEAeshcl1G1MFI1UQNsEzqmCCvX1k1JDmJjrc42IRQIWo3GzH4M
四个 ds-rlim-* 全 0:Root DN 不受 5.1 的全局搜索限制约束,这也是运维脚本用 Directory Manager 跑大搜索不会撞 size-limit 的原因。
5.11 JVM 堆参数(java.properties)
服务端堆不在环境变量而在 config/java.properties,实测生效行与进程证据:
root@wrends01:/opt/wren-ds# grep -n 'start-ds.java-args' config/java.properties | grep -v '^#'
64:start-ds.java-args=-server -Xms256m -Xmx256m
root@wrends01:/opt/wren-ds# ps -ef | grep '[D]irectoryServer'
root 80 1 18 14:11 ? 00:00:05 /usr/bin/java -server -Xms256m -Xmx256m -Dorg.opends.server.scriptName=start-ds org.opends.server.core.DirectoryServer --configFile /opt/wren-ds/config/config.ldif
该文件按工具分档,实测全部 38 行非注释配置如下(grep -vE '^#|^$' config/java.properties):
start-ds.java-args=-server -Xms256m -Xmx256m
import-ldif.offline.java-args=-server
import-ldif.online.java-args=-Xms8m -client
export-ldif.offline.java-args=-server
export-ldif.online.java-args=-Xms8m -client
backup.offline.java-args=-server
backup.online.java-args=-Xms8m -client
restore.offline.java-args=-server
restore.online.java-args=-Xms8m -client
dsreplication.offline.java-args=-server
dsreplication.java-args=-Xms8m -client
verify-index.java-args=-server
rebuild-index.java-args=-server
backendstat.java-args=-server
ldifdiff.java-args=-server
ldifmodify.java-args=-server
ldifsearch.java-args=-server
makeldif.java-args=-server
upgrade.java-args=-server
encode-password.java-args=-server
ldapsearch.java-args=-Xms8m -client -Djdk.tls.client.protocols=TLSv1.2
ldapmodify.java-args=-Xms8m -client
ldapdelete.java-args=-Xms8m -client
ldapcompare.java-args=-Xms8m -client
ldappasswordmodify.java-args=-Xms8m -client
dsconfig.java-args=-Xms8m -client -Djdk.tls.client.protocols=TLSv1.2
list-backends.java-args=-Xms8m -client
manage-account.java-args=-Xms8m -client
manage-tasks.java-args=-Xms8m -client
status.java-args=-Xms8m -client
stop-ds.java-args=-Xms8m -client
control-panel.java-args=-Xms64m -Xmx128m -client
setup.java-args=-Xms8m -client
uninstall.java-args=-Xms8m -client
create-rc-script.java-args=-Xms8m -client
base64.java-args=-Xms8m -client
overwrite-env-java-home=false
overwrite-env-java-args=false
规律:操作数据库的重工具(离线导入/导出、备份/恢复、索引校验重建、复制初始化、ldif 比对)走 -server 大堆档,轻客户端工具 -Xms8m -client。另有两处值得注意的实测发现:ldapsearch 与 dsconfig 两行带 -Djdk.tls.client.protocols=TLSv1.2,即发行包自带把这两个工具的 TLS 客户端钉在 1.2 的补偿参数(与 5.5 的握手缺陷相关,但实测仍不足以修复服务端传输层问题)。改任何一行都要重启对应进程才生效;start-ds 行改完重启服务,用 ps -ef 复核(同 《Ubuntu 22.04 安装 Wren:DS 5.1.1 指南》 第七章)。
六、生产配置模板
适用场景:16GB 内存、SSD、万级条目、读多写少的企业目录(认证绑定+应用查询)。JVM 堆遵循 256–512MB 上限约束取 512m,其余为在线可改项,全部给出 ldapmodify 载荷。
root@wrends01:/opt/wren-ds# cat > /tmp/prod-tune.ldif <<'EOF'
dn: cn=config
changetype: modify
replace: ds-cfg-lookthrough-limit
ds-cfg-lookthrough-limit: 10000
-
replace: ds-cfg-time-limit
ds-cfg-time-limit: 30 seconds
-
replace: ds-cfg-reject-unauthenticated-requests
ds-cfg-reject-unauthenticated-requests: true
-
replace: ds-cfg-max-allowed-client-connections
ds-cfg-max-allowed-client-connections: 2000
-
replace: ds-cfg-default-password-storage-scheme
ds-cfg-default-password-storage-scheme: cn=Salted SHA-512,cn=Password Storage Schemes,cn=config
dn: cn=Default Password Policy,cn=Password Policies,cn=config
changetype: modify
replace: ds-cfg-lockout-failure-count
ds-cfg-lockout-failure-count: 5
-
replace: ds-cfg-lockout-duration
ds-cfg-lockout-duration: 10 minutes
-
replace: ds-cfg-max-password-age
ds-cfg-max-password-age: 90 days
-
replace: ds-cfg-require-secure-authentication
ds-cfg-require-secure-authentication: true
dn: cn=FIFO,cn=Entry Caches,cn=config
changetype: modify
replace: ds-cfg-enabled
ds-cfg-enabled: true
EOF
root@wrends01:/opt/wren-ds# ./bin/ldapmodify -p 1389 -D 'cn=Directory Manager' -w q1w2e3r4 -f /tmp/prod-tune.ldif
⚠️ 模板中
ds-cfg-require-secure-authentication: true要求口令修改/绑定走 TLS——在 5.5 的 TLS 缺陷修复前开启会把所有明文绑定拒掉,请配合 stunnel 或修复后的 TLS 再启用;其余各项已在本机实测通道(3.2)可在线生效。堆内存改java.properties第 64 行为-Xms512m -Xmx512m并重启,验收口径:ps -ef见 512m、logs/errors见536870912 bytes heap size。
七、常见问题
- dsconfig/status 报
Server Connection Closed或连不上 4444:5.1.1 + OpenJDK 17.0.20 的 TLS 传输层缺陷(5.5 实测 29 条 GRIZZLY0013)。绕法:在线配置走ldapmodify cn=config(3.2),离线走停机改文件(3.4)。 - 运行中编辑 config.ldif 不生效/被覆盖:文件只在启动时读入,内存态在保存配置时反向覆盖磁盘。改配置用 3.2 通道,或先
stop-ds。 - 设短口令报
Constraint Violation (19):Length-Based 校验器min-password-length: 6(5.4 实测回显),属预期行为;要放宽就改校验器条目而非关策略。 - 匿名客户端能读到根条目:
reject-unauthenticated-requests: false默认值所致(5.1 实测),按生产模板改 true。 - 改了 lookthrough-limit 想确认是否落盘:
grep ds-cfg-lookthrough-limit config/config.ldif,在线改会即时写回(3.2 实测第 40 行变化)。 - rebuild-index/verify-index 在线跑报
ENV_LOCKED:JE 写锁互斥,必须停机执行(B1 排障 11.3 实录)。
八、参考链接
- Wren:DS 官方文档站 Configuration 章节:https://wrensecurity.org/docs/ (Admin Guide,查询日期 2026-11-02)
- 官方源码仓库(配置 schema 定义
config.ldif模板):https://github.com/WrenSecurity/wrends - 本专栏配套篇目:选型见 《Wren:DS 介绍与选型指南》,安装与 JVM 堆验收见 《Ubuntu 22.04 安装 Wren:DS 5.1.1 指南》,CLI 命令与工具详解见 《Wren:DS 5.1.1 常用 CLI 命令与工具详解》