bigywater.tech
ZooKeeper · 78

ZooKeeper 数据加密边界

ZooKeeper 到底加密了什么?哪些地方是明文?这篇把一个「机密」写进去,然后在磁盘文件、客户端连接、节点间复制三个位置分别「抓一下」,看它是否出现在明文里,再试应用层加密。

磁盘是明文
log.* 与 snapshot.* 里直接能搜到数据
3 条通道
客户端 ↔ 服务端、节点 ↔ 节点各自要单独配置 TLS
应用层加密
唯一能让磁盘上没有明文的办法(自己管密钥)

落盘:明文

实测 · 本机执行输出
  数据目录里各文件是否含有明文机密: {'log.1': True, 'log.37': False, 'log.93': False, 'snapshot.0': False, 'snapshot.35': True, 'snapshot.91': True}
  (digest ACL 只控制「通过 ZooKeeper 访问」,能读数据目录文件的人不需要任何口令)

客户端与服务端之间

实测 · 本机执行输出
  明文端口(代理 7390 → 7300)抓到 367 字节,含机密: True
  TLS 端口(代理 7391 → 7301)抓到 6120 字节,含机密: False

节点与节点之间

实测 · 本机执行输出
  明文 quorum:节点间抓到 10465 字节,含机密: True | 集群角色 {'z78q0-1': 'follower', 'z78q0-2': 'leader', 'z78q0-3': 'follower'}
  sslQuorum=true:节点间抓到 65762 字节,含机密: False | 集群角色 {'z78q1-1': 'follower', 'z78q1-2': 'leader', 'z78q1-3': 'follower'}

字节是我写的 TCP 代理从每对节点的 quorum 连接上抓到的;election 端口的流量也经过代理,一并统计。

应用层加密

实测 · 本机执行输出
  从 ZooKeeper 读回、客户端解密 → b'SUPER-SECRET-TOKEN-8842'
  数据目录里各文件是否含有明文机密: {'log.1': False, 'log.4b': False, 'log.8c': False, 'snapshot.0': False, 'snapshot.49': False, 'snapshot.8a': False}

分步演示

加密边界
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。「抓包」用 zkl.Proxy 记录转发的字节;机密是自造的字符串;TLS 用本机 openssl 生成的证书;应用层加密用 Python cryptography 的 Fernet
    • 没有验证:磁盘加密(FileVault / LUKS / 云盘加密)、快照与日志备份的加密、AdminServer 的 HTTPS、密钥管理系统(KMS)的集成
    京ICP备2026067502号-1京公网安备11010502063487号