在本节中,我们将讨论与 NDB 集群相关的基本网络安全问题。请务必牢记,NDB 集群 ““开箱即用”” 并不安全;您或您的网络管理员必须采取适当的步骤,以确保您的集群不会受到网络攻击。
集群通信协议本身并不安全,集群节点之间的通信中没有使用加密或类似的安全措施。由于网络速度和延迟对集群的效率有直接影响,因此也不建议对节点之间的网络连接使用 SSL 或其他加密,因为此类方案会导致通信速度变慢。
同样,对于控制 API 节点访问 NDB 集群,也没有使用任何身份验证。与加密一样,强加身份验证要求的开销也会对集群性能产生负面影响。
此外,在访问集群时,不会对以下任何一种情况检查源 IP 地址:
使用
config.ini
文件中空的[mysqld]
或[api]
部分创建的 “空闲插槽” 的 SQL 或 API 节点这意味着,如果
config.ini
文件中存在任何空的[mysqld]
或[api]
部分,则任何知道管理服务器主机名(或 IP 地址)和端口的 API 节点(包括 SQL 节点)都可以连接到集群并访问其数据,而没有任何限制。(有关此问题和相关问题的更多信息,请参见第 25.6.21.2 节“NDB 集群和 MySQL 权限”。)注意您可以通过为
config.ini
文件中的所有[mysqld]
和[api]
部分指定HostName
参数来对 SQL 和 API 节点对集群的访问进行一定程度的控制。但是,这也意味着,如果您希望从以前未使用过的主机将 API 节点连接到集群,则需要将包含其主机名的[api]
部分添加到config.ini
文件中。有关
HostName
参数的更多信息,请参见本章的其他部分。另请参见第 25.4.1 节“NDB 集群的快速测试设置”,以获取使用HostName
和 API 节点的配置示例。任何 ndb_mgm 客户端
这意味着,任何提供了管理服务器主机名(或 IP 地址)和端口(如果不是标准端口)的集群管理客户端都可以连接到集群并执行任何管理客户端命令。这包括
ALL STOP
和SHUTDOWN
等命令。
由于这些原因,有必要在网络级别保护集群。对于集群来说,最安全的网络配置是将集群节点之间的连接与任何其他网络通信隔离。这可以通过以下任何一种方法来实现:
将集群节点保存在与任何公共网络物理隔离的网络上。此选项最可靠;但是,其实施成本最高。
我们在此处展示了一个使用这种物理隔离网络的 NDB 集群设置示例:
此设置有两个网络,一个私有网络(实线框)用于集群管理服务器和数据节点,一个公共网络(虚线框)用于 SQL 节点。(我们展示了使用千兆交换机连接的管理节点和数据节点,因为这提供了最佳性能。)这两个网络都受到硬件防火墙(有时也称为 基于网络的防火墙)的保护,免受外部攻击。
这种网络设置最安全,因为没有任何数据包可以从网络外部到达集群的管理节点或数据节点,而且集群的任何内部通信都无法到达外部(除非经过 SQL 节点),只要 SQL 节点不允许转发任何数据包即可。当然,这意味着所有 SQL 节点都必须得到保护,以防止黑客攻击。
重要关于潜在的安全漏洞,SQL 节点与任何其他 MySQL 服务器没有什么不同。有关可用于保护 MySQL 服务器的技术说明,请参见第 8.1.3 节“使 MySQL 安全地抵御攻击者”。
使用一个或多个软件防火墙(也称为 基于主机的防火墙)来控制哪些数据包从不需要访问集群的网络部分传递到集群。在这种类型的设置中,必须在集群中的每个主机上安装软件防火墙,否则可能会从本地网络外部访问这些主机。
基于主机的选项实施成本最低,但纯粹依靠软件来提供保护,因此最难保持安全。
这种类型的 NDB 集群网络设置如下图所示:
使用这种类型的网络设置意味着有两个 NDB 集群主机区域。每个集群主机都必须能够与集群中的所有其他机器通信,但只有那些托管 SQL 节点的机器(虚线框)才允许与外部进行任何联系,而包含数据节点和管理节点的区域中的机器(实线框)必须与任何不属于集群的机器隔离。使用集群的应用程序和这些应用程序的用户不得被允许直接访问管理节点和数据节点主机。
要做到这一点,您必须设置软件防火墙,根据运行在每个集群主机上的节点类型,将流量限制在下表中显示的一种或多种类型:
表 25.40 基于主机的防火墙集群配置中的节点类型
节点类型 允许的流量 SQL 或 API 节点 它来自管理节点或数据节点的 IP 地址(使用任何 TCP 或 UDP 端口)。
它来自集群所在的网络内部,并且位于您的应用程序正在使用的端口上。
数据节点或管理节点 它来自管理节点或数据节点的 IP 地址(使用任何 TCP 或 UDP 端口)。
它来自 SQL 或 API 节点的 IP 地址。
应拒绝任何不是表中针对给定节点类型显示的流量。
配置防火墙的具体细节因防火墙应用程序而异,超出了本手册的范围。iptables 是一种非常常见且可靠的防火墙应用程序,它经常与 APF 一起使用,作为前端,以简化配置。如果您选择实现这种类型的 NDB 集群网络设置,或者下一项中讨论的““混合””类型,您可以(并且应该)查阅您所使用的软件防火墙的文档。
也可以结合使用前两种方法,同时使用硬件和软件来保护集群,也就是说,同时使用基于网络的防火墙和基于主机的防火墙。在安全级别和成本方面,这介于前两种方案之间。这种类型的网络设置将集群保留在硬件防火墙后面,但允许传入的数据包穿过将所有集群主机连接在一起的路由器,到达 SQL 节点。
下面展示了组合使用硬件防火墙和软件防火墙的 NDB 集群的一种可能的网络部署:
在这种情况下,您可以在硬件防火墙中设置规则,以拒绝除 SQL 节点和 API 节点之外的任何外部流量,然后仅在应用程序所需的端口上允许流量到达它们。
无论您使用哪种网络配置,请记住,从保持集群安全的角度来看,您的目标始终如一:防止任何不必要的流量到达集群,同时确保集群中节点之间最有效的通信。
由于 NDB 集群需要打开大量端口才能在节点之间进行通信,因此建议的选项是使用隔离网络。这是防止不需要的流量到达集群的最简单方法。
如果您希望远程管理 NDB 集群(即从本地网络外部管理),则建议的方法是使用 ssh 或其他安全的登录 shell 访问 SQL 节点主机。然后,您可以从该主机运行管理客户端,以从集群自己的本地网络内部安全地访问管理服务器。
尽管理论上可以这样做,但不建议使用 ndb_mgm 直接从运行集群的本地网络外部管理集群。由于管理客户端和管理服务器之间既不进行身份验证也不进行加密,因此这是一种极不安全的集群管理方式,几乎肯定迟早会被攻破。