11.10.8 安全巡检清单与最佳实践汇总

本节汇总 ZooKeeper 安全巡检清单与最佳实践,面向日常巡检、变更前检查与合规审计场景,覆盖配置、访问、网络、日志、备份与运行态风险,并给出可执行命令与演练练习。

一、巡检流程原理草图#

文章图片

二、巡检清单(按优先级)与命令示例#

高优先级(必须项)
1. 认证与权限
- 确认已启用认证(Kerberos/SASL 或 digest)。
- ACL 是否最小权限,禁止 world:anyone:cdrwa 等宽权限。
- 核心路径是否配置严格 ACL(/config、/services、/brokers 等)。
- 命令示例:

# 1) 连接并查看 ACL
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181 <<'EOF'
getAcl /
getAcl /config
getAcl /services
EOF

# 2) 示例:设置 digest 认证并应用最小权限
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181 <<'EOF'
addauth digest admin:StrongPassw0rd!
setAcl /config digest:admin:StrongPassw0rd!:cdrwa
getAcl /config
EOF
# 预期:ACL 中不出现 world:anyone:cdrwa
  • 关键解释:addauth 为当前会话添加认证;setAcl 设置路径权限。
  1. 通信加密(TLS/SSL)
    - 检查客户端与服务端、服务端到服务端是否启用 TLS。
    - 证书是否有效、是否使用强加密套件。
    - 命令示例:
# 检查配置文件(路径以实际为准)
grep -E "ssl|secure" /opt/zookeeper/conf/zoo.cfg

# 证书有效期检查(示例:keystore 中证书)
keytool -list -v -keystore /opt/zookeeper/ssl/zk.keystore.jks

# 端口与 TLS 探测(若使用 TLS 端口 2281)
openssl s_client -connect 127.0.0.1:2281 -servername zk1.example.com -showcerts
  1. 访问控制与网络隔离
    - 集群端口仅对受信网络开放(2181/2888/3888)。
    - 防火墙/安全组限制管理端与业务端来源。
    - 命令示例:
# 端口监听检查
ss -lntp | grep -E '2181|2888|3888|2281'

# 防火墙检查(firewalld示例)
firewall-cmd --list-ports
firewall-cmd --list-rich-rules
  1. 配置与敏感信息
    - zoo.cfg 中敏感参数是否外部化、脱敏保存。
    - 禁止明文暴露认证信息、证书私钥权限是否正确。
    - 命令示例:
# 配置文件权限检查
stat -c "%a %U %G %n" /opt/zookeeper/conf/zoo.cfg
stat -c "%a %U %G %n" /opt/zookeeper/ssl/zk.keystore.jks

# 查找明文敏感信息(示例)
grep -R "password\|secret\|key" /opt/zookeeper/conf -n
  1. 日志与审计
    - 审计日志是否开启并定期归档。
    - 日志是否包含关键操作(创建、删除、ACL 变更)。
    - 命令示例:
# 日志目录检查
ls -lh /opt/zookeeper/logs

# 检查日志中 ACL 变更、删除操作
grep -E "setAcl|delete" /opt/zookeeper/logs/zookeeper.log | tail -n 20

中优先级(建议项)
1. 集群与节点安全
- myid 文件与 dataDir 权限是否最小化(700/600)。

stat -c "%a %U %G %n" /opt/zookeeper/data/myid
stat -c "%a %U %G %n" /opt/zookeeper/data
  1. 变更与发布
    - 变更前是否完成配置备份;是否有回滚预案。
# 配置备份
cp -a /opt/zookeeper/conf /opt/backup/zookeeper_conf_$(date +%F)

# 变更记录示例(建议)
echo "$(date +%F) change: enable TLS" >> /opt/backup/zk_change.log
  1. 监控与告警
    - Session 过期、连接数异常、ACL 失败、证书到期告警。
# 使用四字命令检查连接数
echo cons | nc 127.0.0.1 2181 | wc -l

# 证书到期提醒(示例:30天内)
keytool -list -v -keystore /opt/zookeeper/ssl/zk.keystore.jks | \
grep -A2 "Valid from" | grep -i "until"

低优先级(优化项)
1. 风险基线

# 基线参数比对(示例)
diff -u /opt/zookeeper/conf/zoo.cfg /opt/benchmark/zoo.cfg.baseline
  1. 资源与容量
# 连接数、watch 数量、延迟(示例)
echo wchs | nc 127.0.0.1 2181
echo mntr | nc 127.0.0.1 2181 | egrep "zk_avg_latency|zk_max_latency|zk_num_alive_connections"
  1. 依赖组件
