从二进制日志进行状态转移需要具有正确权限的复制用户,以便组复制可以建立直接的成员到成员复制通道。所有组成员都使用相同的复制用户进行分布式恢复。如果已将组成员设置为支持使用远程克隆操作作为分布式恢复的一部分,则此复制用户也将用作捐赠者上的克隆用户,并且需要此角色的正确权限。有关设置此用户的详细说明,请参阅 第 20.2.1.3 节,“用于分布式恢复的用户凭据”。
为了保护用户凭据,您可以要求对使用该用户帐户的连接使用 SSL,并在启动组复制时提供用户凭据,而不是将它们存储在副本状态表中。此外,如果您使用的是缓存 SHA-2 身份验证,则必须在组成员上设置 RSA 密钥对。
当使用 MySQL 通信堆栈(group_replication_communication_stack=MYSQL
)并且成员之间使用安全连接(group_replication_ssl_mode
未设置为 DISABLED
)时,必须正确设置恢复用户,因为它们也是组通信的用户。请按照 第 20.6.3.1.2 节,“使用 SSL 的复制用户” 和 第 20.6.3.1.3 节,“安全地提供复制用户凭据” 中的说明进行操作。
默认情况下,在 MySQL 8 中创建的用户使用 第 8.4.1.2 节,“缓存 SHA-2 可插拔身份验证”。如果您为分布式恢复配置的复制用户使用缓存 SHA-2 身份验证插件,并且您未 对分布式恢复连接使用 SSL,则 RSA 密钥对将用于密码交换。有关 RSA 密钥对的更多信息,请参阅 第 8.3.3 节,“创建 SSL 和 RSA 证书和密钥”。
在这种情况下,您可以将 rpl_user
的公钥复制到加入成员,或者将捐赠者配置为在请求时提供公钥。更安全的方法是将复制用户帐户的公钥复制到加入成员。然后,您需要在加入成员上配置 group_replication_recovery_public_key_path
系统变量,并指定复制用户帐户的公钥路径。
不太安全的方法是在捐赠者上设置 group_replication_recovery_get_public_key=ON
,以便它们向加入成员提供复制用户帐户的公钥。没有办法验证服务器的身份,因此只有在确定服务器身份没有被泄露的风险时才设置 group_replication_recovery_get_public_key=ON
,例如通过中间人攻击。
必须在加入组的服务器(加入成员)连接到捐赠者之前 创建需要 SSL 连接的复制用户。通常,这是在您配置服务器以加入组时设置的。要为需要 SSL 连接的分布式恢复创建复制用户,请在要加入组的所有服务器上发出以下语句
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER 'rec_ssl_user'@'%' IDENTIFIED BY 'password' REQUIRE SSL;
mysql> GRANT REPLICATION SLAVE ON *.* TO 'rec_ssl_user'@'%';
mysql> GRANT CONNECTION_ADMIN ON *.* TO 'rec_ssl_user'@'%';
mysql> GRANT BACKUP_ADMIN ON *.* TO 'rec_ssl_user'@'%';
mysql> GRANT GROUP_REPLICATION_STREAM ON *.* TO rec_ssl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
当同时使用 MySQL 通信堆栈(group_replication_communication_stack=MYSQL
)和成员之间的安全连接(group_replication_ssl_mode
未设置为 DISABLED
)时,需要 GROUP_REPLICATION_STREAM
权限。请参阅 第 20.6.1 节,“用于连接安全管理的通信堆栈”。
要提供复制用户的用户凭据,您可以使用 CHANGE REPLICATION SOURCE TO
语句将它们永久设置为 group_replication_recovery
通道的凭据。或者,您可以在每次启动组复制时在 START GROUP_REPLICATION
语句中指定它们。在 START GROUP_REPLICATION
中指定的用 户凭据优先于使用 CHANGE REPLICATION SOURCE TO
语句设置的任何用户凭据。
使用 CHANGE REPLICATION SOURCE TO
设置的用户凭据以纯文本形式存储在服务器上的复制元数据存储库中,但 START GROUP_REPLICATION
上指定的的用户凭据仅保存在内存中,并由 STOP GROUP_REPLICATION
语句或服务器关闭移除。因此,使用 START GROUP_REPLICATION
指定用户凭据有助于保护组复制服务器免遭未经授权的访问。但是,此方法与自动启动组复制不兼容,如 group_replication_start_on_boot
系统变量所指定。
如果您想使用 CHANGE REPLICATION SOURCE TO
语句永久设置用户凭据,请在将要加入组的成员上发出此语句
mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='rec_ssl_user',
-> SOURCE_PASSWORD='password'
-> FOR CHANNEL 'group_replication_recovery';
要在 START GROUP_REPLICATION
上提供用户凭据,请在首次启动组复制时或服务器重启后发出此语句
mysql> START GROUP_REPLICATION USER='rec_ssl_user', PASSWORD='password';
如果您在之前使用 CHANGE REPLICATION SOURCE TO
提供凭据的服务器上切换为使用 START GROUP_REPLICATION
指定用户凭据,则必须完成以下步骤才能获得此更改的安全优势。
使用
STOP GROUP_REPLICATION
语句停止组成员上的组复制。尽管可以在组复制运行时执行以下两个步骤,但您需要重新启动组复制才能实施更改。将
group_replication_start_on_boot
系统变量的值设置为OFF
(默认值为ON
)。通过发出以下语句从副本状态表中删除分布式恢复凭据
mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='', SOURCE_PASSWORD='' -> FOR CHANNEL 'group_replication_recovery';
使用指定了分布式恢复用户凭据的
START GROUP_REPLICATION
语句在组成员上重新启动组复制。
如果没有这些步骤,凭据将保留在副本状态表中,并且还可以在分布式恢复的远程克隆操作期间传输到其他组成员。然后,group_replication_recovery
通道可能会在原始成员或从其克隆的成员上使用存储的凭据无意中启动。服务器启动时(包括远程克隆操作之后)自动启动组复制将使用存储的用户凭据,如果操作员未在 START GROUP_REPLICATION
中指定分布式恢复凭据,也会使用这些凭据。