last 三件套是什么
Linux 用三个数据文件记录登录活动:wtmp 记录成功登录与关机重启,btmp 记录失败登录,lastlog 按用户记录最近一次登录。前两个由 login、sshd、PAM 在会话建立与结束时写入,lastlog 则是按 UID 索引的稀疏文件。三者合起来能回答应急中最关键的问题:谁、在什么时候、从哪个 IP 进来了。攻击者如果要掩盖行踪,通常绕不开清理这几个文件。
基本信息
| 成功登录记录 | /var/log/wtmp,读取命令 last |
|---|---|
| 失败登录记录 | /var/log/btmp,读取命令 lastb,需要 root 权限 |
| 账号最近登录 | /var/log/lastlog,读取命令 lastlog,可按 -u 单查 |
| 常用参数 | last -aiF:-a 主机名后置、-i 显示 IP、-F 完整时间戳 |
| 扩展参数 | last -f 指定文件、-x 显示关机与运行级变化、-n 限制行数 |
| 数据来源 | PAM(pam_lastlog、pam_unix)与 login/sshd,容器内通常不记录 |
典型使用场景
- 确认告警时间点前后有哪些登录会话,缩小入侵时间窗
- 判断某个可疑账号是否真的被登录使用过,而不是只被创建
- 列出爆破来源 IP,为边界封禁提供依据
- 核对服务器异常重启记录,区分是运维操作还是攻击者重启
- 与 auth.log 交叉验证,确认日志是否被人为清理或篡改
三个维度一起看
三个维度一起看
last -aiF | head -n 30 # 成功登录,含来源 IP 与完整时间
lastb -aiF | head -n 30 # 失败登录,需 root
lastlog | grep -v 'Never logged in' | head -n 30 # 每个账号最近一次登录
last -x | head -n 20 # 关机、重启与运行级变化
last -aiF -f /var/log/wtmp.1 | head -n 20 # 轮转后的历史文件也要看
ls -l --time-style=full-iso /var/log/wtmp /var/log/btmp /var/log/lastlog # 先记录文件属性输出逐列读法
| 列 | 含义 | 异常信号 |
|---|---|---|
| 用户名 | 登录使用的账号 | root 直接登录且来源陌生,或业务账号出现交互式会话 |
| 终端 | tty 表示本地终端,pts/N 表示远程会话 | console 与 tty 记录代表有人接触过物理或虚拟控制台 |
| 来源 | 来源主机名或 IP | 地址集中在少数几个境外 IP,配合 -i 可避免 DNS 解析误差 |
| 登录时间 | 会话建立时间 | 与告警时间、文件落地时间重合 |
| 登出与时长 | 会话结束时间与持续时间,未结束会显示仍在登录 | 会话在告警时刻仍在,说明攻击者可能在线 |
| reboot 行 | 关机与重启记录 | 出现计划外的重启,需与变更记录核对 |
记录可被清理:攻击者常用工具把 wtmp 中的指定行抹掉,或直接清空文件。判断依据是文件大小异常(远小于正常水平)、mtime 与 last 输出不符、以及 last 为空但 auth.log 里有成功登录。发现这种情况要立即用备份文件与日志平台补齐时间线。
时间窗口有限:wtmp 与 btmp 会被 logrotate 轮转,btmp 在爆破频繁的机器上增长极快,历史往往只保留几周甚至几天。要长期留存就把这些文件纳入日志归档,而不是事后从主机上找。
留证与交叉验证
留证与交叉验证
sudo cp -a /var/log/wtmp /var/log/btmp /var/log/lastlog /evidence/login_logs/
sudo sha256sum /evidence/login_logs/* | tee /evidence/login_logs.sha256
sudo grep -E 'Accepted|session opened' /var/log/auth.log | tail -n 30 # 与 auth 日志对齐
sudo who -a; w # 当前在线会话快照
getent passwd | awk -F: '$3>=1000 || $3==0 {print $1,$3,$7}' # 核对可登录账号与 shell容器与无 wtmp 的环境:精简镜像、容器内与部分云主机不写 wtmp,此时 last 为空属于正常现象,应以 auth.log、云平台登录审计与堡垒机日志为主要依据。
常见反取证迹象
- wtmp 或 btmp 文件大小为 0 或异常小,同目录却存在 .old、.bak 之类副本文件
- 文件 mtime 与最后一次真实登录时间明显不符,说明有人改过文件又想掩盖改动时间
- last 输出里没有任何记录,但 auth.log 中明明存在 Accepted 行,两者互相矛盾
- wtmp 变成指向 /dev/null 的软链接,登录记录被静默丢弃,看上去像从未有人登录
- btmp 属主或权限被改成 root 之外的账号,导致 lastb 读不出内容
- 日志轮转配置被人为改成更短的保留周期,加速历史痕迹消失
判断顺序建议固定:先记录三个文件的大小、权限、mtime 与 sha256,再看内容,最后与 auth.log、日志平台对照。先记录属性再读内容,是因为后续操作可能会改变文件的访问时间,而属性本身就是判据。
多源交叉核对
多源交叉核对
sudo stat -c '%n size=%s mtime=%y owner=%U:%G mode=%a' /var/log/wtmp /var/log/btmp /var/log/lastlog # 一次记录关键属性
sudo ls -l /var/log/wtmp* /var/log/btmp* # 看有无软链接与轮转副本
sudo grep -c 'Accepted' /var/log/auth.log 2>/dev/null; sudo last -n 5 | wc -l # 两边数量悬殊要警觉
sudo journalctl -u sshd --since '-7 days' | grep -i 'session opened' | tail -n 20 # 有 journald 时可独立取证