Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Secure User Credentials for Distributed Recovery

20.6.3.1 分布式恢复的安全用户凭证

从二进制日志中获取状态转移需要具有正确权限的复制用户,以便 Group Replication 可以建立直接成员之间的复制通道。所有组成员都使用同一个复制用户进行分布式恢复。如果组成员已经设置了远程克隆操作作为分布式恢复的一部分,这个复制用户在捐赠者上也将被用作克隆用户,并且需要为这个角色拥有正确权限。要了解详细的设置步骤,请见第20.2.1.3节,“分布式恢复的用户凭证”

为了安全地保护用户凭证,您可以要求使用SSL连接到用户账户,并在Group Replication启动时提供用户凭证,而不是将其存储在副本状态表中。另外,如果您正在使用缓存SHA-2身份验证,必须在组成员上设置RSA密钥对。

Important

在使用 MySQL 通信栈 (group_ replication_communication_stack=MYSQL) 和成员之间的安全连接 (group_replication_ssl_mode 不设置为 DISABLED) 时,恢复用户必须正确设置,因为它们也是群组通信的用户。请遵循第20.6.3.1.2节,“Replication User With SSL”第20.6.3.1.3节,“Providing Replication User Credentials Securely”中的说明。

20.6.3.1.1 复制用户使用Caching SHA-2身份验证插件

默认情况下,MySQL 8 中创建的用户使用第8.4.1.2节,“Caching SHA-2 Pluggable Authentication”。如果您为分布式恢复配置的复制用户使用了Caching SHA-2身份验证插件,并且您没有使用SSL连接进行分布式恢复,您将使用RSA密钥对来交换密码。关于RSA密钥对的更多信息,请见第8.3.3节,“Creating SSL and RSA Certificates and Keys”

在这种情况下,您可以将 rpl_用户 的公共密钥复制到加入的成员中,或者配置捐赠者提供公共密钥时请求。更安全的方法是将复制用户账户的公共密钥复制到加入的成员中,然后在加入的成员上配置 group_ replication_recovery_public_key_path 系统变量,以公共密钥路径为复制用户账户。

较不安全的方法是将捐赠者设置为 group_ replication_recovery_get_public_key=ON,以便他们在加入成员时提供复制用户账户的公共密钥。由于无法验证服务器身份,因此只有在您确定没有服务器身份被 compromised 的风险(例如中间人攻击)时才设置 group_ replication_recovery_get_public_key=ON

20.6.3.1.2 使用 SSL 的复制用户

需要 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;
Note

需要使用GROUP_REPLICATION_STREAM特权,以便在使用 MySQL 通信栈(group_ replication_communication_stack=MYSQL)和成员之间安全连接(group_replication_ssl_mode不设置为DISABLED)时。请参阅第20.6.1节,“连接安全管理通信栈”

20.6.3.1.3 提供复制用户凭证安全地

为复制用户提供凭证,可以永久将其设置为group_replication_recovery渠道的凭证,使用CHANGE REPLICATION SOURCE TO语句。或者,您可以在每次启动Group Replication时在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,指定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时提供用户凭证,可以在第一次启动Group Replication或服务器重启后执行该语句。

mysql> START GROUP_REPLICATION USER='rec_ssl_user', PASSWORD='password';
Important

如果您在之前使用CHANGE REPLICATION SOURCE TO语句提供了用户凭证,然后切换到使用START GROUP_REPLICATION语句指定服务器凭证,您需要完成以下步骤以获取该更改的安全benefits。

  1. 使用STOP GROUP_REPLICATION语句停止组成员的Group Replication。虽然可以在Group Replication正在运行时执行以下两个步骤,但需要重新启动Group Replication以实现更改。

  2. group_replication_start_on_boot系统变量设置为OFF(默认是ON)。

  3. 从副本状态表中删除分布式恢复凭证,执行以下语句:

    mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='', SOURCE_PASSWORD='' 
        ->   FOR CHANNEL 'group_replication_recovery';
  4. 使用START GROUP_REPLICATION语句指定分布式恢复用户凭证重新启动Group Replication。

如果不执行这些步骤,凭证将继续存储在复制状态表中,并且可以在分布式恢复操作中传输到其他组成员。然后,在原始成员或从其克隆的成员上,group_replication_recovery渠道可能会不小心启动,以使用存储的凭证。服务器启动(包括远程克隆操作)将自动使用存储的用户凭证,如果操作员没有在START GROUP_REPLICATION中指定分布式恢复凭证。