本文是发表在mysql工程团队博客饿译文,原文链接“https://mysqlhighavailability.com/restrict-replication-to-row-based-events/”
作者:Pedro Gomes 译:徐轶韬
在MySQL 8.0.18上进行的后续工作中,我们引入了对从服务器的回放线程进行权限检查功能,在本文中,我们将介绍一项新功能,可以进一步提高安全复制数据的能力,用户可以将复制流限制为仅基于行的事件。
在MySQL 8.0.19中,为复制通道添加了新的CHANGE MASTER参数REQUIRE_ROW_FORMAT,这使该通道仅接受基于行的复制事件。
此要求将通过以下方式提高整体安全性:
不允许复制LOAD DATA指令,因为它们意味着文件将暂时存在于磁盘上,未知用户可以对文件进行篡改或访问以显示在插入时将被加密的数据。
不允许复制临时表和相关数据,因为有可能在主数据中包含敏感的临时数据,例如,用于计算的未加密数据将生成加密数据。
避免出现基于语句的复制流相关的其他常见问题
从安全边界以外的服务器进行复制时,上面这些用例变得更加相关,这意味着它们不在用户的控制范围内,并且可能被未知用户访问。它在扇入用例中非常有用,例如,当想要聚合多个源中的数据,并且仍然希望确保磁盘上没有未加密的敏感数据,或通过临时表错误地复制了这些数据。
对于已经使用受限权限进行复制的用户来说,好处是不再需要向用户授予FILE权限。
行为
在复制通道中启用这个新功能之后,对于接收和回放的所有事务,将进行检查,不允许以下任何一项:
LOAD DATA 事件
临时表的创建或删除
大多数INTVAR(RAND或USER_VAR与基于语句的复制相关联的事件)
为基于语句复制使用而记录的所有数据操作查询(DML)
一旦遇到任何这些事件,复制将失败并停止。
配置
要明确地使通道仅接受基于行的复制,必须完全停止复制。下面是实现它的命令
必须停止从服务器而不是停止其回放线程的原因是,这些检查都是在从服务器的接收线程和回放线程中进行的,因此它们也适用于已经接收到并存在于中继日志中的事务。
可观察性
Performance Schema表已经进行增强,以显示新的CHANGE MASTER TO…语句选项REQUIRE_ROW_FORMAT的状态:
对mysqlbinlog的更改
为了补充此更改,我们还为mysqlbinlog添加了新选项。
有了这个选项,用户能够知道输出对于运行REQUIRE_ROW_FORMAT = 1的通道是有效的。
该选项还可以防止mysqlbinlog打印与内部变量pseudo_thread_id相关的指令。如果配置了权限检查,则仅在基于行的流上不需要这些权限,它们将需要复制回放线程中的额外权限。
摘要
为了保护您的服务器免受基于语句的复制流及其中允许的事件常见的问题,或者只是减少在副本中配置回放程序权限检查所需的权限,REQUIRE_ROW_FORMAT是MySQL服务器的一项有益的功能。
本文同步发表在公众号“MySQL解决方案工程师”,欢迎关注!