本文是在centos7环境下通过yum安装openldap2.4.44,并配置增量复制(Delta-syncrepl)环境
官网对于增量复制介绍:https://www.openldap.org/doc/admin24/replication.html#Delta-syncrepl%20replication
Delta-syncrepl 是 syncrepl 的一种基于变更日志的变体,旨在解决上述情况。Delta-syncrepl 通过在提供程序的单独数据库中维护可选深度的变更日志来工作。复制消费者检查变更日志以查找它需要的更改,只要变更日志包含所需的更改,消费者就会从变更日志中获取更改并将它们应用到其数据库中。但是,如果消费者太不同步(或完全为空),则使用传统的 syncrepl 使其更新,然后复制切换回 delta-syncrepl 模式。
**注意:**由于数据库状态同时存储在供应商的变更日志数据库和主数据库中,因此在恢复数据库或将其复制到另一台机器时,使用 slapcat/slapadd 备份/恢复变更日志数据库和主数据库非常重要
一、准备
-
更换yum源
# "备份原来的源" mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # "下载、替换为阿里云源配置" wget https://mirrors.aliyun.com/repo/Centos-7.repo -O /etc/yum.repos.d/CentOS-Base.repo # "更新yum缓存" yum clean all yum makecache
-
关闭防火墙和selinux
[root@localhost ~]# systemctl stop firewalld [root@localhost ~]# systemctl disable firewalld [root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config [root@localhost ~]# setenforce 0
二、yum安装(主从节点都执行)
yum install -y openldap openldap-servers openldap-clients compat-openldap openldap-servers-sql openldap-devel
#可以通过rpm -ql ,来查看每个安装包都有哪些文件
软件包 软件包说明 openldap 服务端和客户端必须用的库文件 openldap-clients 在LDAP服务端使用,用户增删改查的命令行环境 openldap-servers 用于启动服务和配置,包括单独的LDAP后台守护进程 openldap-servers-sql 支持SQL模块 compat-openldap openldap兼容性库环境 openldap-devel 开发包,可选
-
安装过程中会自动创建ldap用户和ldap组(确认安装完毕)
[root@localhost cn=config]# grep ldap /etc/passwd ldap:x:55:55:OpenLDAP server:/var/lib/ldap:/sbin/nologin [root@localhost cn=config]# grep ldap /etc/group ldap:x:55:
-
通过slapd -VV查看安装的版本
[root@localhost openldap-servers]# slapd -VV @(#) $OpenLDAP: slapd 2.4.44 (Feb 23 2022 17:11:27) $ mockbuild@x86-01.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd
yum源安装默认位置:/etc/openldap
三、主节点配置
yum源安装,默认使用的是dbd的数据库,但是官网在该版本建议使用mdb(之后的版本也会使用mdb,抛弃了dbd和hdb),因此更换数据库为mdb。
网上很多的资料显示需要复制数据库模版:如下
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
但是对于mdb数据库而言,不需要此步骤
1、启动ldap,并设置开机启动
systemctl enable slapd && systemctl start slapd && systemctl status slapd
2、创建配置文件
执行slappasswd命令,得到想要设置的管理员密码加密后的结果(此处设置为123456)
下方输出的{SSHA}GaIBaSF+IGfjfYb0daeo4gCUeR/9RUa3
则为加密后的结果,在下面的配置文件中需要用到
[root@localhost ~]# slappasswd -s 123456
{SSHA}GaIBaSF+IGfjfYb0daeo4gCUeR/9RUa3
在/etc/openldap目录下,创建slapd.conf文件,并编写增量复制相关配置
虽然在2.4.x的某个版本后,官网不再使用slapd.conf文件作为主配置文件,而是使用的是slapd.d目录中的配置文件(并且不支持直接修改该目录下的文件,若想修改配置需要编写ldif文件修改)
但是对于增量复制的相关配置,官网给出的文档,依然是slapd.conf的方式进行的配置
所以此处进行slapd.conf的编写,再通过
slaptest -f slapd.conf -F slapd.d
命令生成slapd.d的配置目录
cd /etc/openldap
vim slapd.conf
具体配置内容如下:
官网配置参考:https://www.openldap.org/doc/admin24/replication.html#Delta-syncrepl
# 此处引入所有的schema 具体的schema在/etc/openldap/schema目录下,
# 不同的版本有schema有不同的区别,根据实际情况进行引入
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/pmi.schema
# Allow LDAPv2 client connections. This is NOT the default.
# 允许LDAPv2客户端连接。这不是默认值
allow bind_v2
# 这两个文件包含启动 slapd 进程所用的 PID(进程 ID)和一些参数
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
# Load dynamic backend modules
# - modulepath is architecture dependent value (32/64-bit system)
# - back_sql.la overlay requires openldap-server-sql package
# - dyngroup.la and dynlist.la cannot be used at the same time
#设置模块路径位置
#对应32位操作系统
modulepath /usr/lib/openldap
#对应64位操作系统
modulepath /usr/lib64/openldap
#加载accesslog overlay
moduleload accesslog.la
#加载mdb后端
moduleload back_mdb.la
#加载syncprov overlay
moduleload syncprov.la
#加载memberof
moduleload memberof.la
# 访问控制
# enable on-the-fly configuration (cn=config)
database config
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by * none
# enable server status monitoring (cn=monitor)
# `cn=directory manager,dc=cbpm,dc=com`根据自己的实际情况填写
database monitor
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by dn.exact="cn=directory manager,dc=cbpm,dc=com" read
by * none
#配置change log数据库,更新操作对应的日志记录就存储在这个数据库中
#这个数据库是增量复制环境所需要的
database mdb
maxsize 85899345920
suffix "cn=accesslog"
rootdn "cn=accesslog"
#使用上方加密后的结果
rootpw {SSHA}GaIBaSF+IGfjfYb0daeo4gCUeR/9RUa3
#这一项配置的是更新日志的存储路径,注意accesslog是一个目录而不是一个文件,从directory 这个关键字也可得知。
#=====注意=======此处需要先创建出如下的目录,否则启动会报错
directory /var/lib/ldap/accesslog
index default eq
index entryCSN,objectClass,reqEnd,reqResult,reqStart,reqDN
#设置让dn管理员可无限制地搜索
limits dn.exact="cn=directory manager,dc=cbpm,dc=com" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited
#配置复制引擎
overlay syncprov
syncprov-nopresent TRUE
syncprov-reloadhint TRUE
#配置主数据库,即目录树数据存储的数据库
database mdb
maxsize 85899345920
#表示目录数的根节点,一切的数据存储都是基于该节点进行存储的,所以它是base节点。
suffix "dc=cbpm,dc=com"
#checkpoint 确定写入真实数据库前保留在事务日志中的数据量(以 KB 为单位)以及两次写操作之间的时间(以分钟为单位)。
checkpoint 1024 15
#表示管理员。 此处根据实际情况自定义,我这里的管理员为`cn=directory manager,dc=cbpm,dc=com`
rootdn "cn=directory manager,dc=cbpm,dc=com"
#表示管理员密码 #使用上方加密后的结果
rootpw {SSHA}GaIBaSF+IGfjfYb0daeo4gCUeR/9RUa3
#表示主数据库的数据存储路径,这个路径最好不要与change log数据库的路径一样
directory /var/lib/ldap
# syncprov 特定索引
index entryCSN eq
index entryUUID eq
# syncrepl 主数据库
##设置复制检查点
overlay syncprov
syncprov-checkpoint 1000 60
# 开启memberof
overlay memberof
#设置日志级别
loglevel 17152
#设置overlay accesslog
overlay accesslog
logdb cn=accesslog
logops writes
logsuccess TRUE
#每天扫描一次操作日志数据库, 并清除7天前的条目
logpurge 07+00:00 01+00:00
#设置让dn管理员可无限制地搜索
limits dn.exact="cn=directory manager,dc=cbpm,dc=com" time.soft=unlimited time.hard=unlimited size.soft=unlimited size.hard=unlimited
注意:上述配置中的 directory /var/lib/ldap/accesslog目录需要提前创建,否则会报错
第三步中会删除一次/var/lib/ldap/下的所有内容,删除完之后需要创建
mkdir /var/lib/ldap/accesslog
3、删除原有配置,生成新配置
#进入openldap安装目录
cd /etc/openldap
#备份原有配置文件目录slapd.d
mv slapd.d slapd.d_bak
#创建新的slapd.d目录
mkdir slapd.d
#清除/var/lib/ldap下的目录
rm -rf /var/lib/ldap/*
#需要提前创建出配置文件中directory所对应的目录,否则会报错
mkdir /var/lib/ldap/accesslog
#根据新的slapd.con配置文件,生成新的配置文件到新建的slapd.d目录下
#执行该命令时会报错,属于正常现象,因为我们在配置文件中修改了数据库为mdb,重启后就好了
#执行完之后可以进入slapd.d目录下,可以看到已经生成了相应的配置文件
#报错内容如下:
#63900159 mdb_db_open: database "cn=accesslog" cannot be opened: No such file or directory (2). #Restore from backup!
#63900159 backend_startup_one (type=mdb, suffix="cn=accesslog"): bi_db_open failed! (2)
#slap_startup failed (test would succeed using the -u switch)
slaptest -f slapd.conf -F slapd.d
slaptest -u
#赋予权限
chown -R ldap.ldap /var/lib/ldap
chown -R ldap.ldap slapd.d
#重启ldap
systemctl restart slapd
四、从节点配置
1、启动ldap,并设置开机启动
systemctl enable slapd && systemctl start slapd && systemctl status slapd
2、创建配置文件
cd /etc/openldap
vim slapd.conf
具体配置内容如下:
官网配置参考:https://www.openldap.org/doc/admin24/replication.html#Delta-syncrepl
# 此处引入所有的schema 具体的schema在/etc/openldap/schema目录下,
# 不同的版本有schema有不同的区别,根据实际情况进行引入
# 从节点引入的schema需要与主节点一致
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/pmi.schema
# Allow LDAPv2 client connections. This is NOT the default.
allow bind_v2
##
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
##
modulepath /usr/lib/openldap
modulepath /usr/lib64/openldap
#加载memberof
moduleload memberof.la
# enable on-the-fly configuration (cn=config)
database config
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by * none
# enable server status monitoring (cn=monitor)
# `cn=directory manager,dc=cbpm,dc=com`根据自己的实际情况填写
database monitor
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by dn.exact="cn=directory manager,dc=cbpm,dc=com" read
by * none
##配置主数据库,注意,从节点不需要配置change log数据库
database mdb
maxsize 85899345920
suffix "dc=cbpm,dc=com"
checkpoint 1024 15
# 管理员账户,根据实际情况填写
rootdn "cn=directory manager,dc=cbpm,dc=com"
#密码使用和主节点一致123456 (也可以重新生成)
rootpw {SSHA}GaIBaSF+IGfjfYb0daeo4gCUeR/9RUa3
directory /var/lib/ldap
# 开启memberof
overlay memberof
##设置索引
index entryUUID eq
#配置日志级别
loglevel 17152
#配置从主节点同步数据
# provider 填写主节点的ip或者域名(10.8.0.126是我的主节点ip)
# binddn 填写dn (根据实际情况填写)\
# credentials 密码 (根据实际情况填写)
# searchbase base (根据实际情况填写)
#注意下方的中间行之间不能添加任何注释,否则会报错
syncrepl rid=0
provider="ldap://10.8.0.126:389"
bindmethod=simple
binddn="cn=directory manager,dc=cbpm,dc=com"
credentials=123456
searchbase="dc=cbpm,dc=com"
logbase="cn=accesslog"
logfilter="(&(objectClass=auditWriteObject)(reqResult=0))"
schemachecking=on
type=refreshAndPersist
retry="60 +"
syncdata=accesslog
# 配置当在从节点执行修改操作时,同时将其提交给master节点
updateref ldap://10.8.0.126
3、删除原有配置,生成新配置
#进入openldap安装目录
cd /etc/openldap
#备份原有配置文件目录slapd.d
mv slapd.d slapd.d_bak
#创建新的slapd.d目录
mkdir slapd.d
#清除/var/lib/ldap下的目录
rm -rf /var/lib/ldap/*
#根据新的slapd.con配置文件,生成新的配置文件到新建的slapd.d目录下
#执行该命令时会报错,属于正常现象,因为我们在配置文件中修改了数据库为mdb,重启后就好了
#执行完之后可以进入slapd.d目录下,可以看到已经生成了相应的配置文件
#报错内容如下:
#63900574 mdb_db_open: database "dc=cbpm,dc=com" cannot be opened: No such file or directory (2). Restore from backup!
#63900574 backend_startup_one (type=mdb, suffix="dc=cbpm,dc=com"): bi_db_open failed! (2)
#slap_startup failed (test would succeed using the -u switch)
slaptest -f slapd.conf -F slapd.d
slaptest -u
#赋予权限
chown -R ldap.ldap /var/lib/ldap
chown -R ldap.ldap slapd.d
#重启ldap
systemctl restart slapd
五、测试同步
在主节点创建user.ldif文件
#建议将ldif文件创建在非/etc/openldap的其他目录
cd ~
#编辑文件
vim user.ldif
内容如下:创建cbpm.com的根,创建Groups的ou,在Groups下创建SuperAdmin人员
dn: dc=cbpm,dc=com
objectClass: domain
objectClass: top
dc: cbpm
dn: ou=Groups,dc=cbpm,dc=com
objectClass: organizationalUnit
objectClass: top
ou: Groups
dn: cn=SuperAdmin,ou=Groups,dc=cbpm,dc=com
objectClass: groupOfUniqueNames
objectClass: top
cn: SuperAdmin
uniqueMember:: Y249YXBwQWNjb3VudCxvdT1Hcm91cHMsbz3mgLvlhazlj7gsZGM9Y2JwbSxkY
z1jb20=
执行命令进行添加:
ldapadd -x -D "cn=directory manager,dc=cbpm,dc=com" -w123456 -f user.ldif
通过Apache Directory Studio工具查看主节点:
通过Apache Directory Studio工具查看从节点:
六、自定义schema(主从节点都执行)
前提:公司需求需要新建一个CBPMPerson类,并添加Identitynumber(身份证号)的属性
因此需要自定义Schema
1、创建一个专门存放自定义schema的目录
mkdir /mySchema
cd /mySchema
touch CBPMPerson.conf
touch CBPMPerson.schema
2、编辑配置文件 CBPMPerson.conf
vim CBPMPerson.conf
输入以下内容:
# 参考自己OpenLDAP安装的路径,这个是inetorgperson类别需要的schema,如果SUP是top,则下面三行不需要引入
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
# 即引入上步骤创建的schema文件
include /mySchema/CBPMPerson.schema
3、编辑配置文件 CBPMPerson.schema
vim CBPMPerson.schema
输入以下内容:
attributeTypes: ( 3.2.2.1.4 NAME 'Identitynumber' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SINGLE-VALUE )
objectClass (
3.2.2.1.5
NAME 'CBPMPerson'
SUP inetOrgPerson STRUCTURAL
MUST ( Identitynumber ))
若是以上参数不了解的,可以参考:https://www.pudn.com/news/62e2901b55398e076bedd02d.html 中的内容介绍
4、执行slaptest命令
执行slaptest命令编译自定义的schema,生成ldif等文件
slaptest -f /mySchema/CBPMPerson.conf -F /mySchema
此时会在/mySchema目录下生成cn=config文件夹:
ls /mySchema/cn=config/cn=schema
我们自己定义的文件为cn={3}cbpmperson.ldif
5、修改生成的文件cn={3}cbpmperson.ldif
cd /mySchema/cn\=config/cn\=schema/
vim cn={3}cbpmperson.ldif
修改前:
修改后:
注意:
dn: cn=CBPMPerson,cn=schema,cn=config
第一个cn是根据ObjectClass的名字定的,
cn=scheme,cn=config
为固定写法
6、修改文件名字
[root@localhost cn=schema]# ls
cn={0}core.ldif cn={1}cosine.ldif cn={2}inetorgperson.ldif cn={3}cbpmperson.ldif
[root@localhost cn=schema]# mv cn\=\{3\}cbpmperson.ldif CBPMPerson.ldif
7、执行 slapadd命令,将该文件添加进OpenLdap库
slapadd -l /mySchema/cn\=config/cn\=schema/CBPMPerson.ldif -n 0
8、查看是否成功将自定义ldif加入到官方库中
cd /etc/openldap/slapd.d/cn\=config/cn\=schema/
ls
9、重启slapd服务
#先要赋予新的schema权限,(这里直接给slapd.d目录权限)
chown -R ldap.ldap /etc/openldap/slapd.d
#重启
systemctl restart slapd
七、补充
1、开启日志配置
生成logLevel.ldif文件
#尽量将自己创建的ldif文件放在非/etc/openldap目录下
cd ~
cat> loglevel.ldif<< EOF
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
EOF
导入logLevel.ldif
ldapmodify -Y EXTERNAL -H ldapi:/// -f loglevel.ldif
创建slapd.log文件
mkdir /var/log/openldap
touch /var/log/openldap/slapd.log
#"+73"表示指定位到文件73行
vim /etc/rsyslog.conf +73
#**在73行**local7.* /var/log/boot.log***
#73行的下一行增加如下内容
local4.* /var/log/openldap/slapd.log
重启系统日志服务与ldap服务
systemctl restart rsyslog
systemctl restart slapd
systemctl status slapd