11.10.4 配置文件与敏感信息保护

配置文件与敏感信息保护的目标是降低配置泄露与篡改风险,确保集群运行在最小暴露面与最小权限原则之上。本节从文件权限、敏感参数管理、密钥与证书、配置变更治理、数据目录保护五个方面给出实践,并配套示例、排错与练习。

原理草图:配置与敏感信息流转

文章图片

1. 配置文件权限与所有权
- 关键文件:zoo.cfglog4j.propertiesjaas.confmyid
- 推荐权限:文件 640,目录 750,密钥 600

示例:设置权限与所有权

# 假设 ZooKeeper 安装在 /opt/zookeeper
sudo useradd -r -s /sbin/nologin zookeeper

sudo chown -R zookeeper:zookeeper /opt/zookeeper/conf /opt/zookeeper/data
sudo chmod 750 /opt/zookeeper/conf /opt/zookeeper/data

sudo chmod 640 /opt/zookeeper/conf/zoo.cfg
sudo chmod 640 /opt/zookeeper/conf/log4j.properties
sudo chmod 640 /opt/zookeeper/conf/jaas.conf
sudo chmod 640 /opt/zookeeper/data/myid

# 设置默认权限,防止新文件过宽
echo "umask 027" | sudo tee -a /etc/profile.d/zk-umask.sh

命令解释
- chown:变更文件所有权,避免其他账号可写
- chmod 640/750:限制非授权读写
- umask 027:新建文件默认 640、目录 750

常见排错
- 报错:Permission denied
处理:确认运行用户与配置文件权限

ps -ef | grep QuorumPeerMain
ls -l /opt/zookeeper/conf/zoo.cfg

2. 敏感参数最小化与脱敏
- 避免明文凭据硬编码,优先环境变量或密钥管理
- 日志输出不要包含凭据字段

示例:用环境变量注入凭据

# 启动前导出敏感变量
export ZK_SASL_USER=zk_svc
export ZK_SASL_PASS='S3cure!Pass'

# 启动脚本引用环境变量(示意)
cat >/opt/zookeeper/bin/zk-env.sh <<'EOF'
export JVMFLAGS="$JVMFLAGS -Dzk.user=$ZK_SASL_USER -Dzk.pass=$ZK_SASL_PASS"
EOF

示例:日志脱敏配置

# /opt/zookeeper/conf/log4j.properties
log4j.rootLogger=INFO, CONSOLE
# 禁止 DEBUG 级别输出潜在凭据
log4j.logger.org.apache.zookeeper.server.auth=INFO

扫描敏感信息示例

# 查找可能的明文口令
grep -RInE "password|passwd|token|secret|keytab" /opt/zookeeper/conf

3. 密钥与证书管理
- TLS 私钥权限 600
- keytab 与证书放专用目录,避免与配置混放

示例:TLS 证书目录与权限

sudo mkdir -p /opt/zookeeper/ssl
sudo chown zookeeper:zookeeper /opt/zookeeper/ssl
sudo chmod 700 /opt/zookeeper/ssl

sudo cp /etc/pki/tls/private/zk.key /opt/zookeeper/ssl/
sudo cp /etc/pki/tls/certs/zk.crt /opt/zookeeper/ssl/
sudo chmod 600 /opt/zookeeper/ssl/zk.key
sudo chmod 644 /opt/zookeeper/ssl/zk.crt

示例:JAAS 与 keytab

# /opt/zookeeper/conf/jaas.conf
Server {
  com.sun.security.auth.module.Krb5LoginModule required
  useKeyTab=true
  keyTab="/opt/zookeeper/ssl/zk.keytab"
  principal="zookeeper/zk1.example.com@EXAMPLE.COM";
};

排错:SASL 认证失败

# 检查 keytab 权限与 principal
ls -l /opt/zookeeper/ssl/zk.keytab
klist -k /opt/zookeeper/ssl/zk.keytab

4. 配置变更与版本治理
- 使用 Git 管理配置模板
- 变更需要审批与回滚方案

示例:配置模板与差异校验

# 初始化配置仓库
mkdir -p /srv/zk-config && cd /srv/zk-config
git init
cp /opt/zookeeper/conf/zoo.cfg ./zoo.cfg.prod
git add zoo.cfg.prod && git commit -m "init prod config"

# 变更前后差异
git diff HEAD~1 HEAD

示例:集群一致性校验

# 在三台节点对关键参数做一致性比对
for h in zk1 zk2 zk3; do
  ssh $h "grep -E 'dataDir|clientPort|server\.' /opt/zookeeper/conf/zoo.cfg" \
  | sed "s/^/$h: /"
done

5. 数据与快照目录保护
- dataDirdataLogDir 权限 700
- 备份加密并限制访问

示例:数据目录权限与备份

sudo chmod 700 /opt/zookeeper/data /opt/zookeeper/datalog

# 备份快照与事务日志,使用 gpg 加密
tar czf /tmp/zk-backup.tgz -C /opt/zookeeper data datalog
gpg --symmetric --cipher-algo AES256 /tmp/zk-backup.tgz

6. 配置暴露面控制
- 禁止 Web/共享服务暴露 /opt/zookeeper/conf
- 自动化平台用最小权限账号读取必要文件

示例:Nginx 禁止访问配置目录

# /etc/nginx/conf.d/zk.conf
location /zk/conf/ {
    deny all;
}

7. 安全基线与持续检查
- 定期扫描权限过宽、明文凭据、证书过期

示例:权限与证书扫描脚本

#!/usr/bin/env bash
CONF=/opt/zookeeper/conf
SSL=/opt/zookeeper/ssl

echo "[1] 检查权限过宽文件"
find $CONF -type f -perm /022 -print

echo "[2] 检查敏感词"
grep -RInE "password|token|secret|keytab" $CONF

echo "[3] 检查证书过期"
openssl x509 -in $SSL/zk.crt -noout -enddate

练习
1. 在测试机上创建 zoo.cfg,故意设置为 777,使用脚本扫描并修复为 640
2. 将 jaas.conf 放在错误路径,启动 ZooKeeper,观察日志并修复路径与权限。
3. 用 Git 管理配置,模拟一次错误变更并回滚到上一个版本。