在本节中,我们将讨论 MySQL 权限系统如何与 NDB 集群一起工作,以及这对保持 NDB 集群安全的影响。
标准的 MySQL 权限适用于 NDB 集群表。这包括所有 MySQL 权限类型(在数据库、表和列级别授予的 SELECT
权限、UPDATE
权限、DELETE
权限等)。与任何其他 MySQL 服务器一样,用户和权限信息存储在 mysql
系统数据库中。用于在 NDB
表、包含此类表的数据库以及此类表中的列上授予和撤销权限的 SQL 语句,在所有方面都与连接到涉及任何(其他)MySQL 存储引擎的数据库对象时使用的 GRANT
和 REVOKE
语句相同。对于 CREATE USER
和 DROP USER
语句,情况也是如此。
重要的是要记住,默认情况下,MySQL 授权表使用 InnoDB
存储引擎。因此,这些表通常不会在充当 NDB 集群中 SQL 节点的 MySQL 服务器之间复制或共享。换句话说,用户及其权限的更改默认情况下不会在 SQL 节点之间自动传播。如果您愿意,您可以启用 MySQL 用户和权限在 NDB 集群 SQL 节点之间的同步;有关详细信息,请参阅 第 25.6.13 节,“权限同步和 NDB_STORED_USER”。
相反,因为在 MySQL 中没有办法拒绝权限(权限可以被撤销或根本不授予,但不能被拒绝),所以在一个 SQL 节点上对 NDB
表没有特殊的保护,以防止在另一个 SQL 节点上具有权限的用户访问;即使您没有使用用户权限的自动分发,也是如此。这方面最典型的例子是 MySQL root
帐户,它可以对任何数据库对象执行任何操作。与 config.ini
文件中空的 [mysqld]
或 [api]
部分组合使用时,此帐户可能特别危险。要了解原因,请考虑以下场景
config.ini
文件包含至少一个空的[mysqld]
或[api]
部分。这意味着 NDB 集群管理服务器不会检查 MySQL 服务器(或其他 API 节点)访问 NDB 集群的主机。没有防火墙,或者防火墙无法阻止从网络外部主机访问 NDB 集群。
NDB 集群管理服务器的主机名或 IP 地址是已知的,或者可以从网络外部确定。
如果这些条件为真,那么任何地方的任何人都可以启动带有 --ndbcluster
--ndb-connectstring=
的 MySQL 服务器并访问此 NDB 集群。使用 MySQL management_host
root
帐户,此人可以执行以下操作
执行元数据语句,例如
SHOW DATABASES
语句(获取服务器上所有NDB
数据库的列表)或SHOW TABLES FROM
语句(获取给定数据库中所有some_ndb_database
NDB
表的列表)-
SELECT * FROM
或some_table
TABLE
从任何表中读取所有数据some_table
DELETE FROM
或 TRUNCATE TABLE 从表中删除所有数据some_table
DESCRIBE
或some_table
SHOW CREATE TABLE
确定表模式some_table
UPDATE
用“垃圾”数据填充表列;这实际上可能比仅仅删除所有数据造成更大的损害some_table
SETcolumn1
=some_value
更隐蔽的变化可能包括如下语句
UPDATE some_table SET an_int_column = an_int_column + 1
或
UPDATE some_table SET a_varchar_column = REVERSE(a_varchar_column)
这种恶意语句的限制只受攻击者想象力的限制。
唯一能够免受此类破坏的表是那些使用
NDB
以外的存储引擎创建的表,因此“流氓”SQL 节点无法看到这些表。可以以
root
用户身份登录的用户还可以访问INFORMATION_SCHEMA
数据库及其表,从而获取有关数据库、表、存储例程、计划事件和INFORMATION_SCHEMA
中存储了元数据的任何其他数据库对象的信息。除非您使用共享权限,否则对不同的 NDB 集群 SQL 节点上的
root
帐户使用不同的密码也是一个非常好的主意。
总而言之,如果可以从本地网络外部直接访问 NDB 集群,则该集群就不安全。
切勿将 MySQL root 帐户密码留空。这在将 MySQL 作为 NDB 集群 SQL 节点运行时和将其作为独立(非集群)MySQL 服务器运行时一样重要,并且应该在将 MySQL 服务器配置为 NDB 集群中的 SQL 节点之前,作为 MySQL 安装过程的一部分完成。
如果需要在 SQL 节点之间同步 mysql
系统表,可以使用标准的 MySQL 复制来执行此操作,也可以使用脚本在 MySQL 服务器之间复制表条目。可以使用 NDB_STORED_USER
权限共享用户及其权限并保持同步。
总结。 以下列出了有关 NDB 集群的 MySQL 权限系统需要记住的最重要的几点:
在一个 SQL 节点上建立的用户和权限不会自动存在于或在集群中的其他 SQL 节点上生效。相反,删除集群中一个 SQL 节点上的用户或权限不会从任何其他 SQL 节点中删除该用户或权限。
您可以使用
NDB_STORED_USER
在 SQL 节点之间共享 MySQL 用户和权限。一旦 MySQL 用户从 NDB 集群中的一个 SQL 节点被授予对
NDB
表的权限,则该用户可以“看到”该表中的任何数据,而不管数据来自哪个 SQL 节点,即使该用户未被共享。