CentOS 上 ZooKeeper 安全设置实操指南
一 基础加固
- 运行账户与最小权限
- 建议以专用系统用户(如 zookeeper:zookeeper)运行服务,避免使用 root。
- 配置文件与目录权限最小化:
- 配置文件(如 /etc/zookeeper/conf/zoo.cfg)属主为 zookeeper,权限 600/640。
- 数据与日志目录(如 /var/lib/zookeeper、/var/log/zookeeper)属主 zookeeper:zookeeper,权限 750。
- 示例:
- sudo chown -R zookeeper:zookeeper /var/lib/zookeeper /var/log/zookeeper
- sudo chmod -R 750 /var/lib/zookeeper /var/log/zookeeper
- 网络与端口
- 仅在内网开放必要端口,默认客户端端口 2181,集群通信端口 2888/3888。
- 使用 firewalld 限制来源(示例仅允许 192.168.1.0/24 访问 2181):
- sudo firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family=“ipv4” source address=“192.168.1.0/24” port port=“2181” protocol=“tcp” accept’
- sudo firewall-cmd --reload
- 系统与进程隔离
- 将 ZooKeeper 数据/日志目录与系统其他服务隔离,避免共享挂载点。
- 启用 systemd 服务隔离(如 ProtectHome=yes、PrivateTmp=yes、NoNewPrivileges=yes)以减小攻击面。
二 认证与访问控制
- 启用 SASL/Digest 认证(服务端)
- 在 zoo.cfg 增加:
- authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
- jaasLoginRenew=3600000
- requireClientAuthScheme=sasl
- 可选(ZooKeeper 3.6+):sessionRequireClientSASLAuth=true(强制客户端 SASL 登录)
- 创建 JAAS 文件(如 /etc/zookeeper/conf/zk_server_jaas.conf):
- Server {
- org.apache.zookeeper.server.auth.DigestLoginModule required
- user_admin=“AdminPass123”
- user_app=“AppPass456”;
- };
- 在启动环境(如 zookeeper-env.sh 或 systemd 服务 Environment)加入:
- -Djava.security.auth.login.config=/etc/zookeeper/conf/zk_server_jaas.conf
- 客户端与依赖组件(如 Kafka)认证
- 客户端与服务端使用相同 JAAS 配置(Client 段),或在客户端设置环境变量:
- export JVMFLAGS=“-Djava.security.auth.login.config=/etc/zookeeper/conf/zk_client_jaas.conf”
- 若依赖组件(如 Kafka)连接 ZooKeeper,需为其进程配置相同的 JAAS 文件并重启。
- 基于 ACL 的细粒度授权
- 使用 zkCli.sh 设置节点 ACL(示例为 digest 模式):
- 生成凭证(示例账户 app:secret):
- echo -n app:secret | openssl dgst -binary -sha1 | openssl base64
- 输出示例:ABCD1234+/==(记作 BASE64(SHA1(app:secret)))
- 在 zkCli 中:
- addauth digest app:secret
- create /app-node “data” digest:app:ABCD1234+/==:cdrwa
- setAcl /app-node digest:app:ABCD1234+/==:cdrwa
- 如需对根节点或关键路径设置 ACL,务必保留管理员凭证,避免锁死。
- 超级管理员(谨慎使用)
- 通过 JVM 参数设置超级 digest:
- -Dzookeeper.DigestAuthenticationProvider.superDigest=super:Base64(SHA1(super:password))
- 仅在应急与运维场景使用,并做好密钥保管。
三 加密与网络安全
- 传输加密(TLS)
- 为客户端与服务端启用 SSL/TLS,生成 X.509 证书并在 zoo.cfg 配置 sslQuorum、ssl.clientAuth 等参数,客户端使用 zookeeper.client.secure=true 与信任库连接。
- 适用于跨机房、公网或合规要求场景,能显著降低明文嗅探与中间人攻击风险。
- 网络分区与访问控制
- 集群节点间通信(2888/3888)应限制为 节点间私网/VPC 访问,不与客户端混布。
- 结合 firewalld 或云安全组仅放通必要来源与端口,优先使用 源地址白名单 策略。
四 审计与合规
- 日志与审计
- 启用 audit log(如 zookeeper.audit.enable=true),记录关键操作(创建/删除节点、ACL 变更等)。
- 将 /var/log/zookeeper 纳入集中日志(如 rsyslog/ELK),设置保留周期与告警规则。
- 四字命令安全
- 限制或禁用危险四字命令(如 ruok、envi、stat、wchs 等),仅在内网通过本地控制台或跳板机执行;生产环境建议关闭对外暴露的四字命令端口。
- 基线核查与持续监控
- 定期核查:匿名访问是否关闭、ACL 是否覆盖关键路径、证书是否过期、JAAS 凭据强度、firewalld 规则是否最小化。
- 建立监控告警(连接异常、ACL 频繁变更、认证失败激增等)。
五 快速检查清单
| 检查项 |
期望状态 |
验证方法 |
| 运行账户 |
专用账户(如 zookeeper),非 root |
ps -eo user,comm |
| 配置与目录权限 |
配置 600/640;数据/日志 750,属主 zookeeper |
ls -ld /etc/zookeeper/conf/zoo.cfg /var/lib/zookeeper /var/log/zookeeper |
| 匿名访问 |
已禁用或仅本地回环 |
echo stat |
| SASL 强制 |
已启用(3.6+ 建议 sessionRequireClientSASLAuth=true) |
grep -E "requireClientAuthScheme |
| ACL 覆盖 |
关键路径设置 digest/cdwrw 等 |
zkCli.sh getAcl /app |
| 防火墙 |
仅放通必要来源与端口 |
firewall-cmd --list-all |
| 证书与 TLS |
启用并校验证书有效期与信任链 |
查看 zkEnv.sh 或 systemd 环境;客户端启用 secure 连接测试 |
| 审计日志 |
已启用并落盘集中 |
tail -f /var/log/zookeeper/zookeeper-audit.log |
以上步骤覆盖了 身份鉴别、访问控制、加密传输、网络隔离、审计监控 等核心安全面,按此实施可显著提升 CentOS 上 ZooKeeper 的安全基线。