首页/安全/漏洞与攻击面速查/ZooKeeper 未授权访问与四字命令
主机与服务风险面53 条

ZooKeeper 未授权访问与四字命令

ZooKeeper 客户端端口默认 2181,无认证配置时可读取节点数据、查看集群状态;老版本默认开放的『四字命令』还可暴露更多运行信息。

漏洞与攻击面速查安全更新于 2026-10-13

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:按最小权限定义各组件读写范围

易错点

  • 只关四字命令不启用认证:数据节点仍可被任意读写
  • 只收敛 2181 忽略 2888 与 3888:集群内部端口暴露同样可被利用
  • 把 ZooKeeper 当作纯内部组件不做盘点:Kafka 等系统的依赖让它出现在意料之外的位置
  • 升级后未复核四字命令配置:新版本默认值不同,旧配置可能失效

数据来源与参考

  • Apache ZooKeeper 官方文档(Administrator's Guide、四字命令白名单)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