云计算百科
云计算领域专业知识百科平台

HGHAC组件未授权访问漏洞修复

文章目录

  • 环境
  • 文档用途
  • 详细信息

环境

系统平台:Linux x86-64 Red Hat Enterprise Linux 8,Linux x86-64 Red Hat Enterprise Linux 7 版本:4.5.10

文档用途

瀚高数据库高可用集群软件(HGHAC)中,etcd 与 hghac 组件均对外提供 API 接口供调用者访问。但这些接口存在一定的安全风险,可能造成集群信息被非授权方获取。

  • etcd 组件即使关闭了 v2 API 并为 v3 API 配置了用户认证,其 /metrics 端点仍可能暴露集群数据。
  • hghac 组件在 8008 端口上提供的 /metrics 端点同样存在类似问题。

本文档旨在指导用户通过 firewalld 服务在主机层面配置防火墙策略,限制仅允许集群内部主机访问相关端口,从而降低信息泄露风险。

详细信息

1. 环境信息

本文档以以下三节点集群为例进行操作演示:

IP 地址主机名
192.168.70.11 hac-see01
192.168.70.12 hac-see02
192.168.70.13 hac-see03

2. 确认组件监听端口

在集群各节点执行以下命令,查看相关组件的监听状态:

ss -tulnp | egrep 'etcd|hghac|postgres|hgproxy'

请确保监听端口与下表一致,并记录除下表外是否存在其他非预期监听服务:

组件名称端口
etcd 2379,2380
hghac 8008
postgres 5866
hgproxy 5888

输出示例

[root@hac-see02 ~]# ss -tulnp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 5 192.168.70.12:8008 *:* users:(("hghac",pid=7021,fd=6))
tcp LISTEN 0 128 *:5866 *:* users:(("postgres",pid=7571,fd=3))
tcp LISTEN 0 128 192.168.70.12:2379 *:* users:(("etcd",pid=7030,fd=9))
tcp LISTEN 0 128 127.0.0.1:2379 *:* users:(("etcd",pid=7030,fd=8))
tcp LISTEN 0 128 192.168.70.12:2380 *:* users:(("etcd",pid=7030,fd=6))
tcp LISTEN 0 128 *:22 *:* users:(("sshd",pid=7018,fd=3))
tcp LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=7292,fd=13))
tcp LISTEN 0 128 *:5888 *:* users:(("hgproxy",pid=7348,fd=5),("hgproxy",pid=7347,fd=5),("hgproxy",pid=7346,fd=5),("hgproxy",pid=7345,fd=5),("hgproxy",pid=7342,fd=5),("hgproxy",pid=7164,fd=5))
tcp LISTEN 0 128 :::22 :::* users:(("sshd",pid=7018,fd=4))
tcp LISTEN 0 100 ::1:25 :::* users:(("master",pid=7292,fd=14))
tcp LISTEN 0 128 :::5888 :::* users:(("hgproxy",pid=7348,fd=6),("hgproxy",pid=7347,fd=6),("hgproxy",pid=7346,fd=6),("hgproxy",pid=7345,fd=6),("hgproxy",pid=7342,fd=6),("hgproxy",pid=7164,fd=6))

参数解释:

  • Netid: 套接字类型及协议。
  • State: 套接字的当前状态。通过 -l 参数删选出处于监听状态的服务。
  • Local Address:Port: 本地主机地址对应的端口号。
  • Peer Address:Port: 对端地址和端口号,监听状态下,通常为 :
  • users:((“process_name”,pid=1234,fd=5)): 占用该端口的进程信息。

3. 配置防火墙规则

根据当前防火墙状态,选择以下任一方式进行配置。

3.1 场景一:防火墙当前为关闭状态(适用于初始安装或已运行环境)

**注意:**若数据库已运行一段时间且防火墙一直处于关闭状态,首次开启防火墙时请谨慎操作,建议在维护窗口执行。使用 firewall-offline-cmd 可在防火墙服务启动前写入规则,避免连接中断。

firewall-offline-cmd 虽然可以在 firewalld 未启动时配置防火墙规则,理论上 firewalld 服务启动时不会出现网络拒绝访问的情况。但实际生产环境操作中,在启动防火墙后 etcd 集群仍可能发生任期切换(leader election),导致服务短暂抖动。

因此,在执行本文档时,必须逐台主机进行操作。即:每完成一台主机的防火墙配置并确认 etcd 集群状态恢复正常后,再继续操作下一台主机。

建议在维护窗口执行,并提前做好 etcd 集群状态监控。

执行以下命令,配置允许集群内通信的富规则:

# 允许 etcd 2379 端口(集群内节点)
for ip in 192.168.70.11 192.168.70.12 192.168.70.13; do
firewall-offline-cmd –add-rich-rule="rule family='ipv4' source address='$ip' port protocol='tcp' port='2379' accept"
firewall-offline-cmd –add-rich-rule="rule family='ipv4' source address='$ip' port protocol='tcp' port='2380' accept"
firewall-offline-cmd –add-rich-rule="rule family='ipv4' source address='$ip' port protocol='tcp' port='8008' accept"
done

