在本节中,我们将讨论MySQL特权系统是如何与NDB集群相关联的,以及这对保持NDB集群安全的影响。
标准MySQL权限适用于NDB集群表。这包括所有MySQL特权类型(选择
特权,更新
特权,删除
特权,等等)在数据库、表和列级别上授予。与任何其他MySQL服务器一样,用户和特权信息存储在mysql
系统数据库。用于授予和撤销权限的SQL语句NDB
表、包含此类表的数据库以及此类表中的列在所有方面都与格兰特
和撤销
用于连接涉及任何(其他)MySQL存储引擎的数据库对象的语句。同样的事情也适用于创建用户
和减少用户
语句。
重要的是要记住,默认情况下,MySQL授权表使用MyISAM
存储引擎。正因为如此,这些表通常不会在作为NDB集群中的SQL节点的MySQL服务器之间复制或共享。换句话说,默认情况下,用户及其特权的更改不会在SQL节点之间自动传播。如果你愿意,你可以在NDB集群SQL节点上自动分配MySQL用户和权限;看到第18.6.12节,“使用共享授权表的分布式权限”查阅详情。
相反,因为在MySQL中没有办法拒绝特权(特权可以被撤销或不被授予,但不能被拒绝),所以没有特殊的保护NDB
一个SQL节点上的表来自拥有另一个SQL节点权限的用户;(即使您没有使用用户权限的自动分配,这也是正确的。最典型的例子就是MySQL根
帐户,它可以对任何数据库对象执行任何操作。与空结合(mysqld)
或(api)
各部分config.ini
文件,这个帐户可能特别危险。要理解其中的原因,请考虑以下场景:
的
config.ini
文件至少包含一个空(mysqld)
或(api)
部分。这意味着NDB集群管理服务器不检查MySQL服务器(或其他API节点)访问NDB集群的主机。没有防火墙,或者防火墙无法阻止网络外部主机访问NDB集群。
NDB集群管理服务器的主机名或IP地址已知或可以从网络外确定。
如果这些条件是正确的,那么任何人,在任何地方都可以启动MySQL服务器——ndbcluster
——ndb-connectstring =
并访问该NDB集群。使用MySQLmanagement_host
根
帐户,这个人可以执行以下操作:
执行元数据语句,例如
显示数据库
语句(以获取所有NDB
服务器上的数据库)或显示来自
语句获取所有的列表some_ndb_database
NDB
表-
Select * from
从任何表中读取所有数据some_table
删除从
删除表中的所有数据some_table
描述
或some_table
显示创建表
来确定表模式some_table
更新
来填充表列”垃圾”数据;这实际上可能比简单地删除所有数据造成更大的损害some_table
集column1
=some_value
更阴险的变化可能包括以下语句:
更新some_table集an_int_column=an_int_column+ 1
或
更新some_table集a_varchar_column=反向(a_varchar_column)
这种恶意的言论只会受到攻击者想象力的限制。
在这种混乱中唯一安全的表是那些使用其他存储引擎创建的表
NDB
,因此不可见的”流氓”SQL节点。可以以
根
还可以访问INFORMATION_SCHEMA
数据库及其表,从而获取关于数据库、表、存储例程、计划事件以及存储元数据的任何其他数据库对象的信息INFORMATION_SCHEMA
.使用不同的密码也是一个很好的主意
根
帐户在不同的NDB集群SQL节点上,除非您使用分布式权限。
总而言之,如果您可以从本地网络外部直接访问NDB集群,则不可能拥有安全的NDB集群。
请勿将MySQL root帐号密码设置为空.在将MySQL服务器配置为NDB集群中的SQL节点之前,将MySQL作为一个独立的(非集群)MySQL服务器运行也是如此,这应该作为MySQL安装过程的一部分。
如果你希望使用NDB集群的分布式特权功能,你不应该简单地转换系统表mysql
数据库来使用NDB
手动操作存储引擎。请使用为此目的提供的存储过程;看到第18.6.12节,“使用共享授权表的分布式权限”.
否则,如果需要同步mysql
SQL节点之间的系统表,你可以使用标准的MySQL复制来做到这一点,或者使用一个脚本来复制MySQL服务器之间的表项。
总结。关于NDB集群的MySQL特权系统,需要记住的最重要的一点是:
在一个SQL节点上建立的用户和权限不会自动在集群中的其他SQL节点上存在或生效。相反,删除集群中一个SQL节点上的用户或权限并不会删除其他SQL节点上的用户或权限。
您可以使用SQL脚本和其中包含的存储过程在SQL节点之间分发MySQL用户和权限,这些存储过程在NDB集群分发中为此目的提供。
一旦MySQL用户被授予权限
NDB
在一个NDB集群中的一个SQL节点上的表,该用户可以”看到”该表中的任何数据,而不管数据来自哪个SQL节点,即使您没有使用特权分布。