LDAP syncrepl

"LDAP的同步原理"

Posted by Stephen on February 21, 2021

前言

LDAP有两个同步机制:

  • syncrepl引擎
  • slurpd引擎(v2.4已废除)

以下仅以syncrepl引擎作为讲解内容

syncrepl引擎是以slapd作为守护线程,支持拉模式和推模式同步,含有5种同步模式。支持多主服务器之间同步数据,且实现双向同步数据

环境

系统环境

Distributor ID:	Debian
Description:	Debian GNU/Linux 10
Linux version :       4.19.128-microsoft-standard (oe-user@oe-host) 
Gcc version:         8.2.0 (GCC)

软件信息

version : 	
     osixia/openldap:1.5.0-amd64

正文

1、同步条件

  1. openldap服务器时间同步
  2. openldap软件包版本一致
  3. openldap节点相通
  4. 配置openldap同步复制,需要提供完全一样的配置及目录树信息
  5. 数据条目一致
  6. 额外的schema文件一致

2、同步参数

主服务器参数,例子

overlay syncprov	# 后端工作在overlay模式
# 设置同步条件
syncprov-checkpoint 100 10  # 当满足修改100个条目或者10分钟的条件时主动以推的方式执行
# 会话日志条目的最大数量
syncprov-sessionlog 100
# 设置同步更新时间
interval=01:00:00:00
# (interval 格式 day:hour:minitus:second)
# 匹配根域所有条目
scope=sub
# base 只与所给的dn相匹配,one只与父条目时所给DN的条目相匹配,sub只与根为所给DN的子树下所有# 条目相匹配,所以我们在master=-1中通过phpldapadmin进行备份时,选择的是sub。
# 同步属性信息
attrs="*,+"  # 同步所有属性信息
attrs="cn,sn,ou,telephoneNumber,title,l" # 同步指定属性信息
# 同步更新时是否开启schema语法检测
schemacheking=off

从服务器参数,例子

serverID 1
# 节点ID必须在整个LDAP集群中时唯一的,serverID与MySQL复制中的server-id是同等的概念
overlay syncprov
syncrepl rid=001
		provider=ldap://ip:port		# 另外一台主openldap服务器ip地址及端口
		type=refreshAndPersist		# 设置类型为持续保持同步
		searchbase="dc=gdy,dc=com"	# 从另外一台openldap服务器域同步条目
		schemacheking=on			# 开启schema语法检测功能
		bindmethod=simple			# 同步验证模式为简单模式。或修改为密文模式
		bindd="cn=Manager,dc=gdy,dc=com"	# 使用Manager用户读取目录树信息
		credentials=redhet			## 用户密码(cn=Manager)
		retry="60  +"				# 尝试时间。切记60与+号之间有空格

3、同步模式

syncrepl模式

syncrepl模式是指从slave服务器到主master服务器以拉的模式同步目录树。当主服务器对某个条目或更多条目修改条目属性时,从服务器会把修改的整个条目进行同步,而不是单独第同步修改的属性值。

一句话总结:主从模式,从服务器到到主master服务器以拉的模式同步目录树。

N-Way Multi-Master模式

N-Way Multi-Master模式主要用于多台主服务器之间进行LDAP目录树信息的同步,更好的提供了服务器的冗余性。

一句话总结:多主同步,多台主服务器之间进行LDAP目录树信息同步。

MirrorMode模式

MirrorMode属于镜像同步模式,而且主服务器互相以推的方式实现目录树条目同步,最多只允许且两台机器为主服务器。如果要添加更多节点,此时只能增加多台从服务器。而不能将添加的节点配置为主服务器。

当一台服务器出现故障时,另一台服务器立即对外提供验证服务。当异常服务器恢复正常时,会自动通过另外一个节点所添加或修改的条目信息进行同步,并应用在本地。

一句话总结:镜像同步,主服务器之间以推模式同步数据,最多只允许且两台主服务器,其他只能从服务器。故障时互补。

syncrepl Proxy模式

syncrepl Proxy将主服务器隐藏起来,而代理主机上边通过syncrepl从服务器上以拉的方式同步目录树数据,当代理主机数据发生改变时,代理服务器又以推的方式将数据更新到下属的从LDAP服务器上,且从LDAP服务器只能对代理LDAP服务器有读权限。

