组复制安全套接字层(SSL)支持
可以使用SSL保护组通信连接和分布式恢复连接。以下各节说明如何配置连接。
配置用于组通信的SSL
安全套接字可用于组成员之间的组通信连接。组复制系统变量group_replication_ssl_mode
用于激活对组通信连接使用SSL并指定连接的安全模式。默认设置表示不使用SSL。该选项具有以下可能的值:
group_replication_ssl_mode配置值
值 | 描述 |
---|---|
已停用 | 建立未加密的连接(默认)。 |
需要 | 如果服务器支持安全连接,则建立安全连接。 |
VERIFY_CA | 与REQUIRED相似,但另外还要针对配置的证书颁发机构(CA)证书验证服务器TLS证书。 |
VERIFY_IDENTITY | 与VERIFY_CA类似,但还要验证服务器证书是否与尝试连接的主机匹配。 |
组复制的组通信连接的其余配置来自服务器的SSL配置。有关配置服务器SSL的选项的更多信息,请参阅“加密连接的命令选项”。应用于组复制的组通信连接的服务器SSL选项如下:
SSL选项
服务器配置 | 描述 |
---|---|
| SSL私钥文件的路径名(PEM格式)。在客户端,这是客户端私钥。在服务器端,这是服务器私钥。 |
| SSL公钥证书文件的路径名(PEM格式)。在客户端,这是客户端公钥证书。在服务器端,这是服务器公钥证书。 |
| 证书颁发机构(CA)证书文件的路径名,采用PEM格式。 |
| 包含PEM格式的受信任SSL证书颁发机构(CA)证书文件的目录的路径名。 |
| 包含PEM格式的证书吊销列表的文件的路径名。 |
| 包含PEM格式的证书吊销列表文件的目录的路径名。 |
| 加密连接的允许密码列表。 |
| 服务器允许加密连接的TLS协议列表。 |
| 服务器使用哪种TLSv1.3密码套件允许加密连接。 |
重要
- 从MySQL 8.0.16开始,MySQL Server中提供了对TLSv1.3协议的支持,但前提是MySQL是使用OpenSSL 1.1.1或更高版本进行编译的。组复制支持MySQL 8.0.18中的TLSv1.3。在MySQL 8.0.16和MySQL 8.0.17中,如果服务器支持TLSv1.3,则组通信引擎中不支持该协议,并且组复制不能使用该协议。
- 在
tls_version
系统变量中指定的TLS协议列表中,确保指定的版本是连续的(例如TLSv1,TLSv1.1,TLSv1.2
)。如果协议列表中有任何空白(例如,如果您指定TLSv1,TLSv1.2
,则省略TLS 1.1),则组复制可能无法建立组通信连接。- 在MySQL 8.0.18中,TLSv1.3可以在组复制中用于分布式恢复连接,但是
group_replication_recovery_tls_version
和group_replication_recovery_tls_ciphersuites
系统变量不可用。因此,施主服务器必须允许使用至少一个默认启用的TLSv1.3密码套件,如“加密连接TLS协议和密码”中所列。从MySQL 8.0.19开始,您可以使用这些选项来配置对任何密码套件选择的客户端支持,如果需要的话,仅包括非默认密码套件。
在复制组中,OpenSSL协商所有成员支持的最高TLS协议的使用。配置为仅使用TLSv1.3的加入成员(tls_version=TLSv1.3
)无法加入任何现有成员都不支持TLSv1.3的复制组,因为在这种情况下,该组成员使用的是较低的TLS协议版本。要将成员加入组,必须将加入成员配置为还允许使用现有组成员支持的较低TLS协议版本。相反,如果加入的成员不支持TLSv1.3,但是现有的组成员都支持并且正在使用该版本进行彼此连接,则如果现有的组成员已经允许使用合适的较低TLS协议,则该成员可以加入。版本,或者如果您将其配置为这样做。在这种情况下,OpenSSL使用较低的TLS协议版本进行从每个成员到加入成员的连接。
从MySQL 8.0.16开始,您可以tls_version
在运行时更改系统变量,以更改服务器允许的TLS协议版本的列表。请注意,对于组复制,该ALTER INSTANCE RELOAD TLS
语句从定义上下文的系统变量的当前值重新配置服务器的SSL上下文,并且在组复制运行时不会更改组复制的组通信连接的SSL上下文。要将重新配置应用于这些连接,必须发出命令,STOP GROUP_REPLICATION
然后START GROUP_REPLICATION
在更改了更改的成员上重新启动组复制。tls_version
系统变量。同样,如果要使组的所有成员都更改为使用更高或更低的TLS协议版本,则必须在更改允许的TLS协议版本的列表后对成员进行组复制的滚动重启,以便OpenSSL协商滚动重启完成后,使用更高版本的TLS协议。有关在运行时更改允许的TLS协议版本列表的说明,请参见“加密的连接TLS协议和密码”和加密连接的服务器端运行时配置。
以下示例显示了my.cnf
文件中的一部分,该部分在服务器上配置SSL,并为组复制组通信连接激活SSL:
[mysqld] ssl_ca = "cacert.pem" ssl_capath = "/.../ca_directory" ssl_cert = "server-cert.pem" ssl_cipher = "DHE-RSA-AEs256-SHA" ssl_crl = "crl-server-revoked.crl" ssl_crlpath = "/.../crl_directory" ssl_key = "server-key.pem" group_replication_ssl_mode= REQUIRED
重要该
ALTER INSTANCE RELOAD TLS
语句从定义上下文的系统变量的当前值重新配置服务器的SSL上下文,并且在运行组复制时不会更改组复制的组通信连接的SSL上下文。要将重新配置应用于这些连接,必须发出命令,STOP GROUP_REPLICATION
然后START GROUP_REPLICATION
重新启动组复制。
配置SSL以进行分布式恢复
当成员加入组时,将结合使用远程克隆操作(如果适用)和异步复制连接来执行分布式恢复。两种状态转移方法都需要为复制恢复设置一个复制用户,如“用户凭据”中所述。在加入组(加入成员)的服务器连接到施主之前,必须创建需要SSL连接的复制用户。通常,这是在配置服务器以加入组时设置的。
要为需要SSL连接的分布式恢复创建复制用户,请发出以下语句:
donor>SET SQL_LOG_BIN=0; donor>CREATE USER 'rec_ssl_user'@'%'REQUIRE SSL ; donor>GRANT replication slave ON *.*TO 'rec_ssl_user'@'%'; donor>GRANT BACKUP_ADMINON *.*TO 'rec_ssl_user'@'%'; donor>SET SQL_LOG_BIN=1;
假设组中已经存在所有服务器,并且已将复制用户设置为使用SSL,则可以通过将组复制恢复通道配置为使用凭据来将加入成员配置为在连接到供体时使用这些凭据:
new_member>CHANGE MASTER TO MASTER_USER ="rec_ssl_user"FOR CHANNEL "group_replication_recovery";
要配置安全的分布式恢复连接,请使用组复制的专用分布式恢复SSL选项。这些选项对应于用于组通信连接的服务器SSL选项,但是它们仅适用于分布式恢复连接。默认情况下,即使为组通信连接激活了SSL,分布式恢复连接也不使用SSL,并且服务器SSL选项不适用于分布式恢复连接。您必须分别配置这些连接。
如果将远程克隆操作用作分布式恢复的一部分,则组复制会自动配置克隆插件的SSL选项,以匹配您的分布式恢复SSL选项的设置。(有关克隆插件如何使用SSL的详细信息,请参阅配置用于克隆的加密连接。)
分布式恢复SSL选项如下:
group_replication_recovery_use_ssl
:设置为ON
使“组复制”使用SSL进行分布式恢复连接,包括远程克隆操作和来自施主二进制日志的状态转移。group_replication_recovery_ssl_ca
:用于分布式恢复连接的证书颁发机构(CA)文件的路径名。组复制会自动将克隆SSL选项配置clone_ssl_ca
为与此匹配。group_replication_recovery_ssl_capath
:包含受信任的SSL证书颁发机构(CA)证书文件的目录的路径名。group_replication_recovery_ssl_cert
:用于分布式恢复连接的SSL公钥证书文件的路径名。组复制会自动将克隆SSL选项配置clone_ssl_cert
为与此匹配。group_replication_recovery_ssl_key
:用于分布式恢复连接的SSL私钥文件的路径名。组复制会自动将克隆SSL选项配置clone_ssl_cert
为与此匹配。group_replication_recovery_ssl_verify_server_cert
:进行分布式恢复连接,以检查施主发送的证书中服务器的“公用名”值。将该选项设置为ON
为设置的分布式恢复连接的等效VERIFY_IDENTITY
为group_replication_ssl_mode
用于组通信的连接选项。group_replication_recovery_ssl_crl
:包含证书吊销列表的文件的路径名。group_replication_recovery_ssl_crlpath
:包含证书吊销列表的目录的路径名。group_replication_recovery_ssl_cipher
:分布式恢复连接的连接加密的允许密码列表。指定一个或多个密码名称列表,以冒号分隔。有关MySQL支持的加密密码的信息,请参见“加密的连接TLS协议和密码”。group_replication_recovery_tls_version
:当此服务器实例是分布式恢复连接中的客户端(即加入成员)时,一个或多个允许用于连接加密的TLS协议的逗号分隔列表。确保指定的版本是连续的(例如,“TLSv1,TLSv1.1,TLSv1.2
”)。如果未设置此系统变量,则使用默认的“TLSv1,TLSv1.1,TLSv1.2,TLSv1.3
”。每个分布式恢复连接中涉及的组成员(作为客户端(加入成员)和服务器(捐助者))协商它们都设置为支持的最高协议版本。该系统变量可从MySQL 8.0.19获得。group_replication_recovery_tls_ciphersuites
:当将TLSv1.3用于分布式恢复连接的连接加密时,一个或多个允许的密码套件的冒号分隔列表,并且此服务器实例是分布式恢复连接中的客户端,即加入成员。如果将此系统变量设置为NULL
使用TLSv1.3时(如果未设置系统变量,则为默认值),则允许默认启用的密码套件,如“加密连接TLS”中所列协议和密码”。如果将此系统变量设置为空字符串,则不允许使用密码套件,因此将不使用TLSv1.3。该系统变量可从MySQL 8.0.19获得。
例如,发出以下语句可将SSL用于分布式恢复连接,并标识必须用于这些连接的证书颁发机构(CA)文件,公钥证书文件和私钥文件的路径:
new_member>SET GLOBAL group_replication_recovery_use_ssl=1; new_member>SET GLOBAL group_replication_recovery_ssl_ca= '.../cacert.pem'; new_member>SET GLOBAL group_replication_recovery_ssl_cert= '.../client-cert.pem'; new_member>SET GLOBAL group_replication_recovery_ssl_key= '.../client-key.pem';