Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 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节点之间复制或共享。这意味着,用户和他们权限的更改默认情况下不会自动在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集群管理服务器不会对访问NDB集群的MySQL Server(或其他API节点)的主机进行检查。

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

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

如果这些条件成立,那么任何人都可以在任何地方启动一个带有--ndbcluster--ndb-connectstring=管理服务器主机名或IP地址的MySQL Server,从而访问这个NDB集群。使用MySQL的root账户,这个人可以执行以下操作:

  • 执行元数据语句,如SHOW DATABASES(获取服务器上所有NDB数据库的列表)或SHOW TABLES FROM 某个NDB数据库名(获取特定数据库中所有NDB表的列表)。

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

    • SELECT * FROM <some_table>TABLE <some_table> 以读取表中的所有数据

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

    • DESCRIBE <some_table>SHOW CREATE TABLE <some_table> 来确定表的架构

    • UPDATE <some_table> SET <column1> = <some_value> 用垃圾数据填充表的列;这可能比简单地删除所有数据造成更大的损害

      更隐蔽的变体可能包括以下语句:

      UPDATE some_table SET an_int_column = an_int_column + 1

      or

      UPDATE some_table SET a_varchar_column = REVERSE(a_varchar_column)

      这些恶意语句仅由攻击者的想象力限制。

    只有使用存储引擎不是 NDB 创建的表才会安全,不受这种混乱的影响。

    一个可以以 root 身份登录的用户也可以访问 INFORMATION_SCHEMA 数据库及其表,并因此获得关于数据库、表格、存储程序、计划事件以及任何以 INFORMATION_SCHEMA 存储的其他数据库对象的信息。

    使用不同密码的不同 NDB 集群 SQL 节点上的 root 账户也是一个非常好的做法,除非您正在使用共享权限。

总之,你不能有一个安全的 NDB 集群,如果它直接可从外部网络访问。

Important

永不留空的 MySQL root 账户密码。这对于运行 MySQL 作为 NDB 集群 SQL 节点和作为独立(非集群)MySQL 服务器一样重要,应该在配置 MySQL 服务器作为 NDB 集群 SQL 节点之前作为 MySQL 安装过程的一部分完成。

如果您需要同步 mysql 系统表之间的 SQL 节点,可以使用标准的 MySQL 复制来实现这一点,或者编写脚本将表格条目复制到 MySQL 服务器之间。用户及其权限可以通过 NDB_STORED_USER 权限共享并保持同步。

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

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

  2. 您可以使用NDB_STORED_USER共享MySQL用户和权限,以便它们在SQL节点之间保持一致。

  3. 当一个MySQL用户在一个NDB表上获得权限时,该用户可以从任何SQL节点访问该表中的所有数据,即使该用户未被共享。即使是来自不同SQL节点的数据,该用户也能“看到”它。