auditd 通过 action=exec 调用脚本实现违规发邮件,需配置带 -e action=exec 的规则并确保 mta 可用;推荐使用独立告警脚本,避免高频事件阻塞,测试时验证规则加载、事件触发及邮件送达。

配置审计规则并绑定告警动作
auditd 不支持直接在 -w 或 -a 规则里写“发邮件”,但可通过 audispd 插件 或 auditd 的 action=exec 选项 实现事件响应。推荐使用后者,更轻量、无需额外服务:
- 编辑 /etc/audit/rules.d/notify.rules(或直接写入 /etc/audit/audit.rules),添加带 exec 动作的规则。例如监控 /etc/shadow 被读取:
sudo auditctl -w /etc/shadow -p r -k shadow_access -E action=exec -F path=/usr/bin/mail
- 注意:-E action=exec 是 auditd 3.1+ 版本支持的特性,需确认内核和 auditd 版本(auditctl -V);旧版本需改用 audispd-plugins + audisp-remote 或自定义日志轮询脚本。
- 实际执行依赖系统已安装并配置好邮件传输代理(MTA),如 mailutils(Debian/Ubuntu)或 mailx(RHEL/CentOS)。
准备可用的邮件发送脚本
更可靠的做法是写一个独立脚本,由 auditd 在匹配事件时调用。例如:
- 创建脚本 /usr/local/bin/audit-alert.sh:
#!/bin/bash
echo "ALERT: $(date): $(ausearch -i -ts recent -k shadow_access | tail -n 5)" | mail -s "Audit Alert: Shadow Access Detected" admin@example.com
- 赋予可执行权限:sudo chmod +x /usr/local/bin/audit-alert.sh
- 在 audit.rules 中调用它:-w /etc/shadow -p r -k shadow_access -E action=exec -F path=/usr/local/bin/audit-alert.sh
- 确保脚本中使用的 ausearch 命令能快速定位最新匹配项(-ts recent 或指定时间范围),避免阻塞 auditd 主线程。
验证与调试要点
配置后务必测试端到端流程,避免“规则生效但邮件没发”:
- 重载规则:sudo augenrules --load && sudo systemctl restart auditd
- 手动触发测试事件:sudo cat /etc/shadow > /dev/null 2>&1
- 检查是否生成告警日志:sudo ausearch -k shadow_access -i
- 查看脚本是否被执行(可在脚本开头加 logger "alert script fired",然后查 journalctl -t kernel 或 /var/log/messages)
- 确认邮件是否送达:检查本地 MTA 队列(mailq)或日志(/var/log/mail.log)
补充建议:避免误报与性能影响
安全告警容易泛滥,需合理收敛:
- 不要对高频操作(如 openat、read)设 exec 动作,优先监控高危行为:execve(提权命令)、chmod/chown(权限篡改)、write to sensitive files(写关键配置)
- 限制脚本执行频率,例如在脚本中加入简单锁机制(touch /tmp/alert.lock && sleep 1 && rm /tmp/alert.lock),防止短时间重复告警刷屏
- 生产环境建议将告警接入集中日志平台(如 ELK、Graylog),再由平台统一做去重、分级和通知,而非每个事件都发邮件











