Zookeeper在Linux系统中的安全防护实践
一 身份与访问控制
- 启用基于SASL/Digest的身份认证,服务端在 zoo.cfg 中配置认证提供者并强制客户端认证,示例:
- 配置项:aclProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
- 配置项:requireClientAuthSchemes.1=sasl
- 为 znode 设置细粒度 ACL,遵循最小权限原则,示例:
- 只读示例:setAcl /path world:anyone:r
- 用户读写示例:setAcl /path user1:user1:rw
- 客户端连接时携带认证信息(以 Digest 为例):zk.addAuthInfo(“digest”, “user1:password”.getBytes())。以上措施可有效阻断未授权访问与越权操作。
二 传输与数据加密
- 启用 SSL/TLS 保护客户端与服务端、以及集群节点间通信。服务端在 zoo.cfg 增加:
- secureClientPort=2281
- zookeeper.ssl.keyStore.location=/path/to/keystore
- zookeeper.ssl.keyStore.password=keystore_password
- zookeeper.ssl.trustStore.location=/path/to/truststore
- zookeeper.ssl.trustStore.password=truststore_password
- 客户端连接使用 TLS 端口 2281 并配置信任库;密钥与信任库文件需设置**最小权限(600)**并妥善保管。
- 对敏感业务数据在应用层加密后再写入,避免明文落盘与传输过程中被窃听或篡改。
三 网络与系统加固
- 以最小暴露面为原则,仅开放必要端口:客户端端口(如 2181/2281)、集群通信端口(如 2888/3888),其余端口一律拒绝;在主机防火墙与云安全组层面限制来源 IP 白名单。
- 在 CentOS/RHEL 启用 firewalld 放行必要端口,例如:firewall-cmd --permanent --zone=public --add-port=2181/tcp && firewall-cmd --reload。
- 运行 Zookeeper 使用专用系统账户(如 zookeeper),并收紧配置与数据目录权限(如 750),确保仅该账户可读写;如启用 SELinux,按需配置策略或临时设为 permissive 验证后再固化策略模块,避免权限不足导致异常。
- 可选:更改默认端口降低被扫描概率,但需同步更新防火墙与客户端配置,避免连接失败。
四 审计监控与运维
- 启用安全审计与详细日志,记录用户登录、ACL 变更、节点读写等关键操作,便于追溯与合规;结合集中化日志平台进行告警与审计分析。
- 持续版本更新与补丁管理,及时修复已知漏洞;部署监控与告警(进程存活、端口连通、延迟抖动、异常日志关键字等),缩短MTTD/MTTR。
- 制定备份与恢复流程并定期演练,覆盖配置、数据与密钥材料;结合四字命令(如 ruok、stat、envi)做健康检查与基线巡检。
五 快速检查清单
| 检查项 |
关键要点 |
建议值或动作 |
| 认证与授权 |
SASL/Digest 启用,ACL 最小权限 |
配置 aclProvider 与 requireClientAuthSchemes;为关键 znode 设置 user:perm |
| 加密通信 |
TLS 启用与端口正确 |
启用 secureClientPort=2281;客户端使用 2281 并配置 truststore |
| 网络边界 |
端口最小化与来源白名单 |
仅开放 2181/2281/2888/3888;iptables/firewalld/安全组限制 IP |
| 系统与权限 |
专用账户与目录权限 |
zookeeper:zookeeper,目录 750;密钥库 600 |
| 审计与监控 |
日志、告警、备份演练 |
开启审计日志;监控进程/端口/日志;定期备份与恢复演练 |