首页/安全/应急响应速查/登录历史 last 与 lastb 与 lastlog 三件套

登录历史 last 与 lastb 与 lastlog 三件套

三个维度看登录:last 看成功、lastb 看失败、lastlog 看每个账号最近一次。攻击者的登录时间与来源 IP 最先在这里暴露。

应急响应速查安全更新于 2026-10-13

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 时可独立取证

易错点

  • 只看 last 不看 lastb:爆破失败的试探全部在 btmp 里,漏看会误判为「没有异常」
  • 看到 wtmp 为空就放心:应先把文件大小与 mtime 记下来,再结合 auth.log 判断是否被清理
  • 忽略 -F 与 -i:不带完整时间戳容易看错年份,DNS 反解也可能把 IP 显示成主机名导致看错来源
  • 只看主机本地记录:轮转文件、日志平台与堡垒机日志才是完整证据,单机 wtmp 只覆盖有限窗口
  • 把 lastlog 当实时数据:它是每个账号的最后一次登录,不是全部历史,需要与 last 结合使用

数据来源与参考

  • last(1) 与 lastlog(8) 手册
  • utmpx(5) 文件格式

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