auditd需通过捕获write和sysctl系统调用实现sysctl参数修改的实时审计与预警,核心规则为监控/proc/sys/路径的写操作并标记键值,配合定时脚本扫描日志触发告警。

要让 auditd 捕获所有对内核 sysctl 参数的实时修改行为并支持预警,关键不是监控文件本身(如 /proc/sys/ 下路径),而是捕获触发修改的系统调用——主要是 sysctl 系统调用(旧接口)和更常见的 write 系统调用(写入 /proc/sys/ 文件)。现代 Linux(包括 CentOS 8/RHEL 8+、Kylin V10)中,绝大多数 sysctl 修改实际走的是 write() 路径,因此必须覆盖该调用,并配合路径过滤与关键字标记,才能精准审计。
一、配置核心审计规则:捕获 write 和 sysctl 系统调用
在 /etc/audit/rules.d/sysctl.rules 中添加以下两条规则(注意文件名必须以 .rules 结尾):
-a always,exit -F arch=b64 -S write -F path=/proc/sys/ -F perm=w -k sysctl_write-a always,exit -F arch=b64 -S sysctl -k sysctl_call
说明:
-
-F path=/proc/sys/匹配所有写入/proc/sys/子路径的操作(如/proc/sys/net/ipv4/ip_forward); -
-F perm=w限定只记录写操作,避免读取干扰; -
-F arch=b64明确指定 64 位架构,确保规则生效(不加可能导致漏匹配); -
-k sysctl_write和-k sysctl_call是自定义键,用于后续快速筛选和告警触发。
二、加载规则并验证是否生效
执行以下命令使规则持久化并立即加载:
-
sudo augenrules --load(合并并重载所有.rules文件) -
sudo auditctl -l | grep -E "(sysctl_write|sysctl_call)"(确认规则已加载) -
sudo ausearch -k sysctl_write -ts recent | head -5(检查是否有初始日志,无则手动测试)
测试示例:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward > /dev/nullsudo sysctl -w kernel.randomize_va_space=0
再运行 ausearch -k sysctl_write -i,应能清晰看到 UID、进程名(comm)、可执行路径(exe)、写入内容(msg 字段中含实际值)等完整上下文。
三、构建轻量级预警机制
auditd 本身不提供主动告警,需结合脚本+日志轮询或 rsyslog 转发。推荐使用 ausearch 定时扫描 + 简单条件判断:
- 创建检查脚本
/usr/local/bin/check-sysctl-mod.sh:
LOG_ENTRY=$(ausearch -k sysctl_write -ts $(date -d '1 minute ago' +%H:%M:%S) 2>/dev/null | head -1)
if [ -n "$LOG_ENTRY" ]; then
echo "$(date): SYSCTL MODIFICATION DETECTED" | logger -t audit-alert
echo "$LOG_ENTRY" | logger -t audit-alert
fi
- 加入定时任务(每分钟执行一次):
说明:
- 使用
logger将告警写入/var/log/messages,便于集中收集或对接 Zabbix、Prometheus+Alertmanager; - 若需邮件通知,可在脚本中追加
echo "$LOG_ENTRY" | mail -s "SYSCTL Alert" admin@example.com; - 生产环境建议限制扫描窗口(如仅查最近 30 秒),避免重复触发。
四、排除常见失效原因
若始终无日志,请逐项排查:
-
systemctl status auditd必须为active (running);未启动则执行systemctl enable --now auditd; -
cat /proc/cmdline | grep audit=确认内核参数不含audit=0,否则服务被跳过; -
auditctl -s | grep enabled输出应为enabled 1;若为 0,检查/etc/audit/auditd.conf中enable = 1; - 规则文件保存后未执行
augenrules --load,仅改文件不生效; - 修改
/proc/sys/需 root 权限,普通用户操作不会触发 write 规则(符合预期)。