# JDK版本与安全补丁
java -version

三、最佳实践汇总(含配置与脚本示例)#

  1. 最小权限与分级授权
# 以业务路径分级授权示例
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181 <<'EOF'
addauth digest admin:StrongPassw0rd!
create /services "root"
setAcl /services digest:admin:StrongPassw0rd!:cdrwa
create /services/app1 "app1"
setAcl /services/app1 digest:app1user:app1pass!:cdrw
getAcl /services/app1
EOF
  1. 强制加密通信
# /opt/zookeeper/conf/zoo.cfg(关键参数示例)
secureClientPort=2281
ssl.keyStore.location=/opt/zookeeper/ssl/zk.keystore.jks
ssl.keyStore.password=changeit
ssl.trustStore.location=/opt/zookeeper/ssl/zk.truststore.jks
ssl.trustStore.password=changeit
ssl.enabledProtocols=TLSv1.2,TLSv1.3
ssl.cipherSuites=TLS_AES_128_GCM_SHA256,TLS_AES_256_GCM_SHA384
  1. 配置安全与密钥管理
# 私钥权限设置
chown zookeeper:zookeeper /opt/zookeeper/ssl/zk.keystore.jks
chmod 600 /opt/zookeeper/ssl/zk.keystore.jks
  1. 安全审计与留痕
# 使用 logrotate 轮转(示例)
cat >/etc/logrotate.d/zookeeper <<'EOF'
/opt/zookeeper/logs/*.log {
  daily
  rotate 14
  compress
  missingok
  notifempty
  copytruncate
}
EOF
  1. 网络隔离与最小暴露
# firewalld 限制 2181 仅允许堡垒机网段
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
source address="10.10.10.0/24" port protocol="tcp" port="2181" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
port protocol="tcp" port="2181" drop'
firewall-cmd --reload
  1. 备份与恢复演练
# 冷备份 dataDir 与事务日志
tar -czf /opt/backup/zk_data_$(date +%F).tgz /opt/zookeeper/data
tar -czf /opt/backup/zk_log_$(date +%F).tgz /opt/zookeeper/logs

# 演练记录(示例)
echo "$(date +%F) backup ok" >> /opt/backup/zk_drill.log
  1. 变更管控
# 变更窗口检查(示例)
date
echo "Change window: 00:00-02:00" | tee -a /opt/backup/zk_change.log
  1. 持续巡检与基线对齐(脚本化)
# /opt/ops/zk_security_check.sh
#!/usr/bin/env bash
set -e
echo "[1] ACL check"
echo getAcl / | /opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181 | tail -n 5
echo "[2] Ports check"
ss -lntp | grep -E '2181|2281|2888|3888'
echo "[3] TLS check"
grep -E "secureClientPort|ssl." /opt/zookeeper/conf/zoo.cfg
echo "[4] Log check"
ls -lh /opt/zookeeper/logs | tail -n 5

四、常见排错(与巡检联动)#

  1. 未启用 TLS
    - 现象:客户端握手失败、明文端口仍监听。
    - 排查:
grep -E "secureClientPort|ssl." /opt/zookeeper/conf/zoo.cfg
ss -lntp | grep 2281
  1. ACL 过宽
    - 现象:getAcl 出现 world:anyone:cdrwa
    - 修复:
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181 <<'EOF'
addauth digest admin:StrongPassw0rd!
setAcl / world:anyone:r
EOF
  1. 证书过期
    - 现象:TLS 连接失败、日志报证书失效。
    - 排查:
keytool -list -v -keystore /opt/zookeeper/ssl/zk.keystore.jks | grep -A2 "Valid from"

五、练习与演练任务#

  1. ACL 演练
    - 目标:为 /services/app2 设置只读权限并验证。
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181 <<'EOF'
addauth digest admin:StrongPassw0rd!
create /services/app2 "app2"
setAcl /services/app2 digest:app2user:app2pass!:r
getAcl /services/app2
EOF
  1. TLS 验证
    - 目标:在 2281 端口完成 TLS 握手并输出证书链。
openssl s_client -connect 127.0.0.1:2281 -showcerts
  1. 巡检脚本执行
    - 目标:运行脚本并保存报告。
bash /opt/ops/zk_security_check.sh | tee /opt/backup/zk_security_report_$(date +%F).txt

六、巡检输出建议格式#

  • 结论:通过/有风险/需整改
  • 问题清单:问题描述、风险等级、影响范围
  • 整改建议:具体步骤、负责人、完成时间
  • 复核结果:整改验收记录与证据

本节内容可作为运维巡检模板,结合企业安全规范与合规要求进行定制化落地。