ZooKeeper 暴露后能做什么
ZooKeeper 是分布式系统的协调组件,客户端端口默认 2181(集群通信为 2888、3888)。在没有配置认证的部署里,任何可达者都能读取节点数据、查看集群状态,老版本默认开放的『四字命令』还会额外暴露运行信息;Kafka、HBase 等系统常内嵌依赖它,暴露面容易被漏掉。
基本信息
| 客户端端口 | 2181 |
|---|---|
| 集群端口 | 2888、3888 |
| 四字命令 | ruok、stat、mntr 等,白名单控制自 3.4.10 起支持 |
| 认证方式 | SASL / Digest,自 3.5 起提供 |
| 加固要点 | 限制命令白名单、启用认证、网络收敛 |
典型使用场景
- 暴露面盘点:确认 2181 是否对运维网段之外可达
- 版本核查:确认是否支持四字命令白名单配置项
- 认证评估:确认是否已启用 SASL 或 Digest 认证
- 上下游梳理:把依赖 ZooKeeper 的组件一并纳入收敛范围
- 变更前检查:升级前先记录当前命令开放状态,升级后复核
核查与加固
核查与加固
echo ruok | nc -w 2 127.0.0.1 2181 # 返回 imok 说明四字命令可用
echo mntr | nc -w 2 127.0.0.1 2181 | head # 运行指标,含版本与连接数
# 加固(zoo.cfg):
# 4lw.commands.whitelist=srvr,ruok(3.4.10+,仅保留监控必需项)
# 启用认证(3.5+):SASL/Digest,并给客户端配置对应凭据
# 2181/2888/3888 三端口仅控制面网段可达四字命令与用途
| 命令 | 用途 | 暴露的判断 |
|---|---|---|
| ruok | 存活探测,返回 imok | 返回 imok 说明命令开放 |
| stat | 连接与节点概要 | 可看到客户端连接数 |
| mntr | 运行指标明细 | 含版本与请求量等细节 |
| cons | 连接详情 | 能看到对端地址 |
限制四字命令白名单只能减少信息输出,不能替代认证:节点数据的读写权限仍取决于认证与 ACL 配置,两者要一起做。
梳理暴露面时容易只盯 ZooKeeper 本身,而漏掉间接使用它的组件:Kafka、HBase 等常在内网自行搭建,端口不在标准清单里,需要按依赖关系回溯。
四字命令白名单配置项自 3.4.10 起提供,认证与动态配置等能力也随版本变化较大;升级或迁移前先确认目标版本支持哪些机制,再决定加固方案,避免照抄旧文档。
收敛动作顺序
- 先做网络收敛:三个端口限制到控制面网段,收益最快
- 再限制四字命令白名单:只保留监控必需项
- 最后启用认证与 ACL:按最小权限定义各组件读写范围