linux auditd syscall审计需精准而非全开,应聚焦高风险调用并叠加uid、路径、返回值等条件过滤,配合限速、异步写入、插件分流及规则验证,必要时以ebpf或mac策略替代。

Linux auditd 的 syscall 审计规则编写需兼顾精确性与性能,否则极易因日志爆炸拖垮系统。关键不是“全开”,而是“精准捕获必要行为”,同时通过过滤、限速、异步写入等手段控制日志量。
syscall 规则编写:聚焦关键系统调用与上下文条件
直接监控所有 syscall(如 -a always,exit -S all)在生产环境不可取。应基于安全需求和业务特征,选择高风险或高价值的调用,并叠加路径、UID、权限等条件缩小范围:
- 按行为意图筛选:例如监控敏感文件访问,优先用
-F path=/etc/shadow -S openat,open,openat2,而非泛泛监控所有open类调用; - 结合执行者身份限制:添加
-F uid!=0或-F auid>=1000排除 root 或仅审计普通用户行为; - 利用 exit 过滤返回值:例如只记录失败的权限拒绝操作:
-F exit=-EACCES,避免淹没成功日志; - 慎用 execve 全匹配:若需审计命令执行,建议配合
-F exe=/usr/bin/bash或-F cwd=/tmp等上下文字段,避免捕获所有 shell 子进程。
海量日志优化:从源头抑制、管道分流到落盘控制
日志爆炸往往源于规则过宽或缺乏节流。优化需分层实施:
- auditd 配置限速:在
/etc/audit/auditd.conf中设置freq=50(每秒最大日志条数)、num_logs=5(轮转日志数)、max_log_file=50(单个日志上限 MB),防止磁盘打满; - 启用异步日志写入:设
log_format = ENRICHED+flush = async,降低 syscall 延迟;注意异步模式下系统崩溃可能丢失最后几条日志; - 用 audispd 插件分流:禁用默认的
audispd-plugins中的af_unix(写本地文件),改用syslog插件将关键事件转发至远程 rsyslog 或 SIEM,本地仅保留原始 raw 日志用于取证; - 规则级去重与聚合:对高频但低价值事件(如大量
statx调用),可用-F key=low_freq标记,再通过aureport --key low_freq --summary汇总分析,不落地每条记录。
验证与调试:避免“写了却没生效”的隐形失效
audit 规则易因顺序、冲突或内核模块缺失而静默失效。务必验证:
- 检查规则加载状态:运行
auditctl -l查看实时规则列表,确认你的规则已存在且无语法错误; - 模拟触发并实时抓取:用
ausearch -m SYSCALL -ts recent | aureport -f -i快速验证某类调用是否被记录; - 关注 auditd 自身日志:查看
/var/log/audit/audit.log中是否有type=CONFIG_CHANGE或type=ANOM_ABEND提示规则冲突或内核不支持; - 测试失败场景:例如用非 root 用户尝试
chmod 600 /etc/shadow,确认是否生成SYSCALL ... auid=... uid=... comm="chmod" res=failed类型事件。
替代方案补充:当 auditd 不再适用时考虑什么
对于超大规模容器环境或需要细粒度进程行为建模的场景,auditd 的 syscall 级粒度可能不够或太重:
- eBPF + Tracee / Falco:基于 eBPF 实现低开销、可编程的事件过滤,支持容器上下文、进程树、文件属性等多维判断;
- systemd-journald + secure boot 日志:对启动链、服务生命周期类审计更轻量,适合合规基线检查;
- 内核 audit 与 SELinux/AppArmor 协同:用 MAC 策略先拦截非法行为,audit 仅记录被允许但需审计的操作,大幅减少日志量。
syscall 审计不是功能开关,而是策略工程。规则越少、条件越准、出口越可控,系统越稳,分析越有效。