MySQL Shell 8.4  /  MySQL InnoDB 集群  /  保护 InnoDB 集群

7.6 保护 InnoDB 集群

可以将服务器实例配置为使用安全连接。有关将安全连接与 MySQL 配合使用的常规信息,请参阅 使用加密连接。本节介绍如何将集群配置为使用加密连接。另一种安全措施是配置哪些服务器可以访问集群,请参阅 创建服务器允许列表

重要

如果您使用的是 XCOM 通信堆栈,则在将集群配置为使用加密连接后,必须将服务器添加到 ipAllowlist 中。例如,在使用 MySQL 商业版时,默认情况下启用 SSL,您需要为所有实例配置 ipAllowlist 选项。请参阅 创建服务器允许列表

使用 dba.createCluster() 设置集群时,如果服务器实例提供加密,则会在种子实例上自动启用加密。将 memberSslMode 选项传递给 dba.createCluster() 方法以指定不同的 SSL 模式。集群的 SSL 模式只能在创建时设置。 memberSslMode 选项是一个字符串,用于配置要使用的 SSL 模式,默认为 AUTO。支持以下模式

  • DISABLED:确保为集群中的种子实例禁用 SSL 加密。

  • AUTO:如果服务器实例支持,则自动启用 SSL 加密;如果服务器不支持,则禁用加密。

  • REQUIRED:为集群中的种子实例启用 SSL 加密。如果无法启用,则会引发错误。

  • VERIFY_CA:类似于 REQUIRED,但另外会根据配置的 CA 证书验证服务器证书颁发机构 (CA) 证书。如果未找到有效的匹配 CA 证书,则连接尝试将失败。

  • VERIFY_IDENTITY:类似于 VERIFY_CA,但另外会通过检查客户端用于连接到服务器的主机名与服务器发送给客户端的证书中的身份是否匹配来执行主机名身份验证。

例如,要将集群设置为使用 REQUIRED,请发出

mysql-js> var myCluster = dba.createCluster({memberSslMode: 'REQUIRED'})

如果您选择使用 VERIFY_CAVERIFY_IDENTITY 模式,则在每个集群实例上,您必须使用 ssl_ca 和/或 ssl_capath 选项手动提供 CA 证书。有关这些模式的更多信息,请参阅 --ssl-mode=mode

当您使用 Cluster.addInstance()Cluster.rejoinInstance() 操作时,将根据为集群使用的设置启用或禁用实例上的 SSL 加密。将 memberSslMode 选项与这两个操作之一配合使用,以将实例设置为使用不同的加密模式。

当使用带有 adoptFromGR 选项的 dba.createCluster() 采用现有组复制组时,不会更改已采用集群上的 SSL 设置

  • memberSslMode 不能与 adoptFromGR 一起使用。

  • 如果已采用集群的 SSL 设置与 MySQL Shell 支持的设置不同,换句话说,用于组复制恢复和组通信的 SSL 设置不同,则不会修改这两个设置。这意味着您将无法向集群添加新实例,除非您手动更改已采用集群的设置。

MySQL Shell 始终为组复制恢复和组通信启用或禁用集群的 SSL,请参阅 使用安全套接字层 (SSL) 保护组通信连接。在将新实例添加到集群时,如果种子实例的这些设置不同(例如,由于使用了 adoptFromGRdba.createCluster()),则会执行验证并发出错误。必须为集群中的所有实例启用或禁用 SSL 加密。执行验证以确保在将新实例添加到集群时此不变式成立。

默认情况下,dba.deploySandboxInstance() 命令尝试部署具有 SSL 加密支持的沙箱实例。如果不可能,则部署服务器实例时不提供 SSL 支持。请参阅 第 6.8.1 节“部署沙箱实例”

保护集群成员之间的通信

可以将集群和副本集群配置为使用 SSL 加密复制通道,并使副本能够验证主机身份并使用 SSL 证书进行身份验证。

