应通过auditd监控setuid、setgid等系统调用及execve执行特权程序行为,覆盖b64/b32架构,利用auid实现登录会话溯源,并结合ausearch/aureport验证与告警。

要记录所有用户ID变更行为(如 su、sudo、setuid 程序执行、UID/GID 切换等),核心是捕获触发身份变化的关键系统调用,而非仅监控配置文件。auditd 本身不直接“记录用户登录”或“记录 su 命令”,而是通过内核级系统调用(如 setuid、setgid、execve、setreuid、setregid)来感知权限提升动作。重点在于规则粒度够细、架构适配正确、日志可追溯。
监控关键系统调用与 execve 行为
用户身份提权往往通过执行特权程序(如 /usr/bin/sudo、/bin/su、/usr/bin/passwd)完成,这些操作最终都触发 execve 系统调用,并可能伴随 setuid/setgid 调用。必须同时覆盖 64 位和 32 位架构(即使纯 64 位系统也可能运行兼容层程序):
- 在
/etc/audit/rules.d/id-change.rules中添加以下规则:
-a always,exit -F arch=b64 -S setuid -S setgid -S setreuid -S setregid -S setresuid -S setresgid -k id_change-a always,exit -F arch=b64 -S execve -F path=/usr/bin/sudo -k sudo_exec-a always,exit -F arch=b64 -S execve -F path=/bin/su -k su_exec-a always,exit -F arch=b32 -S setuid -S setgid -S setreuid -S setregid -S setresuid -S setresgid -k id_change-a always,exit -F arch=b32 -S execve -F path=/usr/bin/sudo -k sudo_exec-a always,exit -F arch=b32 -S execve -F path=/bin/su -k su_exec
注意:-F path= 必须指向真实二进制路径(可用 readlink -f /usr/bin/sudo 验证),且该路径需存在;符号链接终点若不存在,规则将静默失效。
关联审计用户ID(auid)与原始登录会话
真正区分“谁发起的提权”依赖 auid(Audit UID) —— 它在用户首次登录时就固定,不会随 su/sudo 改变。这是审计溯源的黄金字段:
- 所有上述规则已默认记录 auid;无需额外加
-F auid!=4294967295(即排除未登录会话),除非你明确要过滤 cron 或 systemd 启动的服务进程; - 检查日志是否含 auid:运行
ausearch -m SYSCALL -ts recent | head -5,确认输出中包含auid=1000或类似字段; - 若 auid 恒为 4294967295(表示 unset),说明用户未通过 login/pam_loginuid 认证登录(如直接 ssh root@host 或某些容器环境),需检查 PAM 配置是否加载
pam_loginuid.so。
验证与实时排查提权行为
规则加载后,立即测试并确认日志生成:
- 执行重载:
sudo augenrules --load && sudo systemctl restart auditd(RHEL/CentOS 8+)或sudo service auditd reload(CentOS 7); - 手动触发一次提权:
sudo -i或su -; - 立刻搜索:
sudo ausearch -k id_change -k sudo_exec -k su_exec -i | grep -E "(auid|uid|exe|comm)"; - 典型输出应包含:
auid=1001 uid=0 exe="/usr/bin/sudo" comm="sudo"—— 这表示用户 1001 以 root 权限执行了 sudo。
增强可读性与告警能力
原始日志字段多、不易读。建议结合 aureport 生成结构化摘要,并设置定期检查:
- 查看最近 1 小时所有提权相关事件:
sudo aureport -m -ts recent -i --key id_change,sudo_exec,su_exec; - 导出为 CSV 便于分析:
sudo aureport -m -ts today -i --key id_change --format csv > /tmp/id_change_today.csv; - 简单告警脚本思路:用
ausearch -k id_change -ts 10min ago | wc -l统计 10 分钟内提权次数,若 > 3 则发邮件或写入 syslog。











