// Linux · 2026-01-10

Linux 登录审计命令:last、lastb、lastlog 详解

引言

在 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 定期审计建议

  1. 每周检查失败登录记录:监控 lastb 输出,识别可疑模式
  2. 每月审核用户活跃度:使用 lastlog -b 30 查看未登录用户
  3. 保留日志至少90天:配置合理的日志轮转策略
  4. 启用远程日志:使用 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