在本节中,我们将讨论 MySQL 权限系统在与 NDB Cluster 相关时的工作原理,以及这对保持 NDB Cluster 安全性的影响。
标准 MySQL 权限适用于 NDB Cluster 表。这包括所有在数据库、表和列级别授予的 MySQL 权限类型(SELECT
权限、UPDATE
权限、DELETE
权限等等)。与任何其他 MySQL 服务器一样,用户和权限信息存储在 mysql
系统数据库中。用于在 NDB
表、包含此类表的数据库以及此类表中的列上授予和撤销权限的 SQL 语句在所有方面与用于连接涉及任何(其他)MySQL 存储引擎的数据库对象的 GRANT
和 REVOKE
语句相同。对于 CREATE USER
和 DROP 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=
启动一个 MySQL 服务器,并访问此 NDB Cluster。使用 MySQL management_host
root
帐户,此人可以执行以下操作
执行元数据语句,例如
SHOW DATABASES
语句(获取服务器上所有NDB
数据库的列表)或SHOW TABLES FROM
语句以获取给定数据库中所有some_ndb_database
NDB
表的列表-
SELECT * FROM
或some_table
TABLE
以读取任何表中的所有数据some_table
DELETE FROM
或 TRUNCATE TABLE 以删除表中的所有数据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)
这种恶意语句仅受攻击者的想象力限制。
唯一不受此类混乱影响的表将是那些使用
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 权限系统,最重要的是要记住以下几点
在一个 SQL 节点上建立的用户和权限不会自动存在或生效于集群中的其他 SQL 节点。相反,从集群中的一个 SQL 节点中删除用户或权限不会从任何其他 SQL 节点中删除该用户或权限。
您可以使用
NDB_STORED_USER
在 SQL 节点之间共享 MySQL 用户和权限。一旦 MySQL 用户从 NDB Cluster 中的一个 SQL 节点获得了对
NDB
表的权限,该用户就可以 “看到” 该表中的任何数据,无论该数据来自哪个 SQL 节点,即使该用户没有被共享。