• 首页
  • css3教程
  • html5教程
  • jQuery手册
  • vue手册
  • php手册
  • MySQL手册
  • apache手册
  • redis手册
  • NDB群集和MySQL特权

    在本节中,我们将讨论MySQL特权系统相对于NDB Cluster的工作方式,以及这对于确保NDB Cluster安全的含义。

    标准MySQL特权适用于NDB群集表。这包括在数据库,表和列级别上授予的所有MySQL特权类型(SELECT特权,UPDATE特权,DELETE特权等)。与其他任何MySQL Server一样,用户和特权信息也存储在mysql系统数据库中。在NDB表,包含此类表的数据库以及此类表中的列上用于授予和撤消特权的SQL语句在所有方面都与GRANTREVOKE语句(与涉及任何(其他)MySQL存储引擎的数据库对象)相同。关于CREATE USERDROP 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_hostroot

    • 执行元数据语句,例如SHOW DATABASES语句(以获取NDB服务器上所有数据库的列表)或语句以获取给定数据库中所有表的列表SHOW TABLES FROM some_ndb_databaseNDB
    • 在任何发现的表上运行任何合法的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_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

      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特权系统要记住的最重要要点:

    1. 在一个SQL节点上建立的用户和特权不会自动存在,也不会在群集中的其他SQL节点上生效。相反,删除群集中一个SQL节点上的用户或特权不会从任何其他SQL节点上删除用户或特权。
    2. 您可以使用SQL脚本及其包含的存储过程在SQL节点之间分发MySQL用户和特权,这些脚本在NDB Cluster分发中为此目的提供。
    3. 一旦NDB从NDB群集中的一个SQL节点向MySQL用户授予了对表的特权,即使您未使用特权分配,该用户也可以“参见”该表中的任何数据,而与数据的来源SQL节点无关。