广告位 · 页头(后台-模块管理-新建模块后替换此区域)

如何审计Debian系统上的用户登录历史?

Debian服务器的登录审计并不是简单的敲一条命令看个结果,它涉及二进制记录文件、系统认证日志以及内核级事件追踪三个层面。把这三个层面串起来,才能既看到谁在什么时候登录成功,又能还原失败尝试的来源和攻击模式。下面先从Debian最基础的登录数据文件讲起。

如何审计Debian系统上的用户登录历史?

一、Debian登录记录的核心数据文件

Debian将用户登录活动分散记录在几个文件中,理解它们的分工是做好审计的前提。第一个是/var/run/utmp,它保存当前正在登录的用户信息,who和w命令就是读取这个文件。该文件是动态的,用户退出后对应记录会被清除。第二个是/var/log/wtmp,它保存所有历史登录和注销事件,last命令默认读取的正是这个文件。由于wtmp以二进制格式存储,不能直接用cat查看。

第三个是/var/log/btmp,专门记录失败的登录尝试,lastb命令读取它。很多人在做审计时只关注成功的登录,实际上失败尝试往往更能暴露暴力破解行为。第四个是/var/log/lastlog,它记录每个账户最后一次成功登录的时间和来源,lastlog命令读取该文件。Debian默认会创建这几个文件,但如果误删或未安装相关包,可以通过touch /var/log/wtmp和touch /var/log/btmp手动重建,而lastlog文件通常由登录进程自动写入。需要注意的是,这些文件默认权限通常是640,只有root和adm组成员可读,这有助于防止普通用户篡改审计证据。

除了这些二进制记录,Debian的认证日志/var/log/auth.log也极其重要。该文件由rsyslog或systemd journal收集,记录sshd、sudo、su等服务的认证细节,包括登录来源IP、端口、用户名以及PAM模块输出。二进制文件提供时间线,auth.log则提供上下文,两者结合才能完成一次扎实的登录审计。

二、使用last、lastb和lastlog快速审计

last是Debian上最常用的登录历史查看命令,默认读取/var/log/wtmp。直接执行last会输出按时间倒序排列的登录记录,每一行包含用户名、终端、来源主机或IP、登录时间、退出时间以及会话持续时长。如果只想查看某个用户,可以执行last root。若想让IP地址以数字形式显示而不做反向DNS解析,加上-n参数可以避免卡顿,比如last -n 20显示最近20条记录。下面是一个典型输出示例。

root@debian:~# last -n 5
root     pts/0        192.168.10.25    Tue Mar 18 09:12   still logged in
root     pts/1        10.0.0.8         Tue Mar 18 08:47 - 09:03  (00:16)
deploy   pts/2        172.16.3.91      Mon Mar 17 22:31 - 22:45  (00:14)
reboot   system boot  5.10.0-0.deb10.16-amd64 Mon Mar 17 21:20   still running
root     tty1         -                Mon Mar 17 21:21 - down   (00:00)

输出里的still logged in表示该会话仍在进行,down表示系统已关机,而短横线表示信息不可用。如果看到来源终端tty1且没有IP,通常表示本地控制台登录。审计时需要特别关注来自公网IP的root登录,以及与自己业务无关的账户突然出现。

lastb专门用于查看失败登录尝试,数据来自/var/log/btmp。执行lastb时,输出格式与last类似,但每一行代表一次失败尝试的时间、用户、来源和失败原因(如果终端支持)。如果btmp文件不存在或为空,lastb会提示无法读取。另一个常用命令是lastlog,它列出系统所有账户的最后登录信息。可以执行lastlog -u root只查看root账户,或者lastlog -t 30筛选出最近30天内登录过的账户。有一个容易忽略的细节:lastlog基于lastlog文件,而该文件在用户从未登录时不会产生记录,因此某些系统账户虽然存在但从未出现在lastlog输出中。

三、深入auth.log分析SSH登录细节

last命令虽然简洁,但它只能看到登录成功的会话和失败尝试的基本记录,对于攻击者何时尝试了哪些用户名、使用何种认证方式,以及是否通过代理跳板,还需要从/var/log/auth.log中提取。Debian的SSH服务使用sshd前缀记录日志,成功登录会包含Accepted password for user from IP port 22 ssh2,失败则包含Failed password for invalid user user from IP port 22 ssh2。注意invalid user表示用户名在目标系统上不存在,这是典型的字典爆破特征。

可以使用grep配合awk快速统计失败登录的来源IP。下面这条命令从auth.log中提取所有失败尝试的IP并统计出现次数:

grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -n 10

这里awk打印的$(NF-3)对应于日志行中IP地址所在的字段位置,不同Debian版本或sshd配置可能导致字段偏移略有差异,实际使用时最好先grep一行确认。如果日志中IP字段不在倒数第四个位置,可以用grep -oE配合正则提取更稳定。例如使用扩展正则表达式直接抓取IP:

grep -oE 'from ([0-9]{1,3}\.){3}[0-9]{1,3}' /var/log/auth.log | awk '{print $2}' | sort | uniq -c | sort -nr

需要提醒的是,auth.log默认会被logrotate按周轮转,保留4周,这意味着一个月前的登录攻击可能已经不在当前文件中,应该去/var/log/auth.log.1这类轮转后的压缩文件中查看,使用zcat或zgrep处理。对于生产环境,建议至少保留6个月以上的认证日志,以便追溯长期潜伏的入侵行为。下面一小段配置展示了如何调整logrotate来延长保留时间。

/var/log/auth.log {
    weekly
    rotate 26
    compress
    delaycompress
    missingok
    notifempty
    create 640 root adm
}

该配置将认证日志保留26周,相当于半年。delaycompress可以避免日志刚轮转就被压缩导致某些程序读取异常。修改后可以执行logrotate -d /etc/logrotate.conf做一次调试检查。

四、加固审计:auditd与实时登录告警

仅仅依赖系统日志来审计登录,存在一个隐患:如果攻击者获得root权限,他完全有能力修改或删除wtmp、btmp和auth.log。要抵御这种威胁,可以在Debian上部署auditd,它是Linux内核级的审计框架,能够记录登录相关的系统调用和文件变更,日志存放在/var/log/audit/audit.log中,默认只有root可读,且攻击者很难在不触发告警的情况下清除。安装auditd后,可以添加规则监控wtmp和btmp文件的写入,例如:

auditctl -w /var/log/wtmp -p wa -k login_wtmp
auditctl -w /var/log/btmp -p wa -k login_btmp

这两条规则分别监控wtmp和btmp的写入与属性变更,-k参数指定审计键,便于后续用ausearch按关键字检索。例如要查看所有涉及login_wtmp键的审计事件,可以执行ausearch -k login_wtmp。除了文件监控,auditd还能记录pam_tty_audit启用的终端输入,但默认不会开启,需要手动配置PAM。对于大多数中小型Debian服务器,先做好文件监控和auth.log留存已经能覆盖大部分审计需求。

实时告警则可以让审计从被动查询变成主动防御。可以编写一个简单的systemd定时任务或cron脚本,每分钟比较两次登录记录的差异,一旦发现新登录就发送邮件或通知。下面是一个基于last命令输出的轻量示例脚本,它用bash保存上次快照并对比:

#!/bin/bash
SNAPSHOT_FILE="/var/tmp/last_snapshot"
LAST_LOG="/var/log/wtmp"
CURRENT=$(last -f "$LAST_LOG" -n 20 | head -n 20)
if [ -f "$SNAPSHOT_FILE" ]; then
    PREVIOUS=$(cat "$SNAPSHOT_FILE")
    NEW_LOGIN=$(diff <(echo "$PREVIOUS") <(echo "$CURRENT") | grep '^>' | sed 's/^> //')
    if [ -n "$NEW_LOGIN" ]; then
        echo "检测到新登录事件:$NEW_LOGIN" | mail -s "Debian登录告警" admin@ipipp.com
    fi
fi
echo "$CURRENT" > "$SNAPSHOT_FILE"

注意脚本中的>是HTML转义后的表示,实际bash脚本里diff输出前缀就是大于号。这个脚本将最近20条登录记录写入快照文件,每次运行时与上次快照做diff,只对新增行触发邮件。由于last输出包含终端和来源IP,新登录告警能提供足够的上下文。可以把脚本保存到/usr/local/bin/login_monitor.sh,并添加cron任务* * * * * /usr/local/bin/login_monitor.sh实现每分钟检查一次。

最后还要注意登录审计的取证边界。Debian默认不记录用户执行过的命令,bash history只对交互式会话有效,且容易被攻击者清除。如果需要追踪命令级行为,可以配置pam_tty_audit启用终端审计,这样auditd会捕获用户在tty上的按键记录,不过这会带来隐私和日志量的问题,建议只在安全要求高的服务器上开启。综合运用wtmp、btmp、auth.log和auditd,再配合实时脚本,就能在Debian上构建一套既轻量又可靠的用户登录审计体系。

广告位 · 文章底部(后台-模块管理替换此区域)