文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  NDB Cluster 和 MySQL 权限

25.6.21.2 NDB Cluster 和 MySQL 权限

在本节中,我们将讨论 MySQL 权限系统在与 NDB Cluster 相关时的工作原理,以及这对保持 NDB Cluster 安全性的影响。

标准 MySQL 权限适用于 NDB Cluster 表。这包括所有在数据库、表和列级别授予的 MySQL 权限类型(SELECT 权限、UPDATE 权限、DELETE 权限等等)。与任何其他 MySQL 服务器一样,用户和权限信息存储在 mysql 系统数据库中。用于在 NDB 表、包含此类表的数据库以及此类表中的列上授予和撤销权限的 SQL 语句在所有方面与用于连接涉及任何(其他)MySQL 存储引擎的数据库对象的 GRANTREVOKE 语句相同。对于 CREATE USERDROP USER 语句也是如此。

重要的是要记住,默认情况下,MySQL 授权表使用 InnoDB 存储引擎。因此,这些表通常不会在充当 NDB Cluster 中 SQL 节点的 MySQL 服务器之间复制或共享。换句话说,用户及其权限的更改默认情况下不会自动在 SQL 节点之间传播。如果需要,您可以启用 MySQL 用户和权限在 NDB Cluster SQL 节点之间的同步;有关详细信息,请参见 第 25.6.13 节“权限同步和 NDB_STORED_USER”

相反,由于 MySQL 中没有办法拒绝权限(权限要么可以被撤销,要么根本不授予,但不能拒绝),因此无法对一个 SQL 节点上的 NDB 表提供来自具有另一个 SQL 节点上权限的用户的特殊保护;即使您没有使用用户的自动权限分配,也是如此。对此的决定性例子是 MySQL root 帐户,它可以对任何数据库对象执行任何操作。结合 config.ini 文件中的空 [mysqld][api] 部分,此帐户可能特别危险。要了解原因,请考虑以下场景

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

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

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

如果满足这些条件,那么任何人在任何地方都可以使用 --ndbcluster --ndb-connectstring=management_host 启动一个 MySQL 服务器,并访问此 NDB Cluster。使用 MySQL root 帐户,此人可以执行以下操作

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

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

    • SELECT * FROM some_tableTABLE some_table 以读取任何表中的所有数据

    • DELETE FROM some_table 或 TRUNCATE TABLE 以删除表中的所有数据

    • DESCRIBE some_tableSHOW CREATE TABLE some_table 以确定表架构

    • UPDATE some_table SET column1 = 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 Cluster SQL 节点上为 root 帐户使用不同的密码。

总之,如果 NDB Cluster 可以直接从本地网络外部访问,那么它就不安全。

重要

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

如果需要在 SQL 节点之间同步 mysql 系统表,可以使用标准 MySQL 复制来完成,或者使用脚本在 MySQL 服务器之间复制表条目。用户及其权限可以使用 NDB_STORED_USER 权限共享并保持同步。

摘要。  关于 NDB Cluster 的 MySQL 权限系统,最重要的是要记住以下几点

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

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

  3. 一旦 MySQL 用户从 NDB Cluster 中的一个 SQL 节点获得了对 NDB 表的权限,该用户就可以 看到 该表中的任何数据,无论该数据来自哪个 SQL 节点,即使该用户没有被共享。