修复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 <<EOF | sudo tee ${ZK_HOME}/conf/java.env > /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 <<EOF | sudo tee ${ZK_HOME}/conf/log4j.properties > /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 <<EOF | sudo tee -a ${ZK_HOME}/conf/zoo.cfg > /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 <<EOF
getAcl /
quit
EOF
# 预期输出:'world,'anyone' 应不存在,只有 'digest:admin:xxx'
# 2. 验证未认证访问被拒绝
# 新开终端(未addauth)尝试访问
/usr/local/zookeeper-3.4.13/bin/zkCli.sh -server localhost:2181 <<EOF
ls /
# 预期:Authentication is not valid
quit
EOF
# 3. 检查命令历史无密码
grep -i "password\|passwd" ~/.bash_history
# 预期:无输出
# 4. 检查端口暴露情况
netstat -tlnp | grep 2181
# 确认仅监听必要IP
六、总结建议
| 项目 | 建议 |
|---|---|
| ACL配置方式 | ✅ 使用方式二(密文),避免明文密码落地 |
| 密码管理 | ✅ 使用密钥管理系统或加密配置文件存储密码 |
| 脚本安全 | ✅ 部署脚本中不包含密码,ACL配置单独手动执行 |
| 系统安全 | ⚠️ Ubuntu 14.04已过保,建议制定升级计划 |
| 网络访问 | ✅ 配置防火墙限制ZK端口仅内网访问 |
| 审计合规 | ✅ 定期更换密码,保留操作日志 |
按照以上方案实施后,可有效修复ZooKeeper未授权访问漏洞,满足安全扫描要求。
No Comments