You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于使用rsyslog防止日志刷屏及AuditD进程与子进程日志过滤的技术问询

关于使用rsyslog防止日志刷屏及AuditD进程与子进程日志过滤的技术问询

针对你遇到的问题——AuditD下某个进程不断生成子进程产生重复日志(仅timestamp不同),想在rsyslog侧去重,或者直接在AuditD源头过滤,我整理了两个方向的可行方案:

一、rsyslog侧:基于日志核心内容去重(忽略timestamp差异)

因为重复日志只是timestamp不同,核心的进程行为(比如调用的系统调用、进程路径、操作对象)是固定的,我们可以提取这些核心字段作为去重标识,而不是匹配整条日志:

    1. 先安装rsyslog的结构化解析模块mmnormalize(不同发行版包名略有差异,Debian/Ubuntu是rsyslog-mmnormalize,RHEL/CentOS是rsyslog-mmnormalize
    1. 编写AuditD日志的解析规则文件/etc/rsyslog.d/audit.rules,用来提取核心字段:
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%
    1. 修改rsyslog配置文件(比如/etc/rsyslog.d/50-audit.conf),添加去重逻辑:
# 加载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
}
    1. 重启rsyslog服务生效:systemctl restart rsyslog

注意:如果你的AuditD日志格式和示例不同,需要调整解析规则里的字段匹配逻辑,确保能正确提取exesyscallcomm这些固定字段。

二、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

火山引擎 最新活动