21.5.17.2 NDB 群集和 MySQL 特权

在本节中,我们将讨论 MySQL 特权系统相对于 NDB Cluster 的工作方式,以及对保持 NDB Cluster 安全性的意义。

标准 MySQL 特权适用于 NDB 群集 table。这包括在数据库,table 和列级别上授予的所有 MySQL 特权类型(SELECT特权,UPDATE特权,DELETE特权等)。与其他任何 MySQL Server 一样,用户和特权信息存储在mysql系统数据库中。用于授予和撤消NDBtable,包含此类 table 的数据库以及此类 table 中的列的特权的 SQL 语句在所有方面都与用于涉及任何(其他)MySQL 存储引擎的数据库对象的GRANTREVOKE语句相同。关于CREATE USERDROP USER语句,情况也是如此。

请务必记住,默认情况下,MySQL 授权 table 使用MyISAM存储引擎。因此,通常在 NDB 群集中充当 SQL 节点的 MySQL 服务器之间不会复制或共享这些 table。换句话说,默认情况下,用户及其特权的更改不会自动在 SQL 节点之间传播。如果愿意,可以在 NDB Cluster SQL 节点之间启用 MySQL 用户和特权的自动分发;有关详细信息,请参见第 21.5.12 节,“使用共享授予 table 的分布式特权”

相反,由于 MySQL 中没有办法拒绝特权(特权可以首先被吊销或不被授予,但不能以此方式被拒绝),因此对于一个 SQL 节点上的NDBtable,用户没有以下特殊保护:在另一个 SQL 节点上具有特权; (即使您没有使用自动分配用户权限,这也是正确的。它的 Authority 示例是 MySQL root帐户,该帐户可以对任何数据库对象执行任何操作。结合config.ini文件的空[mysqld][api]部分,此帐户可能特别危险。要了解原因,请考虑以下情形:

  • config.ini文件包含至少一个空的[mysqld][api]部分。这意味着 NDB 群集 Management 服务器不检查 MySQL 服务器(或其他 API 节点)从其访问 NDB 群集的主机。

  • 没有防火墙,或者防火墙无法防止从网络外部的主机访问 NDB 群集。

  • NDB 群集 Management 服务器的主机名或 IP 地址是已知的,或者可以从网络外部确定。

如果满足这些条件,则任何地方的任何人都可以使用--ndbcluster --ndb-connectstring=management_host启动 MySQL Server 并访问此 NDB 群集。然后,使用 MySQL root帐户,此人可以执行以下操作:

  • 执行元数据语句,例如SHOW DATABASES语句(以获取服务器上所有NDB数据库的列 table)或从 some_ndb_database 中显示 table语句以获取给定数据库中所有NDBtable 的列 table

  • 在任何发现的 table 上运行任何合法的 MySQL 语句,例如:

  • SELECT * FROM some_table从任何 table 中读取所有数据

    • DELETE FROM some_table删除 table 中的所有数据

    • DESCRIBE some_tableSHOW CREATE TABLE some_table确定 table 架构

    • UPDATE some_table SET column1 = some_value使用“垃圾”数据填充 table 格列;与仅删除所有数据相比,这实际上可能造成更大的损害

更阴险的变化可能包括以下语句:

UPDATE some_table SET an_int_column = an_int_column + 1

or

UPDATE some_table SET a_varchar_column = REVERSE(a_varchar_column)

此类恶意声明仅受攻击者的想象力限制。

避免此类混乱的唯一安全 table 是那些使用除NDB之外的存储引擎创建的 table,因此对于“流氓” SQL 节点不可见。

root身份登录的用户还可以访问INFORMATION_SCHEMA数据库及其 table,从而获取有关数据库,table,存储的例程,计划的事件以及元数据存储在INFORMATION_SCHEMA中的任何其他数据库对象的信息。

除非您使用分布式特权,否则对不同的 NDB Cluster SQL 节点上的root帐户使用不同的密码也是一个很好的主意。

总而言之,如果可以从本地网络外部直接访问 NDB 群集,则不能拥有一个安全的 NDB 群集。

Important

请勿将 MySQL 根帐户密码留空。在将 MySQL 作为 NDB 群集 SQL 节点运行时,这与作为独立(非集群)MySQL 服务器运行它时一样,并且在将 MySQL Server 配置为 SQL 之前,应作为 MySQL 安装过程的一部分来完成。 NDB 群集中的节点。

如果希望使用 NDB Cluster 的分布式特权功能,则不应简单地将mysql数据库中的系统 table 转换为手动使用NDB存储引擎。为此,请使用提供的存储过程。参见第 21.5.12 节,“使用共享授予 table 的分布式特权”

否则,如果需要在 SQL 节点之间同步mysql系统 table,则可以使用标准的 MySQL 复制来进行同步,或者使用脚本在 MySQL 服务器之间复制 table 条目。

摘要. 有关 NDB 群集的 MySQL 特权系统,需要记住的最重要要点如下:

  • 在一个 SQL 节点上构建的用户和特权不会自动存在,也不会在群集中的其他 SQL 节点上生效。相反,删除群集中一个 SQL 节点上的用户或特权不会从任何其他 SQL 节点上删除用户或特权。

  • 您可以使用 SQL 脚本及其包含的存储过程在 SQL 节点之间分配 MySQL 用户和特权,这些脚本是为此目的在 NDB Cluster 分发中提供的。

  • 从 NDB 群集中的一个 SQL 节点向 MySQL 用户授予NDBtable 的特权后,即使您未使用特权分配,该用户也可以“查看”该 table 中的任何数据,而与数据的原始 SQL 节点无关。