关于使用rsyslog防止日志刷屏及AuditD进程与子进程日志过滤的技术问询
关于使用rsyslog防止日志刷屏及AuditD进程与子进程日志过滤的技术问询
针对你遇到的问题——AuditD下某个进程不断生成子进程产生重复日志(仅timestamp不同),想在rsyslog侧去重,或者直接在AuditD源头过滤,我整理了两个方向的可行方案:
一、rsyslog侧:基于日志核心内容去重(忽略timestamp差异)
因为重复日志只是timestamp不同,核心的进程行为(比如调用的系统调用、进程路径、操作对象)是固定的,我们可以提取这些核心字段作为去重标识,而不是匹配整条日志:
- 先安装rsyslog的结构化解析模块
mmnormalize(不同发行版包名略有差异,Debian/Ubuntu是rsyslog-mmnormalize,RHEL/CentOS是rsyslog-mmnormalize)
- 先安装rsyslog的结构化解析模块
- 编写AuditD日志的解析规则文件
/etc/rsyslog.d/audit.rules,用来提取核心字段:
- 编写AuditD日志的解析规则文件
rule=:%syslogtag:rsyslogtag% type=%type:word% msg=audit(%auditid:number%:%serial:number%): %msg:rest% rule=msg=audit(%auditid:number%:%serial:number%): pid=%pid:number% uid=%uid:number% auid=%auid:number% ses=%ses:number% comm=%comm:word% exe=%exe:path% syscall=%syscall:number% %msg:rest%
- 修改rsyslog配置文件(比如
/etc/rsyslog.d/50-audit.conf),添加去重逻辑:
- 修改rsyslog配置文件(比如
# 加载mmnormalize模块 module(load="mmnormalize") # 定义核心标识模板:拼接进程路径、系统调用、进程名作为去重依据 template(name="AuditDupeKey" type="string" string="%$!exe%|%$!syscall%|%$!comm%") # 处理AuditD日志流 if $programname == "auditd" then { # 解析日志为结构化字段 mmnormalize(rulebase="/etc/rsyslog.d/audit.rules") # 生成去重键 set $dupe_key = $template(AuditDupeKey); # 仅当去重键与上一条不同时,才写入日志文件 action( type="omfile" file="/var/log/audit/audit.log" execOnlyWhenPreviousIsDifferent="on" execOnlyWhenPreviousIsDifferentField="$dupe_key" ) stop }
- 重启rsyslog服务生效:
systemctl restart rsyslog
- 重启rsyslog服务生效:
注意:如果你的AuditD日志格式和示例不同,需要调整解析规则里的字段匹配逻辑,确保能正确提取exe、syscall、comm这些固定字段。
二、AuditD侧:从源头过滤目标进程及其子进程
从审计源头过滤会更高效,避免生成不必要的日志。这里分两种场景处理:
场景1:目标进程及其子进程的可执行文件路径固定
如果父进程和子进程都使用同一个可执行文件,直接添加排除规则:
- 编辑AuditD规则文件
/etc/audit/rules.d/99-exclude-annoying-process.rules:
# 排除目标进程本身的所有审计日志 -a never,exclude -F exe=/path/to/your/annoying-process # 排除该进程的子进程(通过父进程PID,适合临时场景) -a never,exclude -F ppid=$(pidof annoying-process)
- 加载新规则生效:
augenrules --load && systemctl restart auditd
场景2:子进程可执行路径不同,但由固定父进程生成
如果子进程路径不固定,但都是由同一个父进程 spawn 的,可以结合进程的会话ID过滤:
# 先获取父进程的会话ID,再添加排除规则 -a never,exclude -F ses=$(ausearch -c annoying-process --raw | head -n1 | awk -F'ses=' '{print $2}' | awk '{print $1}')
注意:如果父进程重启,会话ID会变化,需要重新更新规则。你可以写个简单的定时脚本,或者在父进程的systemd service里添加ExecStartPost钩子来自动更新AuditD规则。
备注:内容来源于stack exchange,提问作者Jason




