应监控sshd派生子进程及提权动作,核心是通过auditd捕获auid和execve上下文,聚焦login→sshd子进程→可疑execve→UID变更全链路,结合auid溯源与高危路径过滤,实现精准告警。

直接监控 sshd 进程派生行为,核心不是盯住 sshd 本身,而是捕获它 fork 出的子进程及其后续提权动作——尤其是那些绕过常规日志、不走 sudo 或 su 的隐蔽路径。auditd 能在系统调用层锁定真实源头,关键靠 auid(原始登录用户)和 execve 上下文。
聚焦 sshd 派生链:从 login 到可疑子进程
sshd 启动后会为每个连接 fork 出子进程(如 sshd@pts/0),再 execve 启动 shell 或命令。攻击者常利用此过程注入恶意载荷或直接执行 SUID 工具。需捕获完整链条:
- 用
-a always,exit -F arch=b64 -S execve -F auid!=0 -k ssh_exec捕获所有非 root 用户通过 SSH 发起的命令执行(含bash、sh、python等) - 加一条
-a always,exit -F arch=b64 -S execve -F euid!=uid -k ssh_suid_exec,专门抓 ssh 会话中发生的 UID 变更(比如普通用户执行/usr/bin/find -exec /bin/sh \;) - 避免漏掉 32 位兼容场景:对 i386 系统补上
-F arch=b32对应规则
绑定真实登录上下文:auid 是溯源唯一锚点
仅看 uid=0 或 exe=/bin/bash 会丢失攻击者身份。auid 才是登录时确定的原始用户 ID,即使后续 sudo su - 或 ssh root@localhost,auid 仍保持不变:
- 所有上述规则默认记录 auid,无需额外加
-F auid!=4294967295(除非你明确要排除 cron 或容器内无登录会话) - 验证是否生效:
ausearch -m SYSCALL -ts recent | grep -E "(auid=|comm=sshd)",确认输出中 auid 值稳定且非 4294967295 - 若 auid 恒为 4294967295,检查 PAM 是否加载
pam_loginuid.so,否则 auditd 无法绑定登录会话
关联 ssh 登录事件与后续异常行为
单点 execve 日志价值有限,必须和登录动作串起来才能识别“刚登录就提权”这类高危模式:
- 启用基础登录审计:
auditctl -w /var/log/btmp -p wa -k login_fail(爆破尝试)、auditctl -w /var/log/lastlog -p wa -k login_record(成功登录) - 查某次可疑提权的完整链路:
ausearch -i -k ssh_suid_exec -ts 10:00:00 | aureport -f --start recent,再用aureport -x --start recent | grep -A5 -B5 "auid=1001"关联该 auid 下所有操作 - 重点关注组合特征:auid=1001 → login_record → ssh_exec → ssh_suid_exec → shadow_access,这种短时间密集行为基本可判定为入侵
过滤噪音,保留高价值信号
全量捕获 sshd 行为会导致日志爆炸,需前置过滤降低干扰:
- 排除合法管理行为:在规则中加
-F uid>=1000(跳过系统服务账户),或用-F key!=ssh_safe配合白名单脚本标记可信命令 - 不监控整个
/usr/bin/,而精准捕获高危目标:-F path=/usr/bin/find、-F path=/usr/bin/vim、-F path=/usr/bin/perl等常见 SUID/解释器滥用入口 - 永久规则写入
/etc/audit/rules.d/20-ssh-derived.rules,再运行augenrules --load加载,避免重启失效

















