应使用auditd按系统调用捕获execve、mmap、openat等行为,而非仅文件watch;执行auditctl -a always,exit -F arch=b64 -S execve -F exe=/usr/bin/sudo -k sudo_execve等规则并持久化至/etc/audit/rules.d/sudo.rules。

要在Linux中用auditd完整记录对/usr/bin/sudo的访问和执行行为,关键不是只监控文件打开,而是捕获所有与该二进制关联的系统调用——特别是execve(执行)、openat/open(读取)、mmap(内存映射加载)等。默认仅加一个watch无法覆盖全部场景。
添加精确的audit规则(推荐使用-a而非-w)
直接监控/usr/bin/sudo路径的文件级watch(如-w /usr/bin/sudo -p rx)容易漏掉exec行为,且无法区分是执行还是单纯读取。更可靠的方式是按系统调用过滤:
- 执行行为:匹配
execve调用中pathname为/usr/bin/sudo的事件 - 加载行为:匹配
mmap或openat中目标路径为/usr/bin/sudo
执行以下命令添加规则(需root权限):
auditctl -a always,exit -F path=/usr/bin/sudo -F perm=x -k sudo_exec
auditctl -a always,exit -F path=/usr/bin/sudo -F perm=r -k sudo_read
auditctl -a always,exit -F arch=b64 -S execve -F exe=/usr/bin/sudo -k sudo_execve
auditctl -a always,exit -F arch=b64 -S mmap -F path=/usr/bin/sudo -k sudo_mmap
说明:-k sudo_exec等标签便于后续用ausearch -k sudo_exec快速检索;arch=b64适配x86_64系统,若为32位系统改用b32。
持久化规则,避免重启失效
auditctl添加的规则在系统重启后丢失。需写入规则文件:
- 编辑
/etc/audit/rules.d/sudo.rules(新建文件) - 填入与上面
auditctl命令等效的规则行(去掉auditctl -a,保留其余部分) - 例如:
-a always,exit -F path=/usr/bin/sudo -F perm=x -k sudo_exec
保存后运行augenrules --load重载规则(部分系统需先systemctl restart auditd)。
验证与排查常见问题
规则生效后,可通过以下方式确认:
- 执行
sudo ls,再运行ausearch -k sudo_execve | head -5查看是否捕获到execve事件 - 检查
ausearch -m execve -i | grep sudo是否显示完整命令行参数(含用户、终端、cwd等) - 若无日志,检查
auditd是否运行:systemctl status auditd - 确认SELinux未阻止audit:临时设为permissive模式测试(
setenforce 0),排除干扰
日志分析与归档建议
audit日志默认存于/var/log/audit/audit.log,体积增长快。建议:
- 启用日志轮转:编辑
/etc/audit/auditd.conf,设置max_log_file = 50(MB)、num_logs = 5 - 用
aureport --key sudo_execve --summary统计执行频次 - 导出结构化数据:
ausearch -k sudo_execve --raw | aureport -f -i --output stdout
注意:避免用-F uid!=0等条件过滤,否则会漏掉普通用户执行sudo的日志——这正是审计重点。











