从二进制日志进行状态转移需要具有正确权限的复制用户,以便组复制能够建立直接的成员间复制通道。相同的复制用户用于所有组成员上的分布式恢复。如果已将组成员配置为支持作为分布式恢复一部分的远程克隆操作,则此复制用户也用作捐赠者上的克隆用户,并且需要具有此角色的正确权限。有关设置此用户的详细说明,请参见 第 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.1 节,“缓存 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 服务器免受未经授权的访问。但是,这种方法与通过 group_replication_start_on_boot
系统变量指定的自动启动 Group Replication 不兼容。
如果您想使用 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
上提供用户凭据,请在首次启动 Group Replication 或服务器重启后发出此语句
mysql> START GROUP_REPLICATION USER='rec_ssl_user', PASSWORD='password';
如果您切换到使用 START GROUP_REPLICATION
来指定之前使用 CHANGE REPLICATION SOURCE TO
提供凭据的服务器上的用户凭据,您必须完成以下步骤才能获得此更改的安全优势。
使用
STOP GROUP_REPLICATION
语句停止组成员上的 Group Replication。虽然可以在 Group Replication 运行时执行以下两个步骤,但您需要重新启动 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。
如果没有这些步骤,凭据将保留在副本状态表中,并且还可以在分布式恢复的远程克隆操作期间传输到其他组成员。然后,group_replication_recovery
通道可能会在原始成员或从其克隆的成员上使用存储的凭据意外启动。服务器启动时(包括远程克隆操作之后)Group Replication 的自动启动将使用存储的用户凭据,并且如果操作员未将分布式恢复凭据指定为 START GROUP_REPLICATION
的一部分,它们也将被使用。