auditd精准捕获rm/mv等命令的关键在于监控unlink、renameat等系统调用及目标路径操作;配置得当可快速锁定执行者、时间、终端、参数及源文件路径。

auditd 能精准捕获 rm、mv 等命令的执行行为,关键不在于监控命令本身,而在于监控它们调用的系统调用(如 unlink、renameat)以及对目标文件路径的操作。只要规则配置得当,就能在误删发生后,快速锁定执行者、时间、终端、命令参数甚至源文件路径。
一、核心原理:盯住系统调用,而非命令路径
直接监控 /usr/bin/rm 文件执行(-w /usr/bin/rm -p xa)只能知道“谁运行了 rm”,但无法得知“删了哪个文件”“是否带 -rf”。真正决定删除动作的是内核系统调用。auditd 通过以下方式实现细粒度追踪:
-
删除操作:由
unlink(单文件)、unlinkat(含目录递归)系统调用触发 -
移动/重命名:由
renameat或renameat2触发 - 必须同时记录 execve:才能把“谁执行了什么命令”和“它删了什么”关联起来
二、推荐规则配置(永久生效)
将以下内容写入 /etc/audit/rules.d/cmd_delete.rules,再执行 sudo augenrules --load 生效:
-a always,exit -F arch=b64 -S unlink,unlinkat -F exit=-EACCES -k delete_denied -a always,exit -F arch=b64 -S unlink,unlinkat -F exit=0 -k delete_success -a always,exit -F arch=b64 -S renameat,renameat2 -F exit=0 -k move_rename -a always,exit -F arch=b64 -S execve -F path=/usr/bin/rm -k cmd_rm -a always,exit -F arch=b64 -S execve -F path=/usr/bin/mv -k cmd_mv -a always,exit -F arch=b64 -S execve -F path=/usr/bin/rmdir -k cmd_rmdir
说明:
- 前两条区分“删除成功”和“权限不足被拒”,避免日志刷屏;
-F exit=0表示系统调用成功返回 -
-F arch=b64针对主流 64 位系统;若需兼容 32 位,另加-F arch=b32规则 -
execve规则确保记录完整命令行(含参数),是还原操作意图的关键
三、快速定位误删责任人的实操步骤
假设凌晨 2:15 发生误删,目标是查清谁、在哪台终端、执行了什么命令、删了哪些文件:
-
查删除动作本身:
sudo ausearch -m unlink,unlinkat -i --start today | grep "name="/→ 显示所有已删除的文件路径及 UID -
关联执行命令:
sudo ausearch -m execve -i --start 02:10 --end 02:20 | grep -A 2 -B 2 "rm\|mv"→ 找出该时段所有 rm/mv 命令及其完整参数(如rm -rf /data/backup) -
锁定责任人:从上一步结果中提取
auid(原始登录 UID),再用sudo aureport -u -i --start 02:10 --end 02:20查该 UID 对应的用户名和登录终端(tty) -
一键溯源(推荐):
sudo ausearch -m unlinkat -i --start 02:15 --end 02:16 | aureport -f -i→ 直接输出文件名 + 用户名 + 时间戳组合报告
四、注意事项与加固建议
规则生效后,还需注意几个易忽略点:
-
日志权限必须严格:
sudo chmod 600 /var/log/audit/audit.log,防止未授权读取 -
避免漏掉 shell 内置命令:bash 的
rm内置功能极少,但若用户使用busybox rm或自编译二进制,需额外添加对应-F path=规则 -
结合历史命令审计更可靠:启用
execve全局监控(-a always,exit -F arch=b64 -S execve)可捕获所有命令,但日志量大,建议仅在事件调查期临时开启 -
定期轮转与备份:确认
/etc/audit/auditd.conf中max_log_file和num_logs设置合理,避免关键日志被覆盖











