#### 23.6.18.2 NDB 集群和 MySQL 权限

[](<>)

在本节中，我们将讨论 MySQL 特权系统如何与 NDB Cluster 相关，以及这对保持 NDB Cluster 安全的影响。

[](<>)标准 MySQL 权限适用于 NDB Cluster 表。这包括所有 MySQL 权限类型 ([`选择`](privileges-provided.html#priv_select)特权，[`更新`](privileges-provided.html#priv_update)特权，[`删除`](privileges-provided.html#priv_delete)权限等）在数据库、表和列级别上授予。与任何其他 MySQL 服务器一样，用户和权限信息存储在`mysql`系统数据库。用于授予和撤销权限的 SQL 语句[`新开发银行`](mysql-cluster.html)表、包含此类表的数据库以及此类表中的列在所有方面都与[`授予`](grant.html)和[`撤销`](revoke.html)与涉及任何（其他）MySQL 存储引擎的数据库对象结合使用的语句。同样的事情也适用于[`创建用户`](create-user.html)和[`删除用户`](drop-user.html)陈述。

[](<>)重要的是要记住，默认情况下，MySQL 授权表使用[`InnoDB`](innodb-storage-engine.html)存储引擎。因此，这些表通常不会在充当 NDB Cluster 中的 SQL 节点的 MySQL 服务器之间复制或共享。换句话说，默认情况下，用户及其权限的更改不会在 SQL 节点之间自动传播。如果您愿意，您可以在 NDB Cluster SQL 节点之间启用 MySQL 用户和权限的同步；看[第 23.6.12 节，“权限同步和 NDB\_已储存\_用户”](mysql-cluster-privilege-synchronization.html), 了解详情。

[](<>) [](<>)相反，因为在 MySQL 中没有办法拒绝特权（特权可以被撤销或不被授予，但不能被拒绝），因此没有特殊的保护`新开发银行`一个 SQL 节点上的表，来自对另一个 SQL 节点具有权限的用户；即使您没有使用自动分配用户权限也是如此。最权威的例子是 MySQL`根`帐户，它可以对任何数据库对象执行任何操作。结合空`[mysqld]`要么`[api]`的部分`配置文件`文件，此帐户可能特别危险。要了解原因，请考虑以下场景：

-   这`配置文件`文件包含至少一个空的`[mysqld]`要么`[api]`部分。这意味着 NDB Cluster 管理服务器不检查 MySQL 服务器（或其他 API 节点）访问 NDB Cluster 的主机。

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

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

    如果这些条件为真，那么任何人、任何地方都可以使用以下命令启动 MySQL 服务器[`--ndbcluster`](mysql-cluster-options-variables.html#option_mysqld_ndbcluster) [`--ndb-connectstring=*`管理主机`*`](mysql-cluster-options-variables.html#option_mysqld_ndb-connectstring)并访问此 NDB Cluster。使用 MySQL`根`帐户，然后此人可以执行以下操作：

-   执行元数据语句，例如[`显示数据库`](show-databases.html)声明（获取所有的列表[`新开发银行`](mysql-cluster.html)服务器上的数据库）或[`显示表格 *`some_ndb_database`*`](show-tables.html)获取所有列表的语句[`新开发银行`](mysql-cluster.html)给定数据库中的表

-   [](<>) [](<>)在任何发现的表上运行任何合法的 MySQL 语句，例如：

    -   `选择 * 从 *`一些表`*`要么`桌子 *`一些表`*`从任何表中读取所有数据

    -   `从 * 中删除`一些表`*`或 TRUNCATE TABLE 删除表中的所有数据

    -   `描述 *`一些表`*`要么`显示创建表 *`一些表`*`确定表模式

    -   `更新 *`一些表`* 放 *`第 1 列`* = *`一些值`*`用“垃圾”数据填充表格列；这实际上可能比简单地删除所有数据造成更大的损害

        更隐蔽的变化可能包括如下陈述：

        ```
        UPDATE some_table SET an_int_column = an_int_column + 1
        ```

        要么

        ```
        UPDATE some_table SET a_varchar_column = REVERSE(a_varchar_column)
        ```

        此类恶意言论仅受攻击者想象力的限制。

        唯一可以避免这种混乱的表是那些使用存储引擎创建的表，而不是`新开发银行`，因此对“流氓”SQL 节点不可见。

        [](<>) [](<>)可以登录的用户`根`也可以访问[`INFORMATION_SCHEMA`](information-schema.html)数据库及其表，从而获取有关数据库、表、存储例程、计划事件以及元数据存储在其中的任何其他数据库对象的信息`信息模式`.

        对用户使用不同的密码也是一个很好的主意`根`不同NDB群集SQL节点上的帐户，除非您使用的是共享权限。

    总之，如果可以从本地网络外部直接访问安全的NDB群集，则无法获得该群集。

重要的

*永远不要让MySQL根帐户密码为空*。将MySQL作为NDB群集SQL节点运行时，这一点与将其作为独立（非群集）MySQL服务器运行时一样正确。在将MySQL服务器配置为NDB群集中的SQL节点之前，应将其作为MySQL安装过程的一部分来完成。

如果你需要同步`mysql`在SQL节点之间的系统表中，可以使用标准的MySQL复制，或者使用脚本在MySQL服务器之间复制表项。用户及其权限可以通过[`NDB_存储用户`](privileges-provided.html#priv_ndb-stored-user)特权

**总结**关于NDB集群的MySQL特权系统，需要记住的最重要的几点如下：

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

2.  您可以使用在SQL节点之间共享MySQL用户和权限[`NDB_存储用户`](privileges-provided.html#priv_ndb-stored-user).

3.  一旦MySQL用户被授予[`NDB`](mysql-cluster.html)从NDB集群中的一个SQL节点创建的表，该用户可以“查看”该表中的任何数据，而不管数据来自哪个SQL节点，即使该用户未被共享。