一句话总结:代理同步。主服务器隐藏,代理主机通过syncrepl以拉同步目录树,代理主机发生数据变化,代理主机以推的方式更新到下属的从机上,从机只对代理主机有读权限。

Delta-syncrepl模式

在Delta-syncrepl同步模式下,当主服务器对目录树上的相关条目进行修改时,会产生一条日志信息,于是这时候,从服务器会通过复制协议,将主服务器记录的日志应用到从服务器本地,完成数据同步的过程。但每个消费者获取和处理完全改变的对象,都执行同步操作。

一句话总结:变更日志同步。

4、同步模式实战对比

主从模式

部署环境
主机名 IP地址  
主服务器 ldap_master xxx.1  
从服务器 ldap_slave xxx.2  
     
服务器初始化

​ 按照同步条件:6项原则

配置主服务器同步策略

修改配置文件

$ vim /etc/ldap/slapd.conf

##  新增一行
index entryCSN,entryUUID eq

##  将如下行的#号删除
moduleload syncprov.la
modulepath /usr/lib/openldap
modulepath /usr/lib64/openldap

## 在配置文件最后一行添加如下内容
syncprov-checkpoint 100 10
syncprov-sessionlog 100

重新生成数据库文件,使其将配置生效。

修改slapd.conf需要重新生成数据库配置文件,并重新加载slapd进程,否则配置无效。

直接修改数据库文件,无须重新加载slapd进程,配置立即生效。

