在本节中,我们讨论了 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 用户和权限在 NDB 集群 SQL 节点之间的同步;请参阅 第 25.6.13 节,“权限同步和 NDB_STORED_USER”,以获取详细信息。
另一方面,因为 MySQL 中没有拒绝权限的概念(权限可以被撤销或不授予,但不能被拒绝),因此,即使您不使用自动用户权限分布,也没有特殊保护 NDB
表在一个 SQL 节点上的用户权限来自另一个 SQL 节点;这甚至适用于 MySQL root
帐户,该帐户可以在任何数据库对象上执行任何操作。结合空的 [mysqld]
或 [api]
部分的 config.ini
文件,这个帐户变得尤其危险。要了解为什么,请考虑以下场景:
-
config.ini
文件至少包含一个空的[mysqld]
或[api]
部分。这意味着 NDB 集群管理服务器不会检查从哪个主机访问 NDB 集群的 MySQL 服务器(或其他 API 节点)。 -
没有防火墙,或者防火墙未能保护 NDB 集群免受外部网络的访问。
-
NDB 集群管理服务器的主机名或 IP 地址可以从外部网络确定。
如果这些条件为真,那么任何人都可以从任何地方启动一个 MySQL 服务器,使用 --ndbcluster
--ndb-connectstring=
并访问这个 NDB 集群。然后,使用 MySQL management_host
root
帐户,这个人可以执行以下操作:
-
执行元数据语句,例如
SHOW DATABASES
语句(以获取服务器上的所有NDB
数据库的列表)或SHOW TABLES FROM
语句以获取给定数据库中的所有some_ndb_database
NDB
表的列表 -
-
SELECT * FROM
或某个表
TABLE
读取任何表中的所有数据某个表
-
DELETE FROM
或 TRUNCATE TABLE 删除表中的所有数据某个表
-
DESCRIBE
或某个表
SHOW CREATE TABLE
确定表模式某个表
-
UPDATE
将表列填充为垃圾数据;这可能会比简单地删除所有数据造成更大的损害某个表
SET列1
=某个值
更恶毒的变体可能包括类似这样的语句:
UPDATE some_table SET an_int_column = an_int_column + 1
or
UPDATE some_table SET a_varchar_column = REVERSE(a_varchar_column)
这种恶意语句的可能性只受攻击者的想象力限制。
唯一安全的表将是使用其他存储引擎创建的表,而不是
NDB
,因此不会被“恶意”SQL 节点所见。作为
root
登录的用户也可以访问INFORMATION_SCHEMA
数据库及其表,从而获取数据库、表、存储过程、计划事件和其他数据库对象的元数据。使用不同的密码 для
root
帐户在不同的 NDB 集群 SQL 节点上也是非常明智的,除非您使用共享权限。 -
总之,如果 NDB 集群直接从外部网络访问,那么它将不安全。
永远不要将 MySQL 根帐户密码留空。这在运行 MySQL 作为 NDB 集群 SQL 节点时同样重要,在安装 MySQL 服务器之前作为 NDB 集群 SQL 节点配置的一部分。
如果您需要在 SQL 节点之间同步 mysql
系统表,可以使用标准 MySQL 复制或使用脚本将表条目复制到 MySQL 服务器之间。用户和权限可以使用 NDB_STORED_USER
权限共享和同步。
总结。 关于 NDB 集群的 MySQL 权限系统的最重要点是:
-
在一个 SQL 节点上建立的用户和权限不会自动存在或生效于集群中的其他 SQL 节点。相反,在一个 SQL 节点上删除用户或权限也不会从其他 SQL 节点上删除用户或权限。
-
您可以使用
NDB_STORED_USER
在 SQL 节点之间共享 MySQL 用户和权限。 -
一旦在 NDB 集群中的一个 SQL 节点上授予了 MySQL 用户对
NDB
表的权限,那么该用户可以在该表中的任何数据,ardless of the SQL 节点 from which the data originated,即使该用户没有共享。