使用 dba.createCluster() 创建集群时,您可以使用 memberAuthType 选项定义用于内部复制帐户的身份验证类型。此选项采用以下值之一

  • PASSWORD:帐户仅使用密码进行身份验证。

  • CERT_ISSUER:帐户使用客户端证书进行身份验证,该证书必须与预期的颁发者匹配。此值等效于 VERIFY_CA

  • CERT_SUBJECT:帐户使用客户端证书进行身份验证,该证书必须与预期的颁发者和主题匹配。此值等效于 VERIFY_IDENTITY

  • CERT_ISSUER_PASSWORD:帐户使用 PASSWORDCERT_ISSUER 值的组合进行身份验证。

  • CERT_SUBJECT_PASSWORD:帐户使用 PASSWORDCERT_SUBJECT 值的组合进行身份验证。

重要

ClusterSet 继承在主集群上定义的 memberAuthType。ClusterSet 中的所有副本集群也将使用在主集群上定义的 memberAuthType

SSL 证书使用以下选项定义

  • CERT_ISSUER:定义拓扑中所有复制帐户所需的证书颁发者,如果 memberAuthType 包含 CERT_ISSUERCERT_SUBJECT

  • CERT_SUBJECT:定义实例的证书主题。如果 memberAuthType 包含 CERT_SUBJECT,则为必需项。

注意

memberAuthType=password 外,无法将 adoptFromGR=true 与任何选项一起使用。

以下示例创建一个集群 cluster1,该集群将客户端 SSL 连接和从一台服务器到另一台服务器打开的组复制连接设置为 VERIFY_IDENTITY,并将内部复制帐户的身份验证设置为需要客户端证书

        cluster = dba.createCluster("cluster1", { "memberSslMode": "VERIFY_IDENTITY", "memberAuthType":"CERT_SUBJECT", 
        "certIssuer":"/CN=MyCertAuthority", "certSubject": "/CN=mysql-1.local"});

以下示例显示如何使用 "memberAuthType":"CERT_SUBJECT" 将实例添加到集群

        cluster.addInstance("mysql-2.local", {"certSubject": "/CN=mysql-2.local"});

有关复制和加密连接的更多信息,请参阅 设置复制以使用加密连接

创建服务器允许列表

注意

这仅适用于 XCOM 通信堆栈。

createCluster()addInstance()rejoinInstance() 方法使您能够选择指定已批准服务器的列表,称为允许列表。通过以这种方式显式指定允许列表,您可以提高集群的安全性,因为只有允许列表中的服务器才能连接到集群。

您还可以在运行的集群上定义 allowList,使用 Cluster.setOption() 为集群的所有成员指定 allowList,并使用 Cluster.setInstanceOption() 为单个成员指定 allowList。请参阅 第 7.5.1 节“设置 InnoDB 集群的选项”

使用 ipAllowlist 选项可以在实例上配置 group_replication_ip_allowlist 系统变量。默认情况下,如果未显式指定,则会自动将允许列表设置为服务器具有网络接口的专用网络地址。要配置允许列表,请在使用该方法时使用 ipAllowlist 选项指定要添加的服务器。IP 地址必须以 IPv4 格式指定。以逗号分隔的列表形式传递服务器,并用引号引起来。例如

mysql-js> cluster.addInstance("icadmin@ic-3:3306", {ipAllowlist: "203.0.113.0/24, 198.51.100.110"})

此配置将实例设置为仅接受来自地址 203.0.113.0/24198.51.100.110 的服务器的连接。允许列表还可以包含主机名,这些主机名仅在另一台服务器发出连接请求时才会被解析。

警告

在允许列表中,主机名本质上不如 IP 地址安全。MySQL 会执行 FCrDNS 验证,这提供了一定程度的保护,但可能会被某些类型的攻击攻破。仅在绝对必要时才在允许列表中指定主机名,并确保用于名称解析的所有组件(例如 DNS 服务器)都在您的控制之下进行维护。您也可以使用 hosts 文件在本地实现名称解析,以避免使用外部组件。