引言
在 Linux 系统安全管理中,了解“谁在何时登录过系统”是至关重要的审计需求。last、lastb、lastlog 这组命令提供了完整的用户登录历史追踪能力。本文将系统性地介绍这些命令的用法、数据来源和实际应用场景。
一、命令体系概览
这三个命令虽然名称相似,但功能各有侧重,分别关注登录历史的不同维度:
flowchart LR
subgraph Commands["登录审计命令家族"]
C1["last<br/>成功登录记录"]
C2["lastb<br/>失败登录记录"]
C3["lastlog<br/>最近登录记录"]
end
subgraph DataSources["数据源"]
S1["/var/log/wtmp<br/>二进制日志文件"]
S2["/var/log/btmp<br/>失败登录日志"]
S3["/var/log/lastlog<br/>最近登录缓存"]
end
subgraph UseCases["典型用途"]
U1["查看历史登录<br/>用户活动审计"]
U2["检测暴力破解<br/>安全威胁分析"]
U3["账户活跃度<br/>用户访问概览"]
end
C1 --> S1 --> U1
C2 --> S2 --> U2
C3 --> S3 --> U3
二、last:成功登录历史追踪
2.1 基本概念
last 命令用于显示用户的成功登录历史记录。它读取 /var/log/wtmp 二进制日志文件,记录所有登录(login)、登出(logout)、系统重启(reboot)和运行级别变更等事件。
2.2 基本用法
# 显示所有登录记录(包含系统重启事件)
last
# 显示指定用户的登录记录
last alice
# 显示指定终端的登录记录
last tty1
last pts/0
# 限制显示行数
last -n 15 # 显示最后15条记录
last -15 # 简写形式
# 显示完整时间戳(包含年份)
last -F
# 显示登录时长汇总(不显示详细记录)
last -s
# 反向显示(从最早的记录开始)
last -R
2.3 输出格式解析
$ last -5
alice pts/0 192.168.1.100 Tue Dec 15 14:30 still logged in
bob tty1 Tue Dec 15 10:15 - 12:30 (02:15)
root pts/1 10.0.0.50 Mon Dec 14 22:00 - 23:20 (01:20)
reboot system boot 5.10.0-amd64 Mon Dec 14 21:55 still running
alice pts/0 192.168.1.100 Mon Dec 14 09:30 - 17:45 (08:15)
wtmp begins Mon Dec 14 09:00:00 2025
输出字段说明:
| 字段 | 说明 |
|---|---|
| 用户名 | 登录使用的用户账户 |
| 终端类型 | pts/(伪终端)、tty(物理终端)、:0(图形界面) |
| 来源IP/主机名 | 远程登录的来源地址(本地登录显示为空或:0) |
| 登录时间 | 登录的日期和时间 |
| 登出时间 | 退出登录的时间(“still logged in”表示当前仍在线) |
| 登录时长 | 括号内显示本次登录的持续时长 |
2.4 特殊记录类型
last 输出中包含几种特殊记录类型:
# 系统重启记录
reboot system boot 5.10.0-amd64 Mon Dec 15 08:00 still running
# 运行级别变更(较老系统)
runlevel 5 Mon Dec 15 07:55 - 08:00 (00:05)
# 系统关闭记录
shutdown system down Mon Dec 15 07:50
2.5 常用选项汇总
| 选项 | 功能 |
|---|---|
-n N / -N |
显示最后 N 条记录 |
-F |
显示完整的日期时间格式(包含年份) |
-R |
不显示主机名(反向显示) |
-s |
仅显示登录时长汇总 |
-t YYYYMMDDHHMMSS |
显示指定时间之前的记录 |
-d |
将 IP 地址转换为主机名 |
-i |
显示 IP 地址而非主机名 |
-p |
显示最后指定的系统重启记录 |
-x |
显示更多系统关闭和运行级别变更信息 |
三、lastb:失败的登录尝试
3.1 基本概念
lastb 命令专门用于显示失败的登录尝试记录。它读取 /var/log/btmp 二进制日志文件,是检测暴力破解攻击和异常登录行为的重要工具。
3.2 基本用法
lastb 的语法与 last 基本相同:
# 显示所有失败登录记录
lastb
# 显示指定用户的失败登录
lastb alice
# 限制显示行数
lastb -20
# 显示完整时间戳
lastb -F
# 将 IP 地址解析为主机名
lastb -d
# 显示指定时间之前的失败记录
lastb -t 20251215120000
3.3 输出示例与解读
$ lastb -10
alice ssh:notty 192.168.1.200 Tue Dec 15 14:30 - 14:30 (00:00)
root ssh:notty 203.0.113.45 Tue Dec 15 14:28 - 14:28 (00:00)
alice ssh:notty 192.168.1.200 Tue Dec 15 14:25 - 14:25 (00:00)
bob ssh:notty 198.51.100.75 Tue Dec 15 14:20 - 14:20 (00:00)
root ssh:notty 203.0.113.45 Tue Dec 15 14:15 - 14:15 (00:00)
btmp begins Tue Dec 15 14:15:00 2025
关键观察点:
ssh:notty表示通过 SSH 尝试但没有分配伪终端- 登录时长为
(00:00)表示尝试立即失败 - 短时间内同一 IP 的多次失败尝试是暴力破解的典型特征
3.4 安全分析应用
# 统计失败登录次数最多的用户
lastb | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
# 统计失败登录来源 IP
lastb | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq -c | sort -rn | head -10
# 查看过去一小时的失败登录
lastb -t "$(date -d '1 hour ago' +%Y%m%d%H%M%S)"
# 查看特定 IP 的失败尝试
lastb | grep "203.0.113.45"
四、lastlog:用户最近登录信息
4.1 基本概念
lastlog 命令显示系统中每个用户的最近一次登录记录。它读取 /var/log/lastlog 文件,快速提供用户活跃度的概览。
4.2 基本用法
# 显示所有用户的最近登录信息
lastlog
# 显示指定用户
lastlog -u alice
# 显示最近 N 天登录过的用户
lastlog -b 7
# 显示从未登录过的用户(账户未活跃)
lastlog -u 0-999 # 配合其他命令使用
4.3 输出格式解析
$ lastlog
Username Port From Latest
root pts/1 10.0.0.50 Mon Dec 15 09:30:25 +0800 2025
alice pts/0 192.168.1.100 Sun Dec 14 15:20:10 +0800 2025
bob **Never logged in**
nobody **Never logged in**
www-data **Never logged in**
输出特点:
- 显示所有系统用户(包括系统账户)
**Never logged in**表示该用户从未登录过- 可用于识别未使用的账户和僵尸账户
4.4 常见应用场景
# 查看从未登录过的普通用户(UID >= 1000)
lastlog | grep "Never" | awk '$1 ~ /^[a-z]/ && $3=="Never"'
# 查看最近7天登录过的用户
lastlog -b 7
# 查看特定 UID 范围的用户
lastlog -u 1000-2000
五、三个命令的对比
5.1 功能对比
flowchart TD
subgraph last[last 命令]
L1[显示成功登录]
L2[显示登出时间]
L3[显示登录时长]
L4[显示系统重启]
end
subgraph lastb[lastb 命令]
B1[显示失败登录]
B2[检测攻击行为]
B3[来源 IP 追踪]
B4[无需用户验证]
end
subgraph lastlog[lastlog 命令]
LG1[显示最近一次登录]
LG2[覆盖所有账户]
LG3[识别未活跃账户]
LG4[快速概览]
end
Audit[系统登录审计] --> last
Audit --> lastb
Audit --> lastlog
5.2 详细对比表
| 特性 | last | lastb | lastlog |
|---|---|---|---|
| 数据源 | /var/log/wtmp |
/var/log/btmp |
/var/log/lastlog |
| 记录内容 | 成功登录、登出、重启 | 失败登录尝试 | 每个用户的最近一次登录 |
| 是否可清除 | 可被管理员清除 | 可被管理员清除 | 可被管理员清除 |
| 权限要求 | 通常无需 root | 通常需要 root | 通常无需 root |
| 历史深度 | 取决于日志轮转 | 取决于日志轮转 | 每个用户仅保留最后一条 |
| 典型用途 | 用户活动审计 | 安全入侵检测 | 账户活跃度盘点 |
| 支持远程IP | 是 | 是 | 是 |
六、日志管理与维护
6.1 日志文件位置与权限
# 查看日志文件信息
ls -la /var/log/wtmp /var/log/btmp /var/log/lastlog
-rw-rw-r-- 1 root utmp 28544 Dec 15 14:30 /var/log/wtmp
-rw-r--r-- 1 root root 8208 Dec 15 14:30 /var/log/btmp
-rw-r--r-- 1 root root 292292 Dec 15 14:30 /var/log/lastlog
文件说明:
wtmp:属于utmp组,可读性有限btmp:仅 root 可读写(敏感信息安全)lastlog:root 拥有,普通用户可读
6.2 日志轮转配置
通常通过 logrotate 进行管理:
# /etc/logrotate.d/btmp
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 12
}
# /etc/logrotate.d/wtmp
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 12
}
6.3 清除与维护
# 清除所有日志(需要谨慎)
sudo > /var/log/wtmp
sudo > /var/log/btmp
# 保留文件结构但清空内容
sudo echo "" > /var/log/wtmp
# 查看日志文件大小
sudo du -sh /var/log/wtmp /var/log/btmp /var/log/lastlog
七、实用脚本示例
7.1 登录审计脚本
#!/bin/bash
# 检测可疑登录活动
echo "=== 近期异常登录报告 ==="
echo
# 1. 最近24小时的成功登录
echo "最近24小时成功登录:"
last -n 50 | grep -E "$(date -d '24 hours ago' +'%a %b %d')|$(date +'%a %b %d')"
echo
# 2. 失败登录最多的用户
echo "失败登录尝试统计(按用户):"
lastb | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
echo
# 3. 来自非内网IP的失败登录
echo "来自外部IP的失败登录:"
lastb | grep -vE "(192\.168\.|10\.|172\.16\.)" | head -20
echo
# 4. 从未登录过的用户
echo "从未登录过的普通用户:"
lastlog | grep "Never" | grep -E "UID [0-9]+" | head -20
7.2 暴力破解检测脚本
#!/bin/bash
# 检测暴力破解尝试
THRESHOLD=10
FAILED_IPS=$(lastb | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq -c | sort -rn)
while read count ip; do
if [ "$count" -gt "$THRESHOLD" ]; then
echo "警告:IP $ip 在短时间内有 $count 次失败登录"
# 可选:自动添加到防火墙黑名单
# sudo iptables -A INPUT -s $ip -j DROP
fi
done <<< "$FAILED_IPS"
八、相关扩展命令
8.1 who——当前登录用户
who 命令显示当前登录系统的用户信息,比 last 更实时。
# 显示当前登录用户
who
# 显示更多详细信息
who -a
# 显示登录时间和 idle 时间
who -u
8.2 w——当前用户活动详情
w 命令结合了 who 和 uptime 的功能,显示更多细节。
# 显示当前登录用户及其活动
w
# 不显示标题行
w -h
8.3 users——当前登录用户列表
users 是最简洁的方式,只显示用户名。
# 显示当前登录的用户名(可能有重复)
users
# 排序去重
users | tr ' ' '\n' | sort -u
九、安全最佳实践
9.1 定期审计建议
- 每周检查失败登录记录:监控
lastb输出,识别可疑模式 - 每月审核用户活跃度:使用
lastlog -b 30查看未登录用户 - 保留日志至少90天:配置合理的日志轮转策略
- 启用远程日志:使用
rsyslog将登录日志发送到安全服务器
9.2 常见威胁检测模式
| 威胁类型 | 检测方法 | 命令示例 |
|---|---|---|
| 暴力破解 | 同一IP大量失败登录 | lastb | awk '{print $3}' | sort | uniq -c | sort -rn |
| 账户遍历 | 尝试多个用户名 | lastb | awk '{print $1}' | sort | uniq -c | sort -rn |
| 异常时间登录 | 非工作时间登录 | last | grep -E "03:00|04:00" |
| 从未登录的账户 | 闲置账户 | lastlog | grep "Never" |
| 异地登录 | 非常规IP地理 | 配合 GeoIP 数据库分析 |
总结
last、lastb、lastlog 构成了 Linux 系统登录审计的完整工具链:
last:记录成功登录历史,是用户活动审计的核心工具lastb:捕捉失败登录尝试,是安全入侵检测的第一道防线lastlog:提供用户最近登录的快速概览,便于账户盘点
结合 who、w 等实时查看命令,系统管理员可以全面掌握用户登录动态,及时发现和响应潜在的安全威胁。在安全合规要求日益严格的今天,熟练使用这些命令是 Linux 系统管理的基础技能。
原文 https://blog.csdn.net/2301_79518550/article/details/156801422