OpenLDAP 企业实操:TLS、只读复制、权限与恢复
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本篇使用两台全新专用 Ubuntu 24.04 VM:ldap1.internal.example.com 为唯一写主,ldap2.internal.example.com 为只读副本。LDAP(轻量级目录访问协议)客户端可读故障切换;主节点失联时不自动把副本变成第二写主。
1. 主机与证书#
两台 VM 安装批准补丁的 OpenLDAP 2.6,限制私网 389 仅应用、运维及复制节点;默认拒绝其他来源。备份目标为独立加密存储。
sudo apt-get update
sudo apt-get install -y slapd ldap-utils gettext-base
sudo systemctl stop slapd
sudo install -d -m 0750 -o openldap -g openldap /etc/ldap/tls /etc/ldap/enterprise.d /var/lib/ldap/enterprise企业 CA(证书颁发机构)分别签发匹配主机 DNS 名的 server.pem/server.key;投递到 /etc/ldap/tls/,私钥仅 openldap 读、权限 640,不共享两台主机私钥。配置文件只使用 StartTLS(在 LDAP 连接上升级加密),simple_bind=128 拒绝明文密码绑定。
2. 配置唯一写主#
下载 slapd.conf.template,以下在 ldap1 执行。管理员密码由企业秘密系统投递 /secure/ldap-admin-password,复制与只读服务账号密码独立,不使用同一个密码。
export ROOT_HASH=$(sudo slappasswd -T /secure/ldap-admin-password)
umask 077
envsubst '${ROOT_HASH}' < slapd.conf.template > slapd.conf
cat >> slapd.conf <<'EOF'
overlay syncprov
syncprov-checkpoint 100 10
syncprov-sessionlog 1000
EOF
sudo slaptest -f slapd.conf -F /etc/ldap/enterprise.d
sudo chown -R openldap:openldap /etc/ldap/enterprise.d
sudo chmod -R o-rwx /etc/ldap/enterprise.d将 systemd override 保存为 /etc/systemd/system/slapd.service.d/enterprise.conf,替换实际私网 IP;创建父目录后写入:
[Service]
ExecStart=
ExecStart=/usr/sbin/slapd -F /etc/ldap/enterprise.d -h "ldap://127.0.0.1:389 ldap://REPLACE_PRIVATE_IP:389 ldapi:///" -u openldap -g openldap -d 0
Type=simplesudo systemctl daemon-reload
sudo systemctl start slapd
sudo systemctl status slapd
export LDAPTLS_CACERT=/etc/ldap/tls/ca.pem
ldapwhoami -x -ZZ -H ldap://ldap1.internal.example.com -D cn=admin,dc=example,dc=com -y /secure/ldap-admin-password准备 base.ldif:替换两处 SSHA 哈希为 slappasswd -T 对对应秘密文件的输出,不填明文:
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: Enterprise Lab
dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: people
dn: cn=replicator,dc=example,dc=com
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: replicator
userPassword: REPLACE_REPLICATION_PASSWORD_HASH
dn: cn=reader,dc=example,dc=com
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: reader
userPassword: REPLACE_READER_PASSWORD_HASH
dn: uid=restore-probe,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
uid: restore-probe
cn: Restore Probe
sn: Probeldapadd -x -ZZ -H ldap://ldap1.internal.example.com -D cn=admin,dc=example,dc=com -y /secure/ldap-admin-password -f base.ldif3. 配置只读副本#
ldap2 使用同样基础模板、自己的证书和独立本地 root 密码;不追加 syncprov 主库片段,追加以下 syncrepl(同步复制)配置,再转换到自己的 enterprise.d 并启动同样 systemd unit:
syncrepl rid=001
provider=ldap://ldap1.internal.example.com
bindmethod=simple
binddn="cn=replicator,dc=example,dc=com"
credentials="REPLACE_FROM_SECRET_FILE"
searchbase="dc=example,dc=com"
type=refreshAndPersist
retry="5 5 60 +"
starttls=critical
tls_cacert=/etc/ldap/tls/ca.pem
tls_reqcert=demand
updateref ldap://ldap1.internal.example.com复制密码存在受保护配置中,由秘密系统生成文件;不提交 Git。starttls=critical 与 tls_reqcert=demand 必须保留,握手失败停止复制。replicator 需要读取密码哈希以复制用户,所以比普通 reader 权限高,不能给应用使用。
ldapsearch -x -ZZ -H ldap://ldap2.internal.example.com -D cn=reader,dc=example,dc=com -y /secure/ldap-reader-password -b dc=example,dc=com '(uid=restore-probe)' dn必须出现同一条目录记录。对两端查询 suffix 的 contextCSN(复制水位)并检查 slapd 复制日志;只看 TCP 连通不算复制成功。
4. 权限与故障验收#
- 不加
-ZZ执行密码绑定必须失败;错误 CA/主机名必须失败,禁止TLS_REQCERT=never。 - reader 查询用户的 userPassword 属性不得返回值;reader 提交修改应报 insufficientAccessRights。
- 应用写入只允许指定写入口,不能因客户端自动追随 referral(重定向)把只读验证变成对主库写入。
- 停止 ldap1,ldap2 仍能读取已复制用户;新写入不可用。恢复 ldap1 后写入新的合成记录,等待副本追平。需要自动写高可用时应另选有明确仲裁/隔离设计的目录方案,不能直接开启多主。
5. 备份与独立恢复#
在维护窗口停止本次测试主库,导出配置及数据;全量导出含密码哈希,必须权限 600、加密、限制访问:
sudo systemctl stop slapd
sudo sh -c 'umask 077; slapcat -F /etc/ldap/enterprise.d -n 0 > /secure/config.ldif'
sudo sh -c 'umask 077; slapcat -F /etc/ldap/enterprise.d -b dc=example,dc=com > /secure/data.ldif'
sudo systemctl start slapd
# 上传到企业加密备份库,记录校验和;不要只保留同一块磁盘上的文件。在第三台隔离 VM 安装相同版本、自己的证书,使用相同模板建立空 data 目录,但不配置复制,以免接入生产。停 slapd 后执行:
sudo slapadd -F /etc/ldap/enterprise.d -b dc=example,dc=com -l /secure/data.ldif
sudo chown -R openldap:openldap /var/lib/ldap/enterprise
sudo systemctl start slapd通过恢复主机真实证书域名验证用户数量、probe、reader ACL(访问控制列表)及合成用户绑定;禁止在生产已有数据目录运行 slapadd。升级先在恢复 VM 验证 schema/overlay/密码算法,再升只读副本,最后维护窗口升级写主;失败恢复匹配版本与备份,不盲降数据库文件格式。