yum无可用更新时是否记录检查日志?如何将yum-cron检查事件导入SIEM?
我之前处理过类似的审计合规需求,默认yum的行为确实让人头疼——只有实际执行更新/安装时才会写入/var/log/yum.log,单纯检查无可用更新时完全没记录,而审计方不认cron日志(只证明任务跑了,没法证明检查动作的结果)。下面是我用过的可靠解决方案:
1. 编写自定义日志记录脚本
先写一个shell脚本,替代或补充yum-cron的检查逻辑,强制记录每次检查的结果(不管有没有更新)。脚本会捕获yum check-update的返回码和输出,生成包含时间戳、主机名的结构化日志,方便SIEM解析。
创建脚本文件/usr/local/bin/yum-check-update-log.sh:
#!/bin/bash # 自定义yum更新检查日志脚本 - 满足SIEM审计需求 LOG_FILE="/var/log/yum-check-update.log" # 生成标准化时间戳,适配SIEM解析 TIMESTAMP=$(date "+%Y-%m-%dT%H:%M:%S%z") HOSTNAME=$(hostname -f) # 执行yum检查,捕获所有输出(包括错误) UPDATE_OUTPUT=$(yum check-update 2>&1) EXIT_CODE=$? # 根据yum返回码判断检查结果 case $EXIT_CODE in 0) # 返回0:无可用更新 LOG_ENTRY="[$TIMESTAMP] [$HOSTNAME] YUM_CHECK_UPDATE: STATUS=NO_UPDATES" ;; 100) # 返回100:有可用更新,附加输出内容 LOG_ENTRY="[$TIMESTAMP] [$HOSTNAME] YUM_CHECK_UPDATE: STATUS=UPDATES_AVAILABLE OUTPUT=\"$UPDATE_OUTPUT\"" ;; *) # 其他返回码:检查出错,记录错误信息 LOG_ENTRY="[$TIMESTAMP] [$HOSTNAME] YUM_CHECK_UPDATE: STATUS=ERROR EXIT_CODE=$EXIT_CODE OUTPUT=\"$UPDATE_OUTPUT\"" ;; esac # 写入日志文件,确保权限安全 echo "$LOG_ENTRY" >> "$LOG_FILE" chmod 0640 "$LOG_FILE"
给脚本添加执行权限:
chmod +x /usr/local/bin/yum-check-update-log.sh
2. 替换yum-cron的定时任务
默认yum-cron的检查任务通常在/etc/cron.d/yum-cron或/etc/crontab里,我们需要把原来的检查命令替换成这个自定义脚本,确保每次检查都生成日志。
编辑crontab(用crontab -e以root身份编辑),添加或替换成:
# 每天凌晨2点执行yum更新检查并记录日志 0 2 * * * root /usr/local/bin/yum-check-update-log.sh
如果还需要保留yum-cron的自动下载/安装功能,可以调整/etc/yum/yum-cron.conf里的配置,同时保留这个检查日志脚本的定时任务——两者不冲突。
3. 配置日志轮转
避免日志文件无限增长,给自定义日志配置logrotate:
创建/etc/logrotate.d/yum-check-update文件:
/var/log/yum-check-update.log { daily rotate 90 # 保留90天的日志,按需调整 compress missingok notifempty create 0640 root root postrotate # 如果用syslog转发,这里可以重启syslog服务,可选 # systemctl reload rsyslog.service endscript }
4. 配置SIEM采集
把/var/log/yum-check-update.log添加到你的SIEM采集配置中:
- 如果是Splunk:创建一个文件监控输入,指向这个日志路径,配置对应的 sourcetype
- 如果是ELK Stack:用Filebeat添加这个日志的采集规则,将数据发送到Logstash或直接到Elasticsearch
- 其他SIEM:参照官方文档,添加该日志文件的数据源,确保能解析时间戳、主机名、状态等字段
测试验证
手动执行脚本,检查日志是否生成:
/usr/local/bin/yum-check-update-log.sh cat /var/log/yum-check-update.log
你会看到类似这样的日志条目:
[2024-05-20T14:30:00+0800] [server01.example.com] YUM_CHECK_UPDATE: STATUS=NO_UPDATES
或者有更新时的条目:
[2024-05-20T14:32:00+0800] [server01.example.com] YUM_CHECK_UPDATE: STATUS=UPDATES_AVAILABLE OUTPUT="kernel.x86_64 3.10.0-1160.11.1.el7 updates"
这样审计方就能明确看到每次yum检查的执行时间、结果,完全满足合规要求。
内容的提问来源于stack exchange,提问作者Greg Applebee

