MySQL Cluster篇19 — 安全问题

概述

本章,您将了解 MySQL NDB Cluster 中关于网络以及安全方面的问题说明。

安全性

MySQL NDB Cluster 的「开箱即用」并不是安全的,因此您或者您的网络管理员必须采取适当的步骤来确保集群不会受到网络威胁。

集群通信协议的本质是不安全的,且集群环境中节点与节点之间的通信并没有使用类似加密的安全措施。由于集群环境对网络速度以及延迟非常敏感,因此节点与节点之间的网络连接 不建议 使用 SSL 加密或者其他加密,这会导致通信速度变慢。同样的,集群环境中没有使用类似 身份验证 之类的来控制访问,因为强加 身份验证 会对集群的性能产生不利的影响。

在访问集群时,以下两种情况不会检查源 IP 地址:

  • config.ini 全局配置文件中,针对 SQL 节点使用不包含任何内容的 "[mysqld]" 标题,针对数据节点使用不包含任何内容的 "[ndbd]" 标题。这也意味着,任意扮演 SQL 节点或数据节点类型的主机,只要知道了管理节点的主机名与端口(或者 IP 地址与端口),就可以连接到集群环境中并且不受限制的访问数据
  • 任意的 ndb_mgm 客户端。众所周知,ndb_mgm 命令的用法为 ndb_mgm [host_name] [port_num]。这意味着只要知道了了管理节点的主机与端口(或者 IP 地址与端口),就可以不受限制的执行任意交互命令,比如 all stopshutdow

由于有这些安全方面的问题,因此有必要在网络这个级别上保护集群,即将集群各个节点之间的连接与任何其他的网络通信隔离开来,可通过以下任意一种方式来实现:

  • 使用硬件防火墙实现物理隔离网络,将集群的网络与公共网络进行分离。该方式最可靠,但实现成本最高。比如类似这样的:

    file

  • 使用一个或多个软件防火墙(比如 Firewalld)来对数据包进行过滤,以允许或拒绝其他主机的连接。在这种方式中,集群环境中的每一个主机都必须安装软件防火墙。该方式成本最低,但可靠性以及安全性没有那么高。每个集群当中的主机都必须能够互相之间进行通信,其中 SQL 节点可对外进行任意的通信,但管理节点和数据节点必须与不属于集群环境的任何机器进行隔离,不能允许这些机器直接访问,比如类似这样的:

    file

提示
对于工作在网络边缘的防火墙,我们则称为网络防火墙,一般由硬件设备进行处理,也称硬件防火墙。对于工作在主机/服务器边缘的防火墙,我们则称为主机防火墙,一般由软件进行处理,也称软件防火墙。

用户同步问题

Q:当集群中存在多个 SQL 节点时,在单个 SQL 节点中创建的用户、用户权限、密码会同步到其他 SQL 节点吗?

会的。这依靠 ndb_stored_user 权限来启用,需要注意的是,无论您是对用户赋予该权限或撤销该权限,必须在语法中显式使用 on *.*

一旦您在单个 SQL 节点创建普通用户且赋予了 ndb_stored_user 权限,则该普通用户的账户、对应角色、对应权限、密码等信息可同步至所有的 SQL 节点。

注意!
ndb_stored_user 权限的同步特点仅在 ndbcluster 存储引擎中生效。

在 192.168.100.16 终端中创建 MySQL NDB Cluster 的登录用户:

Shell > /usr/local/mysql/bin/mysql -h localhost -u root --password="Google-,Bing500"

MySQL > create user 'frank'@'%' identified by 'Ple189-S!cx36';

MySQL > grant all privileges on *.* to 'frank'@'%';

MySQL > select host,user from  mysql.user;
select  host,user  from  mysql.user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | frank            |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
5 rows in set (0.00 sec)

# 这里可以看到,默认就有 NDB_STORED_USER 的用户权限
MySQL > show grants for 'frank'@'%' \G;
*************************** 1. row ***************************
Grants for frank@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `frank`@`%`
*************************** 2. row ***************************
Grants for frank@%: GRANT ...INNODB_REDO_LOG_ENABLE,NDB_STORED_USER,OPTIMIZE_LOCAL_TABLE... ON *.* TO `frank`@`%`
2 rows in set (0.00 sec)

此时在另外一个 SQL 节点(192.168.100.22)上:

Shell > /usr/local/mysql/bin/mysql -h localhost -u root --password="PassOut,15:0->"

MySQL > select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| frank            | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

MySQL > show grants for 'frank'@'%' \G;
*************************** 1. row ***************************
Grants for frank@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `frank`@`%`
*************************** 2. row ***************************
Grants for frank@%: GRANT ...INNODB_REDO_LOG_ENABLE,NDB_STORED_USER,OPTIMIZE_LOCAL_TABLE... ON *.* TO `frank`@`%`

# 你依然可以使用 frank 用户登录
Shell > /usr/local/mysql/bin/mysql -h localhost -u frank --password='Ple189-S!cx36'
提示
不建议将所有 SQL 节点中同一 root 用户的密码设置为相同,这会增加安全风险。手动创建的普通用户,在赋予相关权限的情况下,则共享用户的名称、角色、权限以及密码。
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