关键在于还原上下文、判断意图、触发响应,需通过强制结构化日志、多维行为分析、实时拦截链路及auditd补全实现秒级风控。
要通过审计 sudo 操作轨迹识别并拦截内部人员非法特权行为,关键不是“看到命令”,而是“还原上下文、判断意图、触发响应”。内部人员拥有合法账号和基础权限,其异常往往藏在高频、偏时、越界、绕过四类行为中——日志必须能支撑这四类判断,且响应机制需在秒级介入。
默认日志(如 /var/log/auth.log)只记“谁执行了 sudo”,无法区分是运维巡检还是横向渗透。必须强制启用结构化字段:
Defaults logfile="/var/log/sudo.log", log_input, log_output, tty_tickets, requiretty;用 visudo 保存,避免语法错误导致 sudo 失效/var/log/sudo-io/ 下生成带时间戳的会话目录(如 20260618-012245-0001),内含 stdin、stdout、stderr 和 exit_code 文件,可用 sudo sudoreplay 20260618-012245-0001 完整回放PWD=(操作路径)、TTY=(终端类型)、USER=(目标身份)、RUNAS=(实际切换用户)、COMMAND=(完整命令含参数),避免被截断——检查是否误设 stricthostname 或 noexec
单纯查“谁用了 sudo”没意义。需结合时间、频率、命令、路径、终端等多维交叉分析:
/usr/bin/systemctl restart nginx(非发布窗口)、工作日 23:59 批量 usermod -aG docker —— 用 awk '$3 > "23" || $3 快速筛查
/bin/bash、测试账号调用 /usr/bin/python3 -c "import os;os.system('sh')" —— 重点监控含 sh、exec、system(、!(vim/less)、-c 的命令行pts/0 执行 sudo -i 后,在 pts/1 连续执行 cat /etc/shadow —— tty_tickets 可隔离会话,requiretty 可阻断 cron 或脚本提权awk '{print $1,$2,$3,$NF}' /var/log/sudo.log | sort | uniq -c | sort -nr | head -10 统计高频组合日志写入 ≠ 风险阻断。需将审计结果转化为动作:
/var/log/sudo.log 实时转发至 SIEM(如 ELK、Graylog),设置规则:匹配 COMMAND=.*[;&|`$()|python.*-c|sh] 立即标红并通知值班群/bin/bash、/usr/bin/vim、/usr/bin/find.*-exec),在 /etc/sudoers 中显式禁用:Defaults:/bin/bash !NOEXEC + %devgroup ALL=(root) !/bin/bash,让 sudo 直接拒绝而非仅记录/var/log/sudo.log 文件变化,一旦检测到匹配关键词的新行,立刻执行脚本:记录源 IP(从 who -u 或 last -n 1 关联)、临时锁定该用户 passwd -l username、发邮件给安全组NOPASSWD 规则未绑定具体命令或未启用 NOEXEC —— 免密不等于免审,宽泛授权等于开放后门sudo 日志管不住子进程行为。例如用户 sudo su 后执行 cat /etc/shadow,sudo 日志只记 “su”,不记 “cat”。需叠加:
-w /etc/shadow -p r -k unauthorized_shadow_read,用 ausearch -k unauthorized_shadow_read -i 查真实读取者(看 auid= 原始用户,非 uid=)find / -xdev -type f -perm -4000 2>/dev/null 定期扫描 SUID 文件,发现非系统路径下的 /tmp/malware,说明已有提权落地/var/log/sudo.log 设置不可删除保护:chattr +a /var/log/sudo.log(允许追加),轮转旧日志后加 +i(不可修改)