Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  NDB Cluster and MySQL Privileges

25.6.21.2 NDB 集群和 MySQL 权限

在本节中,我们讨论了 MySQL 权限系统如何在 NDB 集群中工作,以及这对保持 NDB 集群安全的影响。

标准的 MySQL 权限适用于 NDB 集群表。这包括所有 MySQL 权限类型(SELECT 权限、UPDATE 权限、DELETE 权限等)授予数据库、表和列级别。与任何其他 MySQL 服务器一样,用户和权限信息存储在 mysql 系统数据库中。用于授予和撤销 NDB 表、包含这些表的数据库和这些表中的列的权限的 SQL 语句与用于连接其他 MySQL 存储引擎的数据库对象的 GRANTREVOKE 语句相同。同样,对于 CREATE USERDROP 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=management_host 并访问这个 NDB 集群。然后,使用 MySQL root 帐户,这个人可以执行以下操作:

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

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

    • 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 集群直接从外部网络访问,那么它将不安全。

Important

永远不要将 MySQL 根帐户密码留空。这在运行 MySQL 作为 NDB 集群 SQL 节点时同样重要,在安装 MySQL 服务器之前作为 NDB 集群 SQL 节点配置的一部分。

如果您需要在 SQL 节点之间同步 mysql 系统表,可以使用标准 MySQL 复制或使用脚本将表条目复制到 MySQL 服务器之间。用户和权限可以使用 NDB_STORED_USER 权限共享和同步。

总结。 关于 NDB 集群的 MySQL 权限系统的最重要点是:

  1. 在一个 SQL 节点上建立的用户和权限不会自动存在或生效于集群中的其他 SQL 节点。相反,在一个 SQL 节点上删除用户或权限也不会从其他 SQL 节点上删除用户或权限。

  2. 您可以使用 NDB_STORED_USER 在 SQL 节点之间共享 MySQL 用户和权限。

  3. 一旦在 NDB 集群中的一个 SQL 节点上授予了 MySQL 用户对 NDB 表的权限,那么该用户可以在该表中的任何数据,ardless of the SQL 节点 from which the data originated,即使该用户没有共享。