噩梦场景
想象一下:攻击者配置了一台 MariaDB 服务器,设置了正确的 wsrep 参数,知道 Galera 集群地址和 SST 密码。他们加入集群。Galera 检测到一个没有数据的新节点,并触发 State Snapshot Transfer(SST)——将集群的全部数据完整传输到攻击者的节点。
在几分钟内(或几小时,取决于数据库大小),攻击者就拥有了您数据库的完整副本。无需 SQL 注入,无需利用应用程序漏洞。只需使用正确的凭据进行集群 JOIN。
这不是科幻小说。根据 2024 年 Verizon 数据泄露调查报告,35% 的数据泄露涉及内部威胁——员工、承包商或拥有合法基础设施访问权限的人员。
SST 的工作原理
State Snapshot Transfer 是 Galera 初始化新节点的机制。当一个节点在没有数据的情况下加入集群(或数据太旧无法进行增量 IST)时,集群会触发 SST:
- 选择一个捐赠节点(现有的集群成员)
- 捐赠节点执行完整备份(通过 mariabackup、rsync 或 mysqldump)
- 备份通过网络发送到加入的节点
- 加入的节点恢复备份并加入集群
问题在于:默认情况下,任何拥有正确集群信息的节点都可以触发 SST。没有白名单,没有对加入节点的身份验证。
攻击所需的最小配置
攻击者需要的信息:
[mysqld]
wsrep_cluster_address = gcomm://10.0.1.10,10.0.1.11,10.0.1.12
wsrep_sst_method = mariabackup
wsrep_sst_auth = sst_user:sst_password
三条信息:集群地址、SST 方法和 SST 凭据。在许多组织中,这些信息存储在未加密的配置文件、明文的 Ansible playbook 或私有 Git 仓库中。
为什么 TLS 还不够
"但我们对 Galera 流量使用了 TLS!"——这是一个常见的反驳。但这是不够的。
TLS 加密了节点之间的流量,但不一定能验证加入节点的身份。即使使用了 TLS,如果攻击者拥有由相同 CA 签发的证书(在使用企业 PKI 的内部部署中通常如此),他们仍然可以加入集群。
此外,许多 Galera 部署不使用双向证书验证(mutual TLS)。它们启用 TLS 进行加密,但不进行身份验证。
解决方案:wsrep_allow_list
从 MariaDB 10.10 开始,wsrep_allow_list 变量提供了一个 IP 白名单机制,用于限制允许加入集群的节点:
[mysqld]
wsrep_allow_list = 10.0.1.10,10.0.1.11,10.0.1.12
只有 IP 地址在列表中的节点才能加入。即使拥有有效的 SST 凭据和 TLS 证书,IP 不在列表中的节点也会被拒绝。
这很简单、有效,是每个 Galera 集群都应该配置的第一道防线。
纵深防御
Galera 集群的安全不依赖于单一机制。以下是纵深防御方法:
1. wsrep_allow_list——网络过滤
限制允许加入集群的 IP。
2. 双向 TLS——节点认证
每个节点必须出示由集群 CA 签发的证书。
3. 隔离网络——网段划分
Galera 流量(端口 4567、4568、4444)应在专用网络上传输,与应用程序和管理网络隔离。
4. 防火墙——端口过滤
# iptables:仅允许集群 IP 访问 Galera 端口
iptables -A INPUT -p tcp -s 10.0.1.10 --dport 4567 -j ACCEPT
iptables -A INPUT -p tcp -s 10.0.1.11 --dport 4567 -j ACCEPT
iptables -A INPUT -p tcp -s 10.0.1.12 --dport 4567 -j ACCEPT
iptables -A INPUT -p tcp --dport 4567 -j DROP
5. 加密的 SST 凭据
永远不要以明文存储 SST 密码。使用密钥管理器(Vault、AWS Secrets Manager)或至少使用配置文件加密。
审计您的集群
立即检查您的 Galera 集群安全状况:
SHOW VARIABLES LIKE 'wsrep_allow_list';
SHOW VARIABLES LIKE 'wsrep_provider_options';
SELECT * FROM information_schema.WSREP_MEMBERSHIP;
如果 wsrep_allow_list 为空,您的集群存在漏洞。请立即配置。
结论
Galera SST 漏洞是一个被低估的攻击向量。未经授权的节点仅通过加入集群就可以获取您数据库的完整副本。修复方法很简单:wsrep_allow_list + 双向 TLS + 隔离网络 + 防火墙。
35% 的数据泄露是内部威胁。您的 Galera 集群是否受到保护?
本文最初发表于 Medium。
评论 (0)
暂无评论。
发表评论