Percona XtraDB Cluster(下称PXC)数据库集群节点在多台机器中分布,尽管这些节点在大多数情况下,位于同一个局域网内,其安全依旧有必要重视。PXC在各节点之间进行通信,通常使用了4个端口。这4个端口需要防火墙准许放行。其次节点间数据通信并没有加密,如果要考虑这部分安全增强,也需要采取相应的策略。下文基于这两点进行描述。
默认情况下,任何有权访问网络的人都可以连接到任何Percona XtraDB群集节点,既可以作为客户端,也可以作为加入群集的另一个节点。这可能会让他们查询您的数据或获得完整的副本。
一般来说,禁用到Percona XtraDB集群节点的所有远程连接是个好主意。如果您需要从网络外部的客户端或节点进行连接,则可以为此设置一个VPN(虚拟专用网络)。
防火墙可以让您根据您信任的客户端和节点过滤Percona XtraDB集群流量。
默认情况下,Percona XtraDB集群节点使用以下端口:
3306用于MySQL客户端连接和SST(状态快照传输)通过mysqldump。
4444用于基于rsync 和Percona XtraBackup的SST。
4567用于写集复制流量(通过TCP)和多播复制(通过TCP和UDP)。
4568用于IST(增量状态传输)。
理想情况下,您要确保每个节点上的这些端口只能从受信任的IP地址访问。
您可以实现包过滤使用iptables,firewalld,pf,或其他任何您所选择的防火墙。
要限制使用Percona XtraDB群集端口的访问权限iptables,您需要将新规则附加到INPUT过滤器表上的链中。
在以下示例中,IP地址的可信范围是192.168.0.1/24。假定只有Percona XtraDB集群节点和客户端将从这些IP连接。
要启用数据包筛选,请在每个Percona XtraDB群集节点上以root身份运行命令。
#iptables --append INPUT --in-interface eth0 \
--protocol tcp --match tcp --dport 3306 \
--source 192 .168.0.1/24 --jump ACCEPT
#iptables --append INPUT --in- interface eth0 \
--protocol tcp --match tcp --dport 4444 \
--source 192 .168.0.1/24 --jump ACCEPT
#iptables --append INPUT --in-interface eth0 \
--protocol tcp --match tcp --dport 4567 \
--source 192 .168.0.1/24 --jump ACCEPT
#iptables --append INPUT --in-interface eth0 \
--protocol tcp --match tcp --dport 4568 \
--source 192.168.0.1/24 --jump ACCEPT
#iptables --append INPUT --in-interface eth0 \
--protocol udp --match udp --dport 4567 \
--source 192 .168.0.1/24 --jump ACCEPT
注意
最后一个打开端口4567,通过UDP进行多播复制。
如果可信IP不是按顺序的,则需要为每个节点上的每个地址运行这些命令。
在这种情况下,您可以考虑打开可信主机之间的所有端口。这是一个不太安全,但减少了命令的数量。
例如,如果您有三个Percona XtraDB群集节点,则可以在每个节点上运行以下命令:
# iptables --append INPUT --protocol tcp \
--source 64.57.102.34 --jump ACCEPT
# iptables --append INPUT --protocol tcp \
--source 193.166.3.20 --jump ACCEPT
# iptables --append INPUT --protocol tcp \
--source 193.125.4.10 --jump ACCEPT
运行先前的命令将允许来自其他Percona XtraDB集群节点的IP地址的TCP连接。
注意
iptables除非保存数据包过滤状态,否则您所做的更改不是永久性的:
# service save iptables
对于使用的分发systemd,您需要将当前包过滤规则保存到iptables从何时开始读取的路径。
这个路径可能因分布而异,但通常在/etc目录中。例如:
  /etc/sysconfig/iptables
  /etc/iptables/iptables.rules
使用iptables-save更新文件:
#iptables-save> / etc/sysconfig/iptables
以下是基于CentOS 7 firewalld 富规则的配置
假定存在以下3个节点,精细化配置如下
192.168.1.99 node1
192.168.1.88 node2
192.168.1.77 node3
** Node1 **
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.88" port port="4567" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.88" port port="3306" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.77" port port="4567" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.88" port port="4444" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.77" port port="3306" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.77" port port="4444" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.77" port port="4568" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.88" port port="4568" protocol="tcp" accept' --permanent
firewall-cmd --reload
** Node 2 **
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.99" port port="4567" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.99" port port="3306" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.77" port port="4567" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.99" port port="4444" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.77" port port="3306" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.77" port port="4444" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.77" port port="4568" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.99" port port="4568" protocol="tcp" accept' --permanent
firewall-cmd --reload
** Node 3 **
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.88" port port="4567" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.88" port port="3306" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.99" port port="4567" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.88" port port="4444" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.99" port port="3306" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.99" port port="4444" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.99" port port="4568" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.88" port port="4568" protocol="tcp" accept' --permanent
firewall-cmd --reload
以下是基于CentOS 7 firewalld简单配置,三节点分别执行以下命令
# firewall-cmd --add-port=3306/tcp --permanent
# firewall-cmd --add-port=4567/tcp --permanent
# firewall-cmd --add-port=4568/tcp --permanent
# firewall-cmd --add-port=4444/tcp --permanent
# firewall-cmd --reload
默认情况下,Percona XtraDB集群不为存储的数据提供任何保护。要保护Percona XtraDB集群,需要考虑几个因素:
保护网络
任何有权访问您的网络的人都可以连接到任何Percona XtraDB集群节点,既可以作为客户端,也可以作为加入集群的其他节点。
您应该考虑使用VPN限制访问并过滤Percona XtraDB群集使用的端口上的流量。
加密PXC流量
任何监控您的网络的人都可能会看到未加密的流量。您应该为群集中的所有节点启用加密以防止出现这种情况。
数据静止加密
Percona XtraDB集群支持表空间加密 ,为物理表空间数据文件提供静态加密。
大多数现代的分布包括控制用户和应用程序资源访问的特殊安全模块。
默认情况下,这些模块很可能会限制Percona XtraDB集群节点之间的通信。
最简单的解决方案是禁用或删除这些程序,但是,这不建议在生产环境中使用。
您应该为Percona XtraDB群集创建必要的安全策略。
SELinux
红帽企业版Linux及衍生产品(包括CentOS)通常默认启用SELinux。
在安装和配置期间,您可以permissive通过运行以下命令来设置模式:
setenforce 0
注意
这只会在运行时改变模式。要在重启后以宽容模式运行SELinux,请SELINUX=permissive在/etc/selinux/config 配置文件中进行设置。
要将SELinux与Percona XtraDB集群一起使用,您需要创建一个访问策略。有关更多信息,请参见SELinux和MySQL。
AppArmor
AppArmor包含在Debian和Ubuntu中。在安装和配置期间,您可以禁用AppArmor mysqld:
创建以下符号链接:
$ sudo ln -s /etc/apparmor.d/usr /etc/apparmor.d/disable/.sbin.mysqld
重新启动AppArmor:
$ sudo service apparmor restart
注意
如果您的系统使用systemd,请运行以下命令:
$ sudo systemctl restart apparmor
要使用带有Percona XtraDB集群的AppArmor,您需要创建或扩展MySQL配置文件。
具体参考:https://www.percona.com/doc/percona-xtradb-cluster/LATEST/security/encrypt-traffic.html
https://www.percona.com/doc/percona-xtradb-cluster/LATEST/security/secure-network.html
https://www.percona.com/doc/percona-xtradb-cluster/LATEST/security/index.html