在 CentOS 上部署 ZooKeeper 时,为确保安全性,可以从以下方面进行配置和优化:
1. 网络隔离与防火墙
-
限制访问来源:
使用防火墙(如firewalld
或iptables
)仅允许信任的 IP 访问 ZooKeeper 端口(默认2181
/2888
/3888
)。# firewalld 示例 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="2181" protocol="tcp" accept' firewall-cmd --reload
-
禁用公网暴露:
在zoo.cfg
中绑定内网 IP,而非0.0.0.0
:clientPortAddress=192.168.1.100
2. 认证与授权
-
启用 SASL 认证:
在zoo.cfg
中开启认证:authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl
-
配置 JAAS 文件:
创建jaas.conf
(路径需与 ZooKeeper 启动脚本中的JVMFLAGS
一致):Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_admin="adminpassword"; };
启动时加载 JAAS 配置:
export JVMFLAGS="-Djava.security.auth.login.config=/path/to/jaas.conf"
-
设置 ACL 权限:
使用命令行工具为节点设置访问控制列表:# 示例:对节点 /service 设置 digest 模式 ACL setAcl /service auth:admin:cdrwa
3. 数据加密(SSL/TLS)
-
启用客户端加密通信:
生成证书并配置zoo.cfg
:secureClientPort=2182 serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory ssl.keyStore.location=/path/to/keystore.jks ssl.keyStore.password=your_password ssl.trustStore.location=/path/to/truststore.jks ssl.trustStore.password=your_password
-
内部节点加密(可选):
若需加密集群内部通信,启用 Quorum TLS(需配置sslQuorum=true
及相关密钥)。
4. 操作系统与文件安全
-
专用用户运行:
创建非特权用户(如zookeeper
)并限制权限:useradd zookeeper chown -R zookeeper:zookeeper /opt/zookeeper/data
-
文件权限控制:
限制配置文件和数据目录的访问:chmod 600 /opt/zookeeper/conf/zoo.cfg chmod 700 /opt/zookeeper/data
5. 日志与审计
- 日志脱敏:
避免在日志中记录敏感信息,调整log4j.properties
的日志级别。 - 审计日志:
启用AuditLogging
(ZooKeeper 3.6+)记录所有操作:audit.enable=true
6. 其他安全措施
-
禁用四字命令:
在zoo.cfg
中禁用危险命令(如stat
/dump
):4lw.commands.whitelist=* # 或仅允许必要命令 4lw.commands.whitelist=stat,ruok
-
定期更新与漏洞扫描:
保持 ZooKeeper 版本为稳定版,定期检查 CVE 漏洞。
验证配置
- 重启 ZooKeeper 后,使用
telnet
或nc
测试端口是否按预期开放:telnet 192.168.1.100 2181
- 通过客户端工具验证 ACL 和 SSL 是否生效:
zkCli.sh -server 192.168.1.100:2182 -Dzookeeper.client.secure=true
通过以上步骤,可显著提升 ZooKeeper 在 CentOS 环境下的安全性。建议结合具体业务场景选择合适配置,并在测试环境验证后再部署到生产环境。