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无数据
    处理:检查输出地址、防火墙、权限。

练习#

  1. 在测试环境启用审计日志,使用 setAcl 修改权限,验证 audit.log 中出现对应记录。
  2. 配置 logrotate 保留 7 天,手动执行 logrotate -f 并观察压缩文件生成。
  3. Filebeat 采集 audit.log 后,在日志平台中筛选 log_type=audit 的记录。
  4. 将日志级别临时提升到 DEBUG 进行问题定位,完成后恢复到 INFO。