11.10.4 配置文件与敏感信息保护
配置文件与敏感信息保护的目标是降低配置泄露与篡改风险,确保集群运行在最小暴露面与最小权限原则之上。本节从文件权限、敏感参数管理、密钥与证书、配置变更治理、数据目录保护五个方面给出实践,并配套示例、排错与练习。
原理草图:配置与敏感信息流转
1. 配置文件权限与所有权
- 关键文件:zoo.cfg、log4j.properties、jaas.conf、myid
- 推荐权限:文件 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. 数据与快照目录保护
- dataDir、dataLogDir 权限 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 管理配置,模拟一次错误变更并回滚到上一个版本。