版本説明

當前版本 2.4.44

slapd -V

@(#) $OpenLDAP: slapd 2.4.44 (Jan 29 2019 17:42:45) $

        mockbuild@x86-01.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd

遷移至 2.4.46

slapd -V

@(#) $OpenLDAP: slapd 2.4.46 (Jul  8 2024 20:14:24) $

       mockbuild@VM-228-36-TS3:/builddir/build/BUILD/openldap-2.4.46/openldap-2.4.46/servers/slapd

OpenLDAP 2.4.44 的 slapcat 備份(LDIF)可以安全導入到 2.4.46,這是 同一主版本(2.4.x)內的官方兼容升級路徑,不會有數據結構不兼容問題;OpenLDAP 2.4.x 屬於同一穩定分支,2.4.46 只是 bugfix / security 修復,數據庫 backend(hdb / mdb)格式 不變

當前依舊使用物理機方式安裝:

### 查詢當前可用版本
yum list openldap openldap-servers

### 安裝當前版本
yum install -y openldap-servers openldap-clients

### 啓動
systemctl start slapd

### 開機自啓
systemctl enable slapd

遷移準備

2.4.44備份

### 備份命令
/usr/sbin/slapcat -v -l /mnt/ldap-$(date +%Y%m%d).ldif

當前使用簡易備份腳本:

#!/bin/bash
date_str=`date -d "30 days ago" +%Y%m%d`
rm_path=/mnt/ldap-${date_str}.ldif
echo "start to backup ldap data...."

/usr/sbin/slapcat -v -l /mnt/ldap-$(date +%Y%m%d).ldif

echo "Delete files backed up 30 days ago"
rm -rf $rm_path

會得到備份文件格式如下:

ldap備份遷移_ldap

2.4.46還原備份內容

1、讓 slapd 適配 ldif,確認 ldif 的真實 Base DN

grep -E '^dn: dc=' ldap-20260109.ldif | head -5

ldif會看到dn:dc=demo_domain,dc=com

2、修改 cn=config 中的 database(mdb/hdb)

先確認數據庫 DN:

ldapsearch -Y EXTERNAL -H ldapi:/// \
  -b "cn=config" "(olcSuffix=*)" dn olcSuffix

會看到類似(這是默認配置dc):

dn: olcDatabase={2}mdb,cn=config
olcSuffix: dc=my-domain,dc=com

3、改 suffix 為 ldif 中的 DN

ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=demo_domain,dc=com
EOF

4、同步 rootDN

ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=demo_domain,dc=com
EOF

5、建一個臨時 slapd.conf

cat > /root/slapd.conf <<'EOF'
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/inetorgperson.schema

pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
EOF

### 創建指定目錄
ls -l /root/slapd.conf
mkdir -p /root/schema-gen

6、轉換成 cn=config

slaptest -f /root/slapd.conf -F /root/schema-gen

### 查看是否轉換成功
ls -lh /root/schema-gen/cn=config/cn=schema/

ldap備份遷移_ldap_02

7、拷貝 schema 到正式目錄

### 提前停止
systemctl stop slapd

### 拷貝動作
cp /root/schema-gen/cn=config/cn=schema/*.ldif \
   /etc/openldap/slapd.d/cn=config/cn=schema/
   
### 修改權限,防止出現權限導致其它問題
chown -R ldap:ldap /etc/openldap/slapd.d
chmod -R 750 /etc/openldap/slapd.d

### 驗證 schema 是否完整
ls /etc/openldap/slapd.d/cn=config/cn=schema/

ldap備份遷移_ldap_03

8、準備導入配置文件

### 清空 mdb(防髒數據)
rm -rf /var/lib/ldap/*

### 導入命令
slapadd -v \
  -F /etc/openldap/slapd.d \
  -l /data/backup/ldap-20260109.ldif

### 修 mdb 權限
chown -R ldap:ldap /var/lib/ldap
chmod 700 /var/lib/ldap

### 啓動服務
systemctl start slapd

9、驗證是否成功

ldapsearch -x -b dc=demo_domain,dc=com dn | wc -l
ldapsearch -x -b dc=demo_domain,dc=com "(shadowLastChange=*)" dn | head
ldapwhoami -x -D "cn=admin,dc=demo_domain,dc=com" -W

10、直接重置 rootDN 密碼(不動數據)

### 生成新密碼 hash
slappasswd

slappasswd執行後輸入密碼,會生成一串SSHA,例如:{SSHA}AKFDxG/xxx;之後把這一串放到修改 cn=config 裏的 olcRootPW 即可。

ldapmodify -Y EXTERNAL -H ldapi:/// <<EOF
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}AKFDxG/xxx
EOF

立刻驗證管理員登錄

ldapwhoami -x -D "cn=admin,dc=demo_domain,dc=com" -W

總結

OpenLDAP 數據恢復,schema 永遠第一位

schema 不全,slapadd 100% 失敗