需组合使用系统调用过滤(-s open/openat/creat)与auid标识,配合-f dir=/path和success=1,而非仅用-w目录监控;规则须永久写入/etc/audit/rules.d/并augenrules加载。

要实现对特定用户ID在敏感目录下文件创建行为的全审计,核心在于组合使用系统调用过滤(-S creat, -S open, -S openat等)与用户标识字段(-F auid=xxx 或 -F uid=xxx),并配合目录路径和权限条件。这不是单纯用 -w /path -p w 就能覆盖的——因为 auditctl -w 只监控已存在路径的写操作,而文件创建(尤其是首次 touch、重定向输出、程序写新文件)常通过 open() 系统调用以 O_CREAT 标志触发,不涉及对父目录本身的“写”权限审计。
以下是分步、可落地的配置方法:
一、明确目标:什么是“文件创建”行为
在内核层面,“创建文件”本质是进程调用 open()(带 O_CREAT)、creat() 或 openat()(带 O_CREAT)时,在目标路径上新建一个 inode。因此需捕获这些系统调用,并限定:
- 调用者是特定用户(推荐用
auid,即登录会话原始用户 ID,防sudo/su伪装); - 目标路径位于指定敏感目录(如
/etc/,/root/,/opt/app/config/); - 操作成功(避免海量失败日志干扰)。
二、配置规则(临时测试用)
假设你要审计 auid=1001 的用户在 /etc/ 目录下所有新建文件行为:
sudo auditctl -a always,exit -F arch=b64 -S open,openat,creat -F auid=1001 -F dir=/etc -F success=1 -k user1001_etc_create
说明:
-
-a always,exit:在系统调用退出时记录,确保拿到完整上下文(如返回值、路径名); -
-F arch=b64:64位系统必须指定,否则规则不匹配(32位系统用b32); -
-S open,openat,creat:覆盖主流文件创建系统调用; -
-F auid=1001:锁定原始登录用户(即使sudo -u nobody执行,auid 仍是 1001); -
-F dir=/etc:内核自动匹配该目录及其子目录下的所有open*调用(注意:不是-F path=,后者只匹配精确路径); -
-F success=1:仅记录成功创建的事件,排除权限拒绝等噪音; -
-k user1001_etc_create:打标签,便于后续用ausearch -k快速检索。
✅ 验证方式:切换到 UID 1001 用户,执行
touch /etc/test1、echo "x" > /etc/test2、cp /dev/null /etc/test3,再运行ausearch -k user1001_etc_create -i | grep "open\|creat"查看是否捕获到对应事件。
三、升级为永久规则(生产环境必需)
将上述规则固化,避免重启丢失:
-
创建规则文件:
sudo tee /etc/audit/rules.d/20-user1001-etc-create.rules
-
加载规则:
sudo augenrules --load
-
确认生效:
sudo auditctl -l | grep user1001_etc_create
四、关键注意事项
-
不要用
-w /etc -p w替代:它只监控/etc目录自身的写(如mv重命名、rmdir),无法捕获在/etc/xxx下新建文件的动作; -
auidvsuid:auid是登录会话起始用户 ID,不可被子进程修改;uid是当前进程有效用户 ID,执行sudo后会变成 root,失去原始身份追踪能力; -
路径必须真实存在:
-F dir=/etc要求/etc是真实目录(不能是符号链接未解析路径),且 auditd 不支持监控/proc、/sys等虚拟文件系统; -
性能影响可控:该规则只在 auid=1001 的进程调用指定系统调用时触发,不影响其他用户或系统调用,日志量远小于全量
execve。
这样配置后,只要 UID 1001 的用户在 /etc/ 下新建任何文件(无论用什么命令),都会留下包含时间、进程名、可执行路径、完整路径名的审计记录,满足合规与溯源要求。











