修复ZooKeeper未授权访问漏洞 根据搜索结果和ZooKeeper安全最佳实践,我为您详细分析两种ACL配置方式的风险,并提供安全加固方案。 一、两种ACL配置方式风险分析 ⚠️ 方式一(明文密码)- 高风险 addauth digest user1:password1 setAcl / auth:user1:password1:cdrwa 风险点 说明 风险等级 命令历史泄露 密码会保存在 ~/.bash_history 中,任何能访问该文件的用户都可获取密码 🔴 高 脚本明文存储 如写在部署脚本中,密码以明文形式存在于代码仓库 🔴 高 进程列表暴露 ps -ef 可能显示含密码的命令行参数 🟡 中 日志记录风险 如开启命令审计,密码可能被记录到系统日志 🟡 中 ✅ 方式二(密文密码)- 推荐 setAcl / digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:cdrwa 优势 说明 密码不落地 明文密码不会出现在脚本、历史命令中 哈希不可逆 SHA1+Base64编码,无法反向推导原始密码 符合安全审计 满足等保/安全扫描要求 二、安全配置完整方案 步骤1:生成密码密文(在安全环境执行) # 方法:使用openssl生成digest哈希(推荐在临时环境执行,执行后清除历史) echo -n "admin:YourSecurePassword123" | openssl dgst -sha1 -binary | base64 # 输出示例:HYGa7IZRm2PUBFiFFu8xY2pPP/s= 安全提示 : 执行后立即运行 history -c 清除命令历史 或使用 unset HISTFILE 临时禁用历史 步骤2:配置ZooKeeper ACL(使用密文) # 连接ZooKeeper /usr/local/zookeeper-3.4.13/bin/zkCli.sh -server localhost:2181 # 添加认证(此步骤密码会短暂明文,但不会持久化) addauth digest admin:YourSecurePassword123 # 设置根节点ACL(使用密文) setAcl / digest:admin:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:cdrwa # 验证ACL设置 getAcl / # 退出 quit 步骤3:清理敏感痕迹 # 清除bash历史 history -c history -w # 检查并清理可能含密码的文件 grep -r "password" /home/shuncom/ --include="*.sh" --include="*.log" 三、针对现有部署脚本的安全修改建议 📝 修改后的安全部署脚本 #!/bin/bash # ZooKeeper安全部署脚本 (修订版) # ========== 安全配置变量 ========== ZK_USER="shuncom" ZK_GROUP="shuncom" ZK_HOME="/usr/local/zookeeper-3.4.13" ZK_LOG_DIR="/home/shuncom/log/zookeeper" # ⚠️ 密码应从安全配置中心获取,不要硬编码 # ZK_PASSWORD="从密钥管理系统读取" # ========== 基础部署 ========== sudo tar -zxvf zookeeper-3.4.13.tar.gz -C /usr/local sudo chown -R ${ZK_USER}.${ZK_GROUP} ${ZK_HOME} # ========== Java环境配置 ========== sudo touch ${ZK_HOME}/conf/java.env cat < /dev/null export JAVA_HOME=/usr/local/jdk1.8.0_111 # 安全加固:限制JVM内存,防止DoS export JVMFLAGS="-Xmx512m -Xms256m" EOF # ========== 日志配置(保留原有配置) ========== sudo mv ${ZK_HOME}/conf/log4j.properties ${ZK_HOME}/conf/log4j.properties.bak sudo mkdir -p ${ZK_LOG_DIR} sudo chown -R ${ZK_USER}.${ZK_GROUP} ${ZK_LOG_DIR} cat < /dev/null # (保持原有log4j配置内容) log4j.rootLogger=INFO, ROLLINGFILE log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLINGFILE.Threshold=INFO log4j.appender.ROLLINGFILE.File=${ZK_LOG_DIR}/zookeeper.log log4j.appender.ROLLINGFILE.MaxFileSize=10MB log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n EOF # ========== 安全加固:zoo.cfg配置 ========== cp ${ZK_HOME}/conf/zoo_sample.cfg ${ZK_HOME}/conf/zoo.cfg # 追加安全配置 cat < /dev/null # ===== 安全加固配置 ===== # 限制客户端连接数 maxClientCnxns=60 # 设置ACL默认策略(4lw命令白名单) 4lw.commands.whitelist=stat,ruok,conf,isro # 禁用危险命令 disableAdminServer=true EOF # ========== 启动服务 ========== sudo -u ${ZK_USER} ${ZK_HOME}/bin/zkServer.sh start sleep 5 ps -fle | grep zookeeper | grep -v grep # ========== ACL配置提示(不自动执行,需手动) ========== echo "" echo "===== 安全提示 =====" echo "1. 请使用以下命令手动配置ACL(密码不要写在脚本中):" echo " ${ZK_HOME}/bin/zkCli.sh -server localhost:2181" echo " > addauth digest admin:YOUR_PASSWORD" echo " > setAcl / digest:admin:HASH_VALUE:cdrwa" echo "2. 密码哈希生成命令:" echo " echo -n 'admin:YOUR_PASSWORD' | openssl dgst -sha1 -binary | base64" echo "3. 配置完成后执行:history -c 清除命令历史" echo "====================" 四、额外安全加固措施(针对Ubuntu 14.04) 由于 Ubuntu 14.04已于2019年停止标准支持 ,需额外加固: 加固项 配置方法 优先级 网络隔离 防火墙仅允许应用服务器IP访问2181端口 🔴 必须 系统升级 尽可能升级到受支持的Ubuntu版本 🔴 必须 文件权限 chmod 700 限制ZK配置文件仅所有者可读写 🟡 推荐 日志审计 开启auditd监控ZK配置文件变更 🟡 推荐 定期轮转 每90天更换ZK认证密码 🟡 推荐 防火墙配置示例 # 仅允许应用服务器IP访问ZooKeeper端口 sudo ufw allow from 192.168.1.0/24 to any port 2181 proto tcp sudo ufw deny 2181/tcp # 拒绝其他所有访问 文件权限加固 # 限制配置文件权限 chmod 700 /usr/local/zookeeper-3.4.13/conf chmod 600 /usr/local/zookeeper-3.4.13/conf/zoo.cfg chmod 600 /usr/local/zookeeper-3.4.13/conf/java.env # 限制日志文件权限 chmod 750 /home/shuncom/log/zookeeper chmod 640 /home/shuncom/log/zookeeper/*.log 五、漏洞修复验证清单 完成配置后,请使用以下命令验证: # 1. 验证根节点ACL /usr/local/zookeeper-3.4.13/bin/zkCli.sh -server localhost:2181 <