11.10.5 运维操作审计与日志留存
在ZooKeeper的运维体系中,操作审计与日志留存是追溯问题与满足合规要求的核心环节。本节给出审计闭环的原理草图、配置示例、采集联动、排错流程与练习。
审计目标与范围#
- 目标:追溯变更来源、定位误操作、支撑安全合规与责任界定。
- 范围:配置变更、节点管理、权限调整、集群管理命令、异常登录与会话事件。
- 对象:ZooKeeper服务端、客户端访问、运维工具与自动化平台操作。
日志类型与采集要点#
- 服务端运行日志:包含启动、会话、连接、异常与内部错误。建议常态INFO,排障短期开DEBUG。
- 审计日志:记录管理命令、权限变更、配置热更新、集群成员调整等关键操作。
- 访问日志:客户端连接与断开、认证失败、权限拒绝、请求耗时。
- 系统与安全日志:主机系统登录、sudo操作、systemd服务启停、文件权限变更。
审计策略与落地流程#
- 统一入口:所有管理操作经跳板机/自动化平台执行,保证审计完整。
- 最小授权:基于运维角色配置最小ACL权限。
- 变更记录:将配置变更、版本升级、扩缩容纳入工单与变更流程。
- 时间同步:NTP/Chrony统一时间,避免事件排序错误。
日志配置与安装示例(含命令解释)#
以下示例以 ZooKeeper 3.8.x + Log4j2 为例,路径可按发行版调整。
1)检查与准备目录
# 查看日志目录,确保可写
ls -ld /var/log/zookeeper
# 若不存在则创建
mkdir -p /var/log/zookeeper
chown -R zookeeper:zookeeper /var/log/zookeeper
2)Log4j2 配置示例(含审计日志)
文件路径:/opt/zookeeper/conf/log4j2.properties
status = error
name = ZKLog
# 1) 运行日志
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = /var/log/zookeeper/zookeeper.log
appender.rolling.filePattern = /var/log/zookeeper/zookeeper.log.%d{yyyy-MM-dd}.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{ISO8601} [%t] %-5p %c - %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
# 2) 审计日志
appender.audit.type = RollingFile
appender.audit.name = AuditFile
appender.audit.fileName = /var/log/zookeeper/audit.log
appender.audit.filePattern = /var/log/zookeeper/audit.log.%d{yyyy-MM-dd}.gz
appender.audit.layout.type = PatternLayout
appender.audit.layout.pattern = %d{ISO8601} %-5p %c - %m%n
appender.audit.policies.type = Policies
appender.audit.policies.time.type = TimeBasedTriggeringPolicy
appender.audit.policies.time.interval = 1
# 3) 日志级别
rootLogger.level = info
rootLogger.appenderRef.rolling.ref = RollingFile
# 4) 审计类日志单独输出(示意,实际类名按版本调整)
logger.audit.name = org.apache.zookeeper.audit
logger.audit.level = info
logger.audit.additivity = false
logger.audit.appenderRef.audit.ref = AuditFile
3)重启并验证日志输出
# systemd 方式
systemctl restart zookeeper
# 观察日志是否输出
tail -n 50 /var/log/zookeeper/zookeeper.log
tail -n 20 /var/log/zookeeper/audit.log
审计操作示例与命令解释#
示例:通过统一入口对节点授权并记录审计
# 进入跳板机后执行
zkCli.sh -server 10.0.0.11:2181
# 创建节点
create /app/config "v1"
# 设置ACL(digest认证)
addauth digest ops:StrongPass
setAcl /app/config digest:ops:StrongPass:cdrwa
# 读取验证
get /app/config
create:记录变更操作,应在审计日志中体现。addauth/setAcl:权限变更必须纳入审计重点。
预期效果
/var/log/zookeeper/audit.log 应包含 create、setAcl 相关记录。
日志采集与告警联动示例#
1)Filebeat 安装(以RPM为例)
# 安装
rpm -ivh filebeat-8.x.x-x86_64.rpm
2)Filebeat 采集配置
文件路径:/etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/zookeeper/zookeeper.log
- /var/log/zookeeper/audit.log
fields:
service: zookeeper
log_type: audit
fields_under_root: true
output.elasticsearch:
hosts: ["http://10.0.0.50:9200"]
setup.kibana:
host: "10.0.0.51:5601"
3)启动与验证
systemctl enable filebeat
systemctl start filebeat
# 检查状态
systemctl status filebeat
告警建议
- 认证失败次数过多(authFailed)
- 频繁变更 /zookeeper/config、/zookeeper/quota
- 短时间大量 session 断开
日志留存与归档规范(含命令)#
使用 logrotate 归档
文件路径:/etc/logrotate.d/zookeeper
/var/log/zookeeper/*.log {
daily
rotate 180
compress
missingok
notifempty
copytruncate
}
# 手工测试
logrotate -d /etc/logrotate.d/zookeeper
# 强制执行
logrotate -f /etc/logrotate.d/zookeeper
常见问题与排错#
1)日志不输出
# 检查配置生效
grep -n "log4j2.properties" /opt/zookeeper/bin/zkServer.sh
# 检查权限
ls -l /var/log/zookeeper
# 检查进程用户
ps -ef | grep zookeeper
- 现象:日志目录无新文件
处理:修正日志目录权限或确认 log4j2 配置路径。
2)审计日志缺失
# 检查审计类日志级别
grep -n "logger.audit" /opt/zookeeper/conf/log4j2.properties
# 临时提升级别验证
- 现象:运行日志有、审计日志空
处理:确认审计 logger 名称是否与版本匹配。
3)采集无数据
# Filebeat 自检
filebeat test config -e
filebeat test output -e
- 现象:ES无数据
处理:检查输出地址、防火墙、权限。
练习#
- 在测试环境启用审计日志,使用
setAcl修改权限,验证audit.log中出现对应记录。 - 配置 logrotate 保留 7 天,手动执行
logrotate -f并观察压缩文件生成。 - Filebeat 采集
audit.log后,在日志平台中筛选log_type=audit的记录。 - 将日志级别临时提升到 DEBUG 进行问题定位,完成后恢复到 INFO。