# 允许数据库及代理端口(允许所有来源)
firewall-offline-cmd –add-port=5866/tcp
firewall-offline-cmd –add-port=5888/tcp

3.2 场景二:防火墙已开启(在线添加规则)

若 firewalld 服务已在运行状态,可使用以下命令动态添加规则并永久保存:

# 添加 etcd 端口规则(2379/2380)
for ip in 192.168.70.11 192.168.70.12 192.168.70.13; do
firewall-cmd –add-rich-rule="rule family='ipv4' source address='$ip' port protocol='tcp' port='2379' accept"
firewall-cmd –permanent –add-rich-rule="rule family='ipv4' source address='$ip' port protocol='tcp' port='2379' accept"
firewall-cmd –add-rich-rule="rule family='ipv4' source address='$ip' port protocol='tcp' port='2380' accept"
firewall-cmd –permanent –add-rich-rule="rule family='ipv4' source address='$ip' port protocol='tcp' port='2380' accept"
done

# 添加 hghac 端口规则(8008)
for ip in 192.168.70.11 192.168.70.12 192.168.70.13; do
firewall-cmd –add-rich-rule="rule family='ipv4' source address='$ip' port protocol='tcp' port='8008' accept"
firewall-cmd –permanent –add-rich-rule="rule family='ipv4' source address='$ip' port protocol='tcp' port='8008' accept"
done

# 开放数据库端口(允许所有来源)
firewall-cmd –add-port=5866/tcp
firewall-cmd –permanent –add-port=5866/tcp

# 开放代理端口(允许所有来源)
firewall-cmd –add-port=5888/tcp
firewall-cmd –permanent –add-port=5888/tcp

4. 启动防火墙服务(如尚未启动)

若防火墙未运行,请执行以下命令启动并验证状态:

systemctl start firewalld
systemctl status firewalld

注意:

在启动防火墙服务后,使用etcdctl endpoint status -w table 命令观察etcd的状态,观察 IS LEADER 和 RAFT TERM 有没有发生变化。以及ERRORS有没有打印(如 etcdserver: no leader等)信息提示,如果出现提示则等消息消除后再操作下一台主机。

etcdserver: no leader 提示信息只在部分集群的主机上出现过,未复现次问题也属正常现象。

+—————————+——————+———+———+———–+————+———–+————+——————–+——–+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+—————————+——————+———+———+———–+————+———–+————+——————–+——–+
| http://192.168.70.11:2379 | b57aee1b83fc7866 | 3.5.21 | 127 kB | false | false | 5 | 694 | 694 | |
| http://192.168.70.12:2379 | 27f62cdaa62025e8 | 3.5.21 | 127 kB | true | false | 5 | 694 | 694 | |
| http://192.168.70.13:2379 | 15d296d1fbe44100 | 3.5.21 | 131 kB | false | false | 5 | 694 | 694 | |
+—————————+——————+———+———+———–+————+———–+————+——————–+——–+

5. 验证防火墙规则

5.1 查看当前规则 使用以下任一方式确认规则已正确加载:

# 方式一:使用 firewall-cmd 查看运行时配置
firewall-cmd –list-all

# 方式二:查看配置文件(适用于离线检查)
cat /etc/firewalld/zones/public.xml

确认内容应包含:

  • 服务:ssh(默认应存在)
  • 富规则:包含所有节点 IP 与端口的允许规则
  • 端口:5866/tcp 5888/tcp

5.2 连通性测试 在集群内外不同主机执行以下命令,验证访问限制是否生效:

# 测试仅限集群内访问的端口
telnet 192.168.70.11 2379
telnet 192.168.70.11 2380
telnet 192.168.70.11 8008

# 测试允许所有来源的端口
telnet 192.168.70.11 5866
telnet 192.168.70.11 5888

也可使用 nc 命令进行快速测试:

# 集群内可通,集群外应超时或拒绝
nc -zv 192.168.70.11 2379
nc -zv 192.168.70.11 2380
nc -zv 192.168.70.11 8008

# 集群内外均应可通
nc -zv 192.168.70.11 5866
nc -zv 192.168.70.11 5888

预期结果:

  • 2379\\2380\\8008 端口

在集群内节点执行:应显示连接成功(如 Connected to 192.168.70.11),表示集群内通信正常。 在集群外节点执行:应显示连接超时或被拒绝(如 Connection refused 或 Connection timed out),表示非授权来源已被防火墙拦截。

  • 5866\\5888

无论在集群内还是集群外,均应显示连接成功,因为这些端口未做来源限制。

赞(0)
未经允许不得转载:网硕互联帮助中心 » HGHAC组件未授权访问漏洞修复
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!