在本节中,我们讨论 MySQL 特权系统如何与 NDB Cluster 相关的工作以及这对保持 NDB Cluster 安全的影响。
标准 MySQL 权限适用于 NDB Cluster 表。这包括在数据库、表和列级别上授予的所有 MySQL 特权类型(SELECT
特权、
UPDATE
特权、
特权等)。DELETE
与任何其他 MySQL 服务器一样,用户和权限信息存储在mysql
系统数据库中。用于授予和撤销对
NDB
表、包含此类表的数据库以及此类表中的列的权限的 SQL 语句在所有方面都与用于连接任何(其他)MySQL 存储引擎的数据库对象的GRANT
和
语句相同。REVOKE
同样的事情也适用于
CREATE USER
和
DROP USER
声明。
重要的是要记住,默认情况下,MySQL 授权表使用MyISAM
存储引擎。因此,这些表通常不会在充当 NDB Cluster 中的 SQL 节点的 MySQL 服务器之间复制或共享。换句话说,默认情况下,用户及其权限的更改不会在 SQL 节点之间自动传播。如果你愿意,你可以启用跨 NDB Cluster SQL 节点的 MySQL 用户和权限的自动分配;有关详细信息,请参阅
第 21.6.13 节,“使用共享授权表的分布式权限”。
相反,因为在 MySQL 中没有拒绝权限的方法(权限可以首先被撤销或不授予,但不会被拒绝),对于NDB
一个 SQL 节点上的表,没有特殊的保护来自拥有权限的用户另一个 SQL 节点;(即使您没有使用自动分配用户权限也是如此。这方面的权威示例是 MySQL
root
帐户,它可以对任何数据库对象执行任何操作。结合文件的空
[mysqld]
或[api]
部分config.ini
,这个帐户可以是特别危险。要了解原因,请考虑以下情况:
该
config.ini
文件至少包含一个空节[mysqld]
或[api]
节。这意味着 NDB Cluster 管理服务器不检查 MySQL 服务器(或其他 API 节点)访问 NDB Cluster 的主机。没有防火墙,或者防火墙无法防止网络外部主机访问 NDB Cluster。
NDB Cluster 管理服务器的主机名或 IP 地址是已知的,或者可以从网络外部确定。
如果这些条件成立,那么任何人在任何地方都可以启动 MySQL 服务器
并访问这个 NDB Cluster。使用 MySQL
帐户,此人可以执行以下操作:
--ndbcluster
--ndb-connectstring=
management_host
root
执行元数据语句,例如
SHOW DATABASES
语句(获取NDB
服务器上所有数据库的列表)或 语句获取 给定数据库中所有表 的列表SHOW TABLES FROM
some_ndb_database
NDB
-
SELECT * FROM
从任何表中读取所有数据some_table
DELETE FROM
从表中删除所有数据some_table
DESCRIBE
或 确定表模式some_table
SHOW CREATE TABLE
some_table
UPDATE
用“垃圾”数据填充表列;这实际上可能比简单地删除所有数据造成更大的损害some_table
SETcolumn1
=some_value
更隐蔽的变体可能包括如下语句:
UPDATE some_table SET an_int_column = an_int_column + 1
或者
UPDATE some_table SET a_varchar_column = REVERSE(a_varchar_column)
此类恶意语句仅受攻击者想象力的限制。
唯一可以避免这种混乱的表是那些使用存储引擎而不是存储引擎创建的表,因此对“流氓” SQL 节点
NDB
不可见。可以登录的用户
root
还可以访问INFORMATION_SCHEMA
数据库及其表,从而获取有关数据库、表、存储例程、计划事件以及元数据存储在INFORMATION_SCHEMA
.root
除非您使用分布式权限,否则为不同 NDB Cluster SQL 节点上 的帐户使用不同的密码也是一个很好的主意。
总而言之,如果 NDB Cluster 可以从本地网络外部直接访问,则无法拥有安全的 NDB Cluster。
切勿将 MySQL root 帐户密码留空。这与将 MySQL 作为 NDB Cluster SQL 节点运行时和作为独立(非集群)MySQL 服务器运行时一样正确,并且应该在将 MySQL 服务器配置为 SQL 之前作为 MySQL 安装过程的一部分完成NDB Cluster 中的节点。
如果您希望使用 NDB Cluster 的分布式权限功能,您不应该简单地将mysql
数据库中的系统表转换为手动使用
NDB
存储引擎。请改用为此目的提供的存储过程;参见
第 21.6.13 节,“使用共享授权表的分布式权限”。
否则,如果您需要mysql
在 SQL 节点之间同步系统表,您可以使用标准的 MySQL 复制来实现,或者使用脚本在 MySQL 服务器之间复制表条目。
概括。 此处列出了关于 NDB Cluster 的 MySQL 特权系统要记住的最重要的几点:
在一个SQL节点上建立的用户和权限,在集群中的其他SQL节点上不会自动存在或生效。相反,删除集群中一个 SQL 节点上的用户或权限不会删除任何其他 SQL 节点上的用户或权限。
您可以使用 SQL 脚本及其包含的存储过程在 SQL 节点之间分配 MySQL 用户和权限,这些在 NDB Cluster 分发中为此目的提供。
一旦 MySQL 用户
NDB
从 NDB Cluster 中的一个 SQL 节点被授予对表的权限,该用户就可以“看到”该表中的任何数据,而不管数据来自哪个 SQL 节点,即使您没有使用权限分配。