sudo 日志行怎么读
sudo 成功提权后会写出一行结构固定的日志,例如 alice : TTY=pts/0 ; PWD=/home/alice ; USER=root ; COMMAND=/bin/bash,执行者、所在终端、当前目录、目标用户与目标程序一目了然,是还原“谁在哪个终端做了什么”的一手材料。它记录的是 sudo 启动的那个程序本身,程序内部再执行的子命令需要 auditd、shell 历史或 I/O 回放来补全。日志通常落在 /var/log/auth.log(Debian 系)或 /var/log/secure(RHEL 系),使用 journald 的系统要从 journal 里检索。
基本信息
| 适用平台 | 安装 sudo 的 Linux/Unix 发行版(RHEL/CentOS、Ubuntu/Debian 等) |
|---|---|
| 日志位置 | Debian 系 /var/log/auth.log;RHEL 系 /var/log/secure;journald 系统用 journalctl -t sudo |
| 典型字段 | TTY、PWD、USER(目标用户)、COMMAND(目标程序) |
| 失败记录 | authentication failure 与 incorrect password attempts 行 |
| 进阶数据 | 启用 I/O 日志后 /var/log/sudo-io 下有回放数据,可用 sudoreplay 查看 |
典型使用场景
- 还原攻击者提权后执行的第一条命令,定位落脚点与工具路径
- 区分人工操作与脚本操作:TTY 为 pts 通常是人,缺 TTY 或来自服务账号多为自动化
- 核查目标用户为 root 且命令是交互式 shell 的记录,这类记录经常是提权成功的直接证据
- 统计连续失败的提权尝试,判断是否存在口令爆破或权限摸索
- 把提权时刻与账号登录时段对照,识别“未登录却出现 sudo”的异常
检索与解析
检索与解析
# 近期全部 sudo 命令记录
grep 'COMMAND=' /var/log/auth.log | tail -20
# 只看提权为 root 且非 /usr/bin 下标准工具的命令
grep 'USER=root ; COMMAND=' /var/log/auth.log | grep -v 'COMMAND=/usr/bin/' | tail
# 提取执行者与命令两列,便于聚合统计
sed -n 's/.*\(sudo\[[0-9]*\]\): //p' /var/log/auth.log | awk -F' : ' '{print $1, $NF}'
# 失败与异常尝试
journalctl -t sudo --since '24 hours ago' | grep -Ei 'incorrect password|authentication failure|not in sudoers'
# 有 I/O 日志时按会话回放(需在 sudoers 中启用 log_input/log_output)
sudoreplay -l | head; sudoreplay <会话ID>日志字段读法
| 字段 | 含义 | 判读要点 |
|---|---|---|
| 执行者 | 发起 sudo 的账号 | 服务账号出现交互命令是重点线索 |
| TTY | 所在终端 | pts/0 等表示交互会话;无 TTY 说明来自脚本或服务 |
| PWD | 执行时的工作目录 | 位于临时目录或用户家目录时需结合命令判断 |
| USER | 目标用户 | USER=root 表示提权到 root |
| COMMAND | sudo 启动的程序 | 子命令需审计或回放补全,不能直接当作全部行为 |
sudo 与 su 会话可以嵌套:先用 su 切换账号再执行 sudo,日志里会同时出现两条记录,必须按时间顺序串联才看得出完整链路。
I/O 日志(回放文件)留存取决于配置与容量,攻击者也可能关闭相关选项;发现 sudoers 中 log_input/log_output 被改为关闭时,这本身就是值得记录的变更。