ZK 与 Kafka 默认无认证
ZooKeeper 与 Kafka 默认都不启用认证:任何能连到 2181 或 9092 的人都可以读取元数据、消费队列消息,甚至删除 topic。内网暴露在很多环境里被当成可以接受,但横向移动场景中消息中间件恰恰是攻击者的首选目标,因此要么开启 SASL 与 ACL,要么至少做严格的来源限制。
基本信息
| 适用平台 | Linux(ZooKeeper、Kafka) |
|---|---|
| 相关端口 | 2181 ZooKeeper、9092 Kafka |
| 风险等级 | 高 |
| 基线要求 | 无匿名访问并限制来源 |
| 加固方向 | SASL、ACL 与来源白名单 |
典型使用场景
- 消息平台暴露面盘点
- 排查可匿名访问的 ZooKeeper 与 Kafka
- 新增集群时的认证方案设计
- 已暴露集群的过渡期加固
- 排查 topic 被误删或篡改的原因
- 与大数据组件一起做统一收敛
核查现状
核查现状
ss -tlnp | grep -E ':2181|:9092 ' # 确认两个端口与所属进程
echo ruok | nc 127.0.0.1 2181 # 用四字命令探测 ZooKeeper 是否响应
kafka-topics.sh --bootstrap-server 127.0.0.1:9092 --list 2>/dev/null | head # 尝试匿名列出 topic
kafka-configs.sh --bootstrap-server 127.0.0.1:9092 --describe --entity-type brokers 2>/dev/null | head # 查看 broker 配置加固方向
加固方向
# ZooKeeper:用 4lw.commands.whitelist 收紧四字命令,只保留 srvr、mntr 等必需项
# clientPortAddress 绑定内网地址,并叠加防火墙限源
# Kafka:启用 SASL_PLAINTEXT 或 SASL_SSL,配合 ACL 按主体授权
# listeners 绑定内网地址,避免 broker 暴露到不可信网段复核必查项
| 检查项 | 含义 | 注意点 |
|---|---|---|
| 2181 | ZooKeeper 客户端端口 | 默认无认证 |
| 9092 | Kafka broker 端口 | 默认无认证 |
| 四字命令 | ZooKeeper 的探测命令 | ruok、stat 等可无认证读取 |
| 认证方式 | 是否启用 SASL | 未启用时必须限源 |
| 来源限制 | 允许连接的网段 | 只放行业务集群 |
ZooKeeper 的四字命令(ruok、stat 等)无需认证即可读取基本信息:配置白名单可以从源头收敛探测面。
内网互信不是安全边界:横向移动场景中,内网中间件往往是攻击者最先下手的目标。
启用认证会明显增加客户端改造量:建议先在测试集群验证 ACL 策略与客户端兼容性,再推到生产。
如果一时上不了 SASL,至少先把监听地址绑到内网并做防火墙限源,同时开启操作审计;这类临时措施要登记在册,避免以后没人记得还有欠账未还。