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

AI 概述
本文详解Linux登录审计五大核心命令:last、lastb、lastlog、who、w,分别读取wtmp、btmp、lastlog、utmp二进制日志,用于追溯成功登录、暴力破解尝试、账户末次登录、实时在线会话与用户操作。文中说明二进制日志不可直接读取,补充systemd下journalctl审计用法,提供可直接部署的登录巡检脚本。组合使用这些工具,可搭建完整登录行为追溯、异常告警的安全审计体系。
目录
文章目录隐藏
  1. 一、命令详解
  2. 二、底层日志文件
  3. 三、systemd 时代:journalctl 的统一审计
  4. 四、实战:构建登录审计检查脚本
  5. 五、总结

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)输出解读如下截图:

Linux 登录审计五件套:last、lastb、lastlog、who、w 命令与 wtmp、btmp、utmp 日志文件实战

  • 第一列:用户名(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)输出解读

lastb :失败登录记录

  • 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"

who :当前在线用户清单

5. w :在线用户及其活动详情

(1)基本功能

wwho的增强版,除显示在线用户外,还展示系统负载、空闲时间以及用户当前正在执行的命令。这是发现异常操作行为的直接手段。

(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 安全排查实战的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

22

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » Linux登录审计命令详解 last、lastb、lastlog、who、w 安全排查实战

发表回复