真正可用的方案是用 auditd 捕获 sudo 执行 + inotifywait 实时监听日志 + mail 通过 SMTP 推送结构化告警;需配置 audit 规则、inotifywait 脚本、SMTP 邮件客户端,并可扩展监控 su/pkexec/login 等提权行为。

Linux 系统中配置 sudo 执行时发送邮件告警,不能依赖 Defaults mail_badpass——它只在输错密码时写入本地 /var/mail/root,不发外网邮件、无结构化内容、不可被监控系统识别。真正可用的方案是:用 auditd 捕获真实 sudo 调用行为 + inotifywait 实时监听日志 + mail 命令通过 SMTP 推送结构化告警到运维邮箱。
启用 auditd 并监控 sudo 执行
auditd 是唯一能绕过 shell 层、精准捕获 /usr/bin/sudo 执行事件的内核级工具:
- 确认服务运行:
sudo systemctl is-active auditd,未运行则执行sudo systemctl enable --now auditd - 在
/etc/audit/rules.d/priv.rules中添加规则:-a always,exit -F path=/usr/bin/sudo -F perm=x -k sudo_exec - 重载规则:
sudo augenrules --load && sudo systemctl restart auditd - 验证记录:执行
sudo whoami后,运行ausearch -k sudo_exec -i | tail -1,应看到含用户、终端、命令参数的完整条目
部署实时日志解析与邮件触发
避免轮询延迟,用 inotifywait 监听审计日志变化,立即响应:
- 安装依赖:
sudo apt install inotify-tools -y(Ubuntu)或sudo yum install inotify-tools -y(CentOS) - 创建脚本
/usr/local/bin/sudo-alert.sh:#!/bin/bash<br>while inotifywait -e modify /var/log/audit/audit.log 2>/dev/null; do<br> if ausearch -k sudo_exec -ts recent -i | grep -q "uid=[0-9]\+"; then<br> EVENT=$(ausearch -k sudo_exec -ts recent -i | tail -1)<br> echo "$EVENT" | mail -s "[⚠️ 高危提权] $(hostname)" ops-manager@company.com<br> fi<br>done
- 赋予执行权限:
chmod +x /usr/local/bin/sudo-alert.sh
确保 SMTP 邮件通道可用
脚本能发信的前提是系统已配置可靠的外部 SMTP 发信能力:
- 安装邮件客户端:
sudo apt install mailutils -y(Debian/Ubuntu)或sudo yum install mailx -y(RHEL/CentOS) - 编辑
/etc/mail.rc,添加 QQ 邮箱示例配置:set from=alert@company.com<br>set smtp=smtps://smtp.qq.com:465<br>set smtp-auth-user=alert@company.com<br>set smtp-auth-password=your_app_password<br>set smtp-auth=login<br>set ssl-verify=ignore
- 测试连通性:
echo "测试" | mail -s "邮件连通性测试" admin@example.com,收到即成功
扩展覆盖其他提权行为
仅监控 sudo 不够全面,建议同步加入 su、pkexec、login 等关键路径:
- 在 audit 规则文件(如
/etc/audit/rules.d/root-alert.rules)中追加:-a always,exit -F path=/bin/su -F perm=x -k root_access<br>-a always,exit -F path=/usr/bin/pkexec -F perm=x -k root_access<br>-a always,exit -F path=/bin/login -F perm=x -k root_access
- 修改告警脚本中的
ausearch -k sudo_exec为ausearch -k root_access,统一捕获所有高危提权动作 - 可在邮件正文中提取源 IP:
echo "$EVENT" | awk -F'uid=' '{print $2}' | cut -d' ' -f1等方式增强上下文


















