MySQL 8.0 参考手册  / 第十八章 组复制  / 18.6 组复制安全  / 18.6.3 保护分布式恢复连接  /  18.6.3.1 分布式恢复的安全用户凭证

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

来自二进制日志的状态传输需要具有正确权限的复制用户,以便 Group Replication 可以建立直接的成员到成员复制通道。同一个复制用户用于所有组成员的分布式恢复。如果已将组成员设置为支持使用远程克隆操作作为分布式恢复的一部分(从 MySQL 8.0.17 开始可用),则此复制用户也用作供体上的克隆用户,并且需要正确的权限也为了这个角色。有关设置此用户的详细说明,请参阅 第 18.2.1.3 节,“分布式恢复的用户凭证”

为了保护用户凭证,您可以要求 SSL 用于与用户帐户的连接,并且(从 MySQL 8.0.21 开始)您可以在组复制启动时提供用户凭证,而不是将它们存储在副本状态表中。此外,如果您使用缓存 SHA-2 身份验证,则必须在组成员上设置 RSA 密钥对。

重要的

当使用 MySQL 通信堆栈 ( group_replication_communication_stack=MYSQL) 和成员之间的安全连接 (group_replication_ssl_mode 未设置为DISABLED) 时,必须正确设置恢复用户,因为他们也是组通信的用户。按照 第 18.6.3.1.2 节“使用 SSL 复制用户”第 18.6.3.1.3 节“安全提供复制用户凭证”中的说明进行操作。

18.6.3.1.1 使用缓存 SHA-2 身份验证插件复制用户

默认情况下,在 MySQL 8 中创建的用户使用 第 6.4.1.2 节,“缓存 SHA-2 可插入身份验证”。如果您为分布式恢复配置的复制用户使用缓存 SHA-2 身份验证插件,并且您 没有使用 SSL 进行分布式恢复连接,则 RSA 密钥对用于密码交换。有关 RSA 密钥对的更多信息,请参阅 第 6.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 在您确定不存在服务器身份被泄露的风险(例如中间人攻击)时才设置。

18.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 rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
笔记

GROUP_REPLICATION_STREAM 当同时使用 MySQL 通信堆栈 ( group_replication_communication_stack=MYSQL) 和成员之间的安全连接 (group_replication_ssl_mode 未设置为) 时,需要 该权限DISABLED。请参阅 第 18.6.1 节,“用于连接安全管理的通信堆栈”

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

要为复制用户提供用户凭据,您可以使用| 将它们永久设置为 group_replication_recovery通道 的凭据。陈述。或者,从 MySQL 8.0.21 开始,您可以在 每次启动组复制时在语句中指定它们。指定的用户凭据优先于使用 | 设置的任何用户凭据 陈述。 CHANGE REPLICATION SOURCE TOCHANGE MASTER TOSTART GROUP_REPLICATIONSTART GROUP_REPLICATIONCHANGE REPLICATION SOURCE TOCHANGE MASTER TO

使用CHANGE REPLICATION SOURCE TO|设置的用户凭据 CHANGE MASTER TO以纯文本形式存储在服务器上的复制元数据存储库中,但指定的用户凭据START GROUP_REPLICATION仅保存在内存中,并通过STOP GROUP_REPLICATION语句或服务器关闭删除。因此START GROUP_REPLICATION ,用于指定用户凭据有助于保护组复制服务器免受未经授权的访问。group_replication_start_on_boot 但是,此方法与系统变量 指定的自动启动组复制不兼容 。

如果您想使用 CHANGE REPLICATION SOURCE TO| 永久设置用户凭据 CHANGE MASTER TO语句,对要加入该组的成员发出此语句:

mysql> CHANGE MASTER TO MASTER_USER='rec_ssl_user', MASTER_PASSWORD='password' 
            FOR CHANNEL 'group_replication_recovery';

Or from MySQL 8.0.23:
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 |提供凭据 CHANGE MASTER TO,您必须完成以下步骤才能获得此更改的安全优势。

  1. 使用 STOP GROUP_REPLICATION 语句停止组成员上的组复制。虽然可以在 Group Replication 运行时执行以下两个步骤,但您需要重新启动 Group Replication 才能使更改生效。

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

  3. 通过发出以下语句从副本状态表中删除分布式恢复凭证:

    mysql> CHANGE MASTER TO MASTER_USER='', MASTER_PASSWORD='' 
                FOR CHANNEL 'group_replication_recovery';
    
    Or from MySQL 8.0.23:
    mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='', SOURCE_PASSWORD='' 
                FOR CHANNEL 'group_replication_recovery';
  4. START GROUP_REPLICATION 使用指定分布式恢复用户凭据 的语句在组成员上重新启动组复制 。

如果没有这些步骤,凭据仍然存储在副本状态表中,并且还可以在远程克隆操作期间传输给其他组成员以进行分布式恢复。group_replication_recovery 然后可能会在原始成员或从其克隆的成员上无意中使用存储的凭据启动该通道。在服务器启动时自动启动组复制(包括在远程克隆操作之后)将使用存储的用户凭据,如果操作员未将分布式恢复凭据指定为START GROUP_REPLICATION.