# 通过脚本自动自动生成数据库文件
$ cat > openldap-generate.sh << EOF
# !/bin/bash
# To generate the database configuration file
service slapd stop
rm -rf /etc/ldap/slapd.d/*
slaptest -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d/
chown -R ldap.ldap /etc/ldap/slapd.d/
service slapd restart && chkconfig slapd on 
EOF
openldap主从同步

按照同步条件:6项原则

为openldap主服务器配置规则

$ vim /etc/ldap/slapd.config

# 新增下一行
index entryCSN,entryUUID eq
##  将如下行的#号删除
moduleload syncprov.la
modulepath /usr/lib/openldap
modulepath /usr/lib64/openldap

## 在配置文件最后一行添加如下内容
syncrepl rid=003
			provider=ldap://slave
			type=refreshOnly
			retry="60 10 600 +"
			interval=00:00:00:10
			searchbase="dc=gdy,dc=com"
			scope=sub
			schemachecking=off
			bindmethod=simple
			binddn="cn=Manager,dc=gdy,dc=com"
			attrs="*,+"
			credentials=passwd

之后启动OpenLDAP服务slapd进程,命令如下:

$ openldap-generate.sh

在服务器上查看openldap日志信息,命令如下:

$ tail -f /var/log/ldap.log
....

openldap日志显示,允许xxx服务器连接并将主节点上的数据推送至从服务器,完成数据同步工作,至此,openldap服务器主从同步部署大功告成。

openldap主从同步验证

在主服务器上增加条目,查看同步日志并查看从服务器是否同步主服务器新增的条目

  1. 添加条目

    ldapadd -x -H ldaps://ldap_master -D "cn=admin,dc=MyCompany,dc=com" -w ldap123 -f /container/service/slapd/assets/test/new-user.ldif
    
  2. 查看主节点日志

  3. 主服务器查看新增条目

  4. 从服务器查看新增条目

注:此时主从同步机制配置完成,当主服务器目录树信息发生变化,会通知从服务器或者从服务器在指定时间内同步主服务器上的变化的条目。但是主从同步架构,只能在主节点上维护目录树信息,从节点只允许查询操作。不能进行条目的添加和修改操作,openldap主从同步架构和MYSQL的主从架构非常类似,只有主节点才具有写权限,而从节点不具备写权限。

error

# myopenldap error message:
myopenldap     | 60ae0839 slap_client_connect: URI=ldap://ldap_slave1 DN="cn=admin,dc=mycompany,dc=com" ldap_sasl_bind_s failed (13)
myopenldap     | 60ae0839 do_syncrepl: rid=003 rc 13 retrying (8 retries left)
myopenldap     | 60ae0839 slap_client_connect: URI=ldap://ldap_slave1 DN="cn=admin,dc=mycompany,dc=com" ldap_sasl_bind_s failed (13)
myopenldap     | 60ae0839 do_syncrepl: rid=003 rc 13 retrying (8 retries left)
myopenldap     | 60ae0839 do_syncrep2: rid=001 got search entry without Sync State control (cn=config)
myopenldap     | 60ae0839 do_syncrepl: rid=001 rc -1 retrying
# myldap_slave error message
myldap_slave   | 60ae0839 conn=1002 op=0 BIND dn="cn=admin,dc=mycompany,dc=com" method=128
myldap_slave   | 60ae0839 conn=1000 op=0 RESULT tag=97 err=13 text=confidentiality required
myldap_slave   | 60ae0839 conn=1002 op=0 RESULT tag=97 err=13 text=confidentiality required
myldap_slave   | 60ae0839 conn=1000 op=1 UNBIND
myldap_slave   | 60ae0839 conn=1000 fd=12 closed
myldap_slave   | 60ae0839 conn=1002 op=1 UNBIND
myldap_slave   | 60ae0839 conn=1002 fd=14 closed
myldap_slave   | 60ae0839 conn=1001 fd=13 TLS established tls_ssf=256 ssf=256
myldap_slave   | 60ae0839 conn=1001 op=1 BIND dn="cn=admin,cn=config" method=128
myldap_slave   | 60ae0839 conn=1001 op=1 BIND dn="cn=admin,cn=config" mech=SIMPLE ssf=0
myldap_slave   | 60ae0839 conn=1001 op=1 RESULT tag=97 err=0 text=
myldap_slave   | 60ae0839 conn=1001 op=2 SRCH base="cn=config" scope=2 deref=0 filter="(objectClass=*)"
myldap_slave   | 60ae0839 conn=1001 op=2 SRCH attr=* +
myldap_slave   | 60ae0839 slap_global_control: unrecognized control: 1.3.6.1.4.1.4203.1.9.1.1
myldap_slave   | 60ae0839 conn=1001 op=2 SEARCH RESULT tag=101 err=0 nentries=17 text=
myldap_slave   | 60ae0839 conn=1001 op=3 UNBIND
myldap_slave   | 60ae0839 conn=1001 fd=13 closed
myldap_slave   | 60ae0875 conn=1003 fd=12 ACCEPT from IP=172.18.0.3:37568 (IP=0.0.0.0:389)
myldap_slave   | 60ae0875 conn=1004 fd=14 ACCEPT from IP=172.18.0.3:37570 (IP=0.0.0.0:389)

5、MirrorMode模式

部署环境

主机名 IP地址
01.gdy.com 192.168.218.206
02.gdy.com 192.168.218.205

配置文件

A

$ vim /etc/openldap/slapd.conf
serverID 1
overlay syncprov
syncrepl rid=001
		provider=ldap://192.168.218.206
		bindmethod=simple
		binddb="cn=Manager,dc=gdy,dc=com"
		credentials=redhat
		searchbase="dc=gdy,dc=com"
		type=refreshAndPersist
		retry="60 +"
mirrormode on

B

$ vim /etc/openldap/slapd.conf
serverID 2
overlay syncprov
syncrepl rid=001
		provider=ldap://192.168.218.205
		type=refreshAndPersist
		searchbase="dc=gdy,dc=com"
		schemachecking=off
		bindmethod=simple
		binddb="cn=Manager,dc=gdy,dc=com"
		credentials=redhat
		retry="60 +"
mirrormode on

重新加载配置文件

mirrormode验证

删除条目

通过以下命令将主节点其中一条条目删除,查看是否会在另外一个主节点上同步删除此条目

$ ldapdelete

查看ldap主节点日志

$ cat ldap.log

查看其他节点是否存在删除的用户

$ ldapsearch -x -LLL uid=xxxx

6、N-Way Multi-Master模式

这个是osixia-openldap的ldap_replication模式

以下是docker-compose.xml的部分设置

LDAP_REPLICATION=true
LDAP_REPLICATION_CONFIG_SYNCPROV=binddn="cn=admin,cn=config" bindmethod=simple credentials=config searchbase="cn=config" type=refreshAndPersist retry="60 +" timeout=1 starttls=critical
LDAP_REPLICATION_DB_SYNCPROV=binddn="cn=admin,dc=MyCompany,dc=com" bindmethod=simple credentials=ldap123 searchbase="dc=MyCompany,dc=com" type=refreshAndPersist interval=00:00:00:10 retry="60 +" timeout=1 starttls=critical
LDAP_REPLICATION_HOSTS=#PYTHON2BASH:['ldap://ldap_slave1','ldap://ldap_master']

后记

@TOC

Image text