MySQL Shell 9.0  /  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 选项与这两个操作中的任何一个一起使用,以将实例设置为使用不同的加密模式。

在使用 dba.createCluster()adoptFromGR 选项一起采用现有的组复制组时,不会更改采用集群上的任何 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 值的组合进行身份验证。

重要

集群集继承在主集群上定义的 memberAuthType。集群集中的所有副本集群也将使用在主集群上定义的 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() 方法使您能够选择性地指定已批准服务器的列表,称为允许列表。通过以这种方式显式指定允许列表,您可以提高集群的安全性,因为只有允许列表中的服务器才能连接到集群。

您还可以使用 Cluster.setOption() 在运行的集群上定义允许列表,以指定集群所有成员的允许列表,以及使用 Cluster.setInstanceOption() 指定单个成员的允许列表。请参见 第 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 文件在本地实现名称解析,以避免使用外部组件。