# 修复ZooKeeper未授权访问漏洞

根据搜索结果和ZooKeeper安全最佳实践，我为您详细分析两种ACL配置方式的风险，并提供安全加固方案。

---

## 一、两种ACL配置方式风险分析

### ⚠️ 方式一（明文密码）- **高风险**

```bash
addauth digest user1:password1
setAcl / auth:user1:password1:cdrwa

```

<table id="bkmrk-%E9%A3%8E%E9%99%A9%E7%82%B9-%E8%AF%B4%E6%98%8E-%E9%A3%8E%E9%99%A9%E7%AD%89%E7%BA%A7-%E5%91%BD%E4%BB%A4%E5%8E%86%E5%8F%B2%E6%B3%84%E9%9C%B2-%E5%AF%86"><thead><tr><th align="left">风险点</th><th align="left">说明</th><th align="left">风险等级</th></tr></thead><tbody><tr><td align="left">**命令历史泄露**</td><td align="left">密码会保存在 `~/.bash_history` 中，任何能访问该文件的用户都可获取密码</td><td align="left">🔴 高</td></tr><tr><td align="left">**脚本明文存储**</td><td align="left">如写在部署脚本中，密码以明文形式存在于代码仓库</td><td align="left">🔴 高</td></tr><tr><td align="left">**进程列表暴露**</td><td align="left">`ps -ef` 可能显示含密码的命令行参数</td><td align="left">🟡 中</td></tr><tr><td align="left">**日志记录风险**</td><td align="left">如开启命令审计，密码可能被记录到系统日志</td><td align="left">🟡 中</td></tr></tbody></table>

### ✅ 方式二（密文密码）- **推荐**

```bash
setAcl / digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:cdrwa

```

<table id="bkmrk-%E4%BC%98%E5%8A%BF-%E8%AF%B4%E6%98%8E-%E5%AF%86%E7%A0%81%E4%B8%8D%E8%90%BD%E5%9C%B0-%E6%98%8E%E6%96%87%E5%AF%86%E7%A0%81%E4%B8%8D%E4%BC%9A%E5%87%BA%E7%8E%B0"><thead><tr><th align="left">优势</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left">**密码不落地**</td><td align="left">明文密码不会出现在脚本、历史命令中</td></tr><tr><td align="left">**哈希不可逆**</td><td align="left">SHA1+Base64编码，无法反向推导原始密码</td></tr><tr><td align="left">**符合安全审计**</td><td align="left">满足等保/安全扫描要求</td></tr></tbody></table>

---

## 二、安全配置完整方案

### 步骤1：生成密码密文（在安全环境执行）

```bash
# 方法：使用openssl生成digest哈希（推荐在临时环境执行，执行后清除历史）
echo -n "admin:YourSecurePassword123" | openssl dgst -sha1 -binary | base64
# 输出示例：HYGa7IZRm2PUBFiFFu8xY2pPP/s=

```

**安全提示**：

- 执行后立即运行 `history -c` 清除命令历史
- 或使用 `unset HISTFILE` 临时禁用历史

### 步骤2：配置ZooKeeper ACL（使用密文）

```bash
# 连接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
# 清除bash历史
history -c
history -w

# 检查并清理可能含密码的文件
grep -r "password" /home/shuncom/ --include="*.sh" --include="*.log"

```

---

## 三、针对现有部署脚本的安全修改建议

### 📝 修改后的安全部署脚本

```bash
#!/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年停止标准支持**，需额外加固：

<table id="bkmrk-%E5%8A%A0%E5%9B%BA%E9%A1%B9-%E9%85%8D%E7%BD%AE%E6%96%B9%E6%B3%95-%E4%BC%98%E5%85%88%E7%BA%A7-%E7%BD%91%E7%BB%9C%E9%9A%94%E7%A6%BB-%E9%98%B2%E7%81%AB"><thead><tr><th align="left">加固项</th><th align="left">配置方法</th><th align="left">优先级</th></tr></thead><tbody><tr><td align="left">**网络隔离**</td><td align="left">防火墙仅允许应用服务器IP访问2181端口</td><td align="left">🔴 必须</td></tr><tr><td align="left">**系统升级**</td><td align="left">尽可能升级到受支持的Ubuntu版本</td><td align="left">🔴 必须</td></tr><tr><td align="left">**文件权限**</td><td align="left">`chmod 700` 限制ZK配置文件仅所有者可读写</td><td align="left">🟡 推荐</td></tr><tr><td align="left">**日志审计**</td><td align="left">开启auditd监控ZK配置文件变更</td><td align="left">🟡 推荐</td></tr><tr><td align="left">**定期轮转**</td><td align="left">每90天更换ZK认证密码</td><td align="left">🟡 推荐</td></tr></tbody></table>

### 防火墙配置示例

```bash
# 仅允许应用服务器IP访问ZooKeeper端口
sudo ufw allow from 192.168.1.0/24 to any port 2181 proto tcp
sudo ufw deny 2181/tcp  # 拒绝其他所有访问

```

### 文件权限加固

```bash
# 限制配置文件权限
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

```

---

## 五、漏洞修复验证清单

完成配置后，请使用以下命令验证：

```bash
# 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

```

---

## 六、总结建议

<table id="bkmrk-%E9%A1%B9%E7%9B%AE-%E5%BB%BA%E8%AE%AE-acl%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F-%E2%9C%85-%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F"><thead><tr><th align="left">项目</th><th align="left">建议</th></tr></thead><tbody><tr><td align="left">**ACL配置方式**</td><td align="left">✅ 使用方式二（密文），避免明文密码落地</td></tr><tr><td align="left">**密码管理**</td><td align="left">✅ 使用密钥管理系统或加密配置文件存储密码</td></tr><tr><td align="left">**脚本安全**</td><td align="left">✅ 部署脚本中不包含密码，ACL配置单独手动执行</td></tr><tr><td align="left">**系统安全**</td><td align="left">⚠️ Ubuntu 14.04已过保，建议制定升级计划</td></tr><tr><td align="left">**网络访问**</td><td align="left">✅ 配置防火墙限制ZK端口仅内网访问</td></tr><tr><td align="left">**审计合规**</td><td align="left">✅ 定期更换密码，保留操作日志</td></tr></tbody></table>

按照以上方案实施后，可有效修复ZooKeeper未授权访问漏洞，满足安全扫描要求。