Linux登录审计命令详解 last、lastb、lastlog、who、w 安全排查实战

在 Linux 系统安全运维中,登录审计是入侵检测与行为追溯的第一道防线。与应用程序日志不同,登录日志直接回答四个核心问题:谁在什么时间、从什么地方、通过什么方式进入了系统。Linux 系统通过一组专门的二进制日志文件记录登录事件,而 last、lastb、lastlog、who、w 这五个命令正是读取这些文件的标准工具。理解它们的区别、关联和实战用法,是每一位 Linux 系统工程师和安全审计人员的基本功。
一、命令详解
1. last :登录成功历史总览
(1)基本功能
last 命令读取 /var/log/wtmp,这是系统最重要的登录历史数据库,记录每一次成功的用户登录、注销以及系统重启事件。
(2)基础用法
last # 查看所有成功登录记录(按时间倒序) last root # 查看指定用户的登录历史 last alice last -n 20 # 查看最近 20 条记录 last reboot # 查看系统重启历史 last pts/0 # 查看指定终端的登录 last -f /var/log/wtmp # 显式指定 wtmp 文件(用于分析归档日志)
(3)输出解读如下截图:

- 第一列:用户名(reboot 表示系统重启)
- 第二列:终端(tty = 物理控制台,pts = SSH/远程终端)
- 第三列:来源 IP 或主机名
- 第四~七列:登录时间段
duration:会话持续时间(still logged in 表示会话仍活跃)
(4)实战场景:发现异常登录
# 场景:排查周末是否有非授权登录
last | grep -E "Sat|Sun"
# 场景:查找非工作时间登录(22:00 - 06:00)
last | awk '$6 ~ /2[2-3]:|0[0-5]:/'
# 场景:统计各来源 IP 的登录频次
last | awk '{print $3}' | sort | uniq -c | sort -rn | head -20
# 场景:查找 root 账户的远程登录(root 不应直接 SSH)
last root | grep -v "0.0.0.0"
安全提示:wtmp 文件为二进制格式,不可直接用 cat 或 vim 查看,必须使用 last 或 utmpdump 解析。
2. lastb :失败登录记录
(1)基本功能
lastb读取/var/log/btmp,记录所有认证失败的登录尝试。这是发现暴力破解、密码扫描、账户枚举攻击的关键数据源。
(2)基础用法
lastb # 显示所有失败登录尝试 lastb username # 显示指定用户的失败记录 lastb -f /var/log/btmp # 分析归档的 btmp 文件 lastb | wc -l # 统计失败尝试总次数
(3)输出解读

ssh:notty表示通过 SSH 连接但未分配终端(通常是自动化工具或暴力破解脚本)- 持续时间通常为 00:00,因为认证失败后连接立即断开
(4)实战场景:识别暴力破解
# 场景:找出攻击最频繁的来源 IP
lastb | awk '{print $3}' | sort | uniq -c | sort -rn | head -10
# 场景:查看被尝试最多的用户名(账户枚举)
lastb | awk '{print $1}' | sort | uniq -c | sort -rn | head -10

权限说明:/var/log/btmp 默认权限为 0600(仅 root 可读),防止攻击者读取后针对性规避。-rw——- 1 root utmp 2543616 8 月 3 09:43 /var/log/btmp
3. lastlog :全账户最后登录”快照”
(1)基本功能
lastlog读取/var/log/lastlog,为系统中每一个 UID(包括系统账户和从未登录的账户)提供最近一次登录的快照。这是发现”僵尸账户”和”异常活跃服务账户”的利器。
(2)基础用法
lastlog # 显示所有用户的最后登录信息 lastlog -u username # 显示指定用户 lastlog -b 7 # 显示最近 7 天内未登录的用户 lastlog -t 3 # 显示最近 3 天内登录过的用户
(3)输出解读
sshd **从未登录过** avahi **从未登录过** postfix **从未登录过** ntp **从未登录过** tcpdump **从未登录过** bjkb :0 五 5 月 31 20:10:14 +0800 2024
(4)实战场景:账户安全基线检查
# 场景:检查是否有服务账户被用于交互式登录 # www-data、mysql、nginx 等服务账户不应有登录记录 lastlog | grep -E "www-data|mysql|nginx|postgres" | grep -v "Never" # 场景:找出长期未登录的用户(超过 90 天) lastlog -b 90 | grep -v "Username" | grep -v "Never"
4. who :当前在线用户清单
(1)基本功能
who读取/var/run/utmp(有的可能在/var/log/utmp),显示当前正在系统中的所有活跃会话。这是实时安全监控的基础工具。
(2)基础用法
who # 标准输出 who -a # 显示所有信息(包括空闲进程) who -b # 显示上次系统启动时间 who -r # 显示当前运行级别 who am i # 显示当前终端的登录信息
(3)输出解读
alice pts/0 2026-08-03 08:30 (192.168.1.100) bob pts/1 2026-08-03 07:15 (10.0.0.50)
(4)实战场景:实时会话监控
# 场景:检查是否有异常来源 IP 的在线会话
who | awk '{print $5}' | tr -d '()' | sort | uniq -c
# 场景:检查是否有 root 直接登录(应禁止 root 远程登录)
who | grep "^root"

5. w :在线用户及其活动详情
(1)基本功能
w是who的增强版,除显示在线用户外,还展示系统负载、空闲时间以及用户当前正在执行的命令。这是发现异常操作行为的直接手段。
(2)基础用法
w # 显示所有在线用户及其活动 w username # 仅显示指定用户
(3)输出解读
10:02:42 up 13 days, 20:08, 1 user, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.129.12.30 08:35 2.00s 0.64s 0.00s w
- 第一行:系统时间、运行时长、在线用户数、1/5/15 分钟平均负载
IDLE:用户空闲时长(0.00s 表示正在活跃操作)WHAT:当前正在执行的命令
二、底层日志文件
1. 文件关联关系图

2. 文件特性对比
| 文件 | 路径 | 格式 | 持久性 | 默认权限 | 轮转策略 |
|---|---|---|---|---|---|
| utmp | /var/run/utmp | 二进制 | 非持久(重启清空) | 0664 | 不轮转 |
| wtmp | /var/log/wtmp | 二进制 | 持久 | 0644 | logrotate 按月/按大小 |
| btmp | /var/log/btmp | 二进制 | 持久 | 0600 | logrotate 按月/按大小 |
| lastlog | /var/log/lastlog | 二进制 | 持久 | 0644 | 不轮转(固定大小) |
3. 为什么不能直接 cat 这些文件?
这四个文件均为结构化二进制格式,包含固定长度的 C 结构体(struct utmp),直接 cat 会输出乱码且可能破坏终端显示:
# 错误做法 cat /var/log/wtmp # 输出乱码,可能损坏终端 strings /var/log/wtmp # 只能看到部分字符串,丢失时间/IP 等关键信息 # 正确做法 last -f /var/log/wtmp # 使用专用工具解析 utmpdump /var/log/wtmp # 转储为可读文本
三、systemd 时代:journalctl 的统一审计
对于使用 systemd 的系统(RHEL 7+、Ubuntu 16.04+、Debian 8+),journalctl 提供了跨命令的统一查询能力:
# 查看 SSH 守护进程的所有日志 journalctl _COMM=sshd # 查看成功登录 journalctl _COMM=sshd | grep "Accepted" # 查看特定时间窗口 journalctl --since "2026-08-01 00:00:00" --until "2026-08-03 23:59:59" _COMM=sshd # 查看特定用户的登录会话 journalctl _UID=1000 # 查看 systemd-logind 管理的会话事件 journalctl -u systemd-logind # 实时跟踪认证日志 journalctl -f _COMM=sshd
四、实战:构建登录审计检查脚本
以下是一个可直接用于生产环境的巡检脚本:
#!/bin/bash
# login_audit.sh - Linux 登录审计巡检脚本
# 建议通过 cron 每日执行:0 9 * * * /usr/local/bin/login_audit.sh
LOG_FILE="/var/log/login_audit_$(date +%Y%m%d).log"
ALERT_THRESHOLD=10 # 失败登录告警阈值
exec > >(tee -a "$LOG_FILE")
exec 2>&1
echo "========================================"
echo "登录审计报告 - $(date)"
echo "========================================"
echo -e "\n[1] 当前在线用户"
w
echo -e "\n[2] 最近 24 小时成功登录 (Top 10)"
last -s yesterday | head -10
echo -e "\n[3] 最近 24 小时失败登录统计"
FAIL_COUNT=$(lastb -s yesterday | wc -l)
echo "失败登录总次数: $FAIL_COUNT"
if [ "$FAIL_COUNT" -gt "$ALERT_THRESHOLD" ]; then
echo "⚠️ ALERT: 失败登录次数超过阈值 ($ALERT_THRESHOLD)"
fi
echo -e "\n[4] 失败登录 Top 来源 IP"
lastb -s yesterday | awk '{print $3}' | sort | uniq -c | sort -rn | head -5
echo -e "\n[5] 服务账户登录检查(高风险)"
for user in www-data mysql nginx postgres; do
if lastlog -u "$user" 2>/dev/null | grep -qv "Never"; then
echo "⚠️ ALERT: 服务账户 $user 有登录记录!"
lastlog -u "$user"
fi
done
echo -e "\n[6] root 远程登录检查"
last root | grep -v "0.0.0.0\|localhost\|console" | head -5
echo -e "\n[7] 从未登录但存在密码的账户"
lastlog | grep "Never logged in" | awk '{print $1}' | while read user; do
if grep -q "^$user:" /etc/shadow 2>/dev/null; then
hash=$(grep "^$user:" /etc/shadow | cut -d: -f2)
if [ -n "$hash" ] && [ "$hash" != "*" ] && [ "$hash" != "!" ]; then
echo "⚠️ $user: 有密码哈希但从未登录"
fi
fi
done
echo -e "\n[8] 非工作时间登录检查 (22:00-06:00)"
last | awk '$6 ~ /2[2-3]:|0[0-5]:/' | head -10
echo -e "\n========================================"
echo "报告完成: $LOG_FILE"
echo "========================================"
五、总结
| 命令 | 核心功能 | 读取文件 | 时间维度 | 典型场景 |
|---|---|---|---|---|
| last | 成功登录/注销/重启历史 | /var/log/wtmp | 历史记录 | 排查异常登录时段(追溯”谁进来过”) |
| lastb | 失败登录尝试 | /var/log/btmp | 历史记录 | 发现暴力破解攻击(发现”谁在撞门”) |
| lastlog | 所有用户最近一次登录 | /var/log/lastlog | 快照 | 识别僵尸账户/异常账户(检查”谁该来没来”) |
| who | 当前在线用户列表 | /var/run/utmp | 实时 | 检查当前活跃会话(确认”谁还在线”) |
| w | 在线用户+正在执行的命令 | /var/run/utmp + /proc | 实时 | 发现异常操作行为(监控”谁在干什么”) |
这五个命令与四个二进制日志文件构成了 Linux 登录审计的完整闭环。掌握它们的区别与联动,配合 auth.log/secure文本日志和journalctl,即可构建从实时监控到历史追溯、从成功审计到失败告警的全方位登录安全体系。
以上关于Linux登录审计命令详解 last、lastb、lastlog、who、w 安全排查实战的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » Linux登录审计命令详解 last、lastb、lastlog、who、w 安全排查实战
微信
支付宝