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