最精准、开销最小的权限拒绝审计方式是用 -F exit=-EACCES 过滤系统调用退出时的 EACCES 错误码,支持全架构规则配置、永久生效设置、高效检索验证及噪声控制策略。

直接用 -F exit=-EACCES 过滤失败返回值,是最精准、开销最小的方式。Auditd 在系统调用退出时捕获返回码,-EACCES 表示“Permission denied”,无需解析日志文本或依赖服务层输出。
添加基于 exit 值的精确规则
在内核级拦截权限拒绝事件,需监听 exit 时机并匹配错误码:
- 对所有架构通用的写法(推荐):
-a always,exit -F arch=b64 -S all -F exit=-EACCES -k perm_denied_64
(覆盖 x86_64 下绝大多数系统调用) - 补充 32 位兼容(如容器或混合环境):
-a always,exit -F arch=b32 -S all -F exit=-EACCES -k perm_denied_32 - 若关注特定高风险操作,可限定系统调用,例如只审计 open/openat 类:
-a always,exit -F arch=b64 -S open,openat,openat2 -F exit=-EACCES -k file_open_denied
保存为永久规则并加载
规则须写入 /etc/audit/rules.d/ 下的 .rules 文件才能开机生效:
- 新建配置文件:
sudo tee /etc/audit/rules.d/perm-denied.rules -a always,exit -F arch=b64 -S all -F exit=-EACCES -k perm_denied<br>EOF
- 重新加载全部规则:
sudo augenrules --load - 验证是否生效:
sudo auditctl -l | grep perm_denied应能看到对应规则
高效检索与确认效果
权限拒绝事件量可能较大,建议按关键词和时间范围快速定位:
- 查最近 10 分钟内的所有 EACCES 事件:
sudo ausearch -m avc,syscalls -ts recent -k perm_denied | aureport -i -f - 只看具体路径和命令上下文(更清晰):
sudo ausearch -k perm_denied -i | grep -E "name=|comm=|exe=" - 手动触发测试(如普通用户尝试读取 root-only 文件):
cat /etc/shadow 2>/dev/null || echo "expected fail"
再执行上面的 ausearch 命令,应能立即捕获到对应记录
避免日志泛滥的实用建议
全量捕获 -EACCES 很有用,但生产环境需控制噪声:
- 不建议长期启用
-S all,可先用它摸排问题,再收敛到关键调用(如 open、execve、connect) - 排除已知低风险路径,例如临时忽略 /proc 下的常规拒绝:
-a always,exit -F arch=b64 -S open,openat -F exit=-EACCES -F path=/proc/ -F perm=x -F key=ignore-proc(配合 -k 单独归类) - 结合
auditd.conf中的max_log_file_action = rotate和num_logs = 10防止磁盘占满











