auditd不能直接用-w监控/proc/sys路径,因proc是虚拟文件系统;需用-a规则匹配write/writev/pwrite64系统调用并加-F path=/proc/sys/前缀捕获写操作,配合-k标记便于日志检索。

auditd 可以监控对 /proc/sys 下内核参数文件的写操作,但不能直接用 -w /proc/sys 这种路径监控——因为 /proc 是虚拟文件系统,auditd 的 -w(watch)规则只支持真实文件系统上的路径,对 proc、sysfs、devtmpfs 等不生效。
必须用系统调用级规则捕获 write/writev/pwrite64 等行为
要记录谁修改了 /proc/sys/net/ipv4/ip_forward 或 /proc/sys/kernel/sysrq 这类参数,需监听进程向这些路径发起的写系统调用。核心思路是:匹配目标文件路径 + 写操作类型 + 成功结果。
- 在
/etc/audit/rules.d/proc-sys.rules中添加:
-a always,exit -F arch=b64 -S write,writev,pwrite64 -F path=/proc/sys/ -F perm=w -k proc_sys_write -a always,exit -F arch=b32 -S write,writev,pwrite64 -F path=/proc/sys/ -F perm=w -k proc_sys_write
-
-F path=/proc/sys/是关键:auditd 对 proc 文件系统支持路径前缀匹配(不是完整路径),只要写入路径以该字符串开头即触发 -
-F perm=w表示仅捕获有写权限的操作(避免读取干扰) - 同时加 b64 和 b32 规则,覆盖混合架构环境
- 加载规则:
sudo augenrules --load
日志里能拿到什么信息?
成功触发后,ausearch -k proc_sys_write -i 会显示类似内容:
-
comm="sysctl"或comm="bash":执行命令的程序名 -
exe="/usr/bin/sysctl":完整可执行路径 -
cwd="/root":当前工作目录 -
path="/proc/sys/net/ipv4/ip_forward":被写的实际参数路径(出现在 PATH 类型事件中) -
uid=0 auid=1001:真实用户(auid 更可靠,代表登录会话初始 UID) -
res=success:是否写入成功
注意:不会记录写入的具体值(比如把 0 改成 1),auditd 不解析写入内容,只记录“谁、何时、对哪个路径、执行了写操作”。
补充建议:结合 sysctl 命令本身做增强
单纯依赖 write 系统调用可能漏掉某些间接修改(如通过 shell 重定向:echo 1 > /proc/sys/net/ipv4/ip_forward 会被捕获,但某些内核模块或驱动绕过 VFS 的写法可能不触发)。更稳妥的做法是:
- 额外监控
sysctl命令执行:-a always,exit -F path=/usr/bin/sysctl -F perm=x -k sysctl_exec - 对关键参数启用
sysctl -w日志:在/etc/sysctl.conf中设置kernel.sysrq = 0后,配合systemd-sysctl服务启动日志(查journalctl -u systemd-sysctl) - 检查是否启用
CONFIG_SECURITY_WRITABLE_PROC内核配置(部分加固内核会限制非 root 写 proc,此时 audit 日志中失败事件也会有价值)
验证与排查常见问题
如果没看到日志,按顺序检查:
- 确认
auditd正在运行:systemctl status auditd - 确认规则已加载:
sudo auditctl -l | grep proc_sys_write - 手动测试:
sudo sysctl -w kernel.sysrq=1,再执行sudo ausearch -k proc_sys_write -ts recent -i - 若仍无输出,检查内核是否禁用了 proc 写审计:
cat /proc/sys/kernel/audit_backlog_limit应 ≥ 8192;cat /proc/sys/kernel/audit_enabled应为 1











