Linux用户登录日志审计筛查异常爆破账号
Linux 用户登录日志审计:三步主动筛查异常爆破账号
如果你的 Linux 服务器经常遇到密码被尝试、SSH 端口被扫,或者怀疑有爆破行为,可以直接通过系统自带的登录日志来筛查出攻击源头。
本文告诉你如何通过 lastb、last、grep 和 awk 命令,从 /var/log/auth.log(或 /var/log/secure)中提取异常登录记录,找出尝试最多的 IP 和账号。
1. 先确认日志文件在哪里
大部分 Linux 发行版的登录日志路径是:
- Ubuntu / Debian:
/var/log/auth.log - CentOS / RHEL / Rocky:
/var/log/secure
如果日志文件不存在,检查 rsyslog 是否运行。
可以用命令 ls -lh /var/log/auth* 或 ls -lh /var/log/secure 确认。
2. 手动查看失败登录记录
方法一:用 lastb 查看最近的失败登录
lastb
root ssh:notty 192.168.1.100 Fri Apr 11 12:30 - 12:30 (00:00)
admin ssh:notty 10.0.0.50 Fri Apr 11 12:29 - 12:29 (00:00)
lastb 默认显示所有失败登录,按时间倒序。
如果提示 lastb: /var/log/btmp: No such file or directory,先用 touch /var/log/btmp 创建,再执行 lastb。
方法二:直接 grep 日志文件
# Ubuntu / Debian
grep "Failed password" /var/log/auth.log
# CentOS / RHEL
grep "Failed password" /var/log/secure
输出示例:
Apr 11 12:30:01 server sshd[12345]: Failed password for root from 192.168.1.100 port 22 ssh2
3. 自动统计爆破 IP 和账号
用一个 awk 命令把攻击 IP 和对应次数统计出来:
# Ubuntugrep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20
# CentOSgrep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20
$(NF-3)是倒数第4个字段(IP 地址),具体字段位置可能因发行版不同略有差异,先运行grep ... | head -1人工确认字段顺序。- 如果字段位置不对,可以换成
awk '{print $11}'等方式调。
想同时统计爆破的账号名,可以这样:
grep "Failed password" /var/log/auth.log | awk '{print $9 " -> " $(NF-3)}' | sort | uniq -c | sort -nr | head -20
输出示例:
56 root -> 192.168.1.100
23 admin -> 10.0.0.50
行数代表该账号被该 IP 尝试的次数。次数超过 10 次就高度可疑。
4. 避坑指南
- 日志被轮转:如果日志文件被 logrotate 切分,grep 时可能需要加后缀(如 auth.log.1)。用
ls -1 /var/log/auth*列出所有相关文件,对每个文件单独跑命令。 - 时间不同步:如果服务器时间不准,审计结果可能误判。先用
date检查,并配置 NTP 同步。 - 字段位置因系统而异:建议每次先执行
grep "Failed password" /var/log/auth.log | head -3看看实际输出字段,再写 awk 索引。 - lastb 数据为空:如果系统没有 btmp 文件或日志被清空,lastb 无输出。优先用 grep 方式。
5. 效果验证:确认找到的账号是否真的被爆破
你可以用以下命令查看同一 IP 在短时间内的失败次数:
grep "192.168.1.100" /var/log/auth.log | grep -c "Failed password"
如果返回数字 > 20,基本确定是爆破。
接着可以用该 IP 去威胁情报平台(如 VirusTotal)查询,或直接通过 iptables / firewalld 临时封锁。
常见问题(FAQ)
Q1:我的系统没有 auth.log 或 secure 文件怎么办?
A:检查 /var/log/messages 或 journalctl -u sshd。如果都没有,可能 rsyslog 没启动,先执行 systemctl start rsyslog 并设为开机自启。
Q2:grep 返回结果太多,看不过来怎么筛选?
A:用 less 或 more 分页查看,或者用 grep ... | head -100 只看前100行。也可以加上时间范围,例如 grep "Apr 10" /var/log/auth.log。
Q3:是否可以直接用 fail2ban 代替手动审计?
A:fail2ban 能自动封锁,但手动审计可以帮你发现未被自动规则覆盖的手法。建议两者结合:fail2ban 做实时防御,定期手动日志审计做深度排查。
Q4:发现爆破 IP 后怎么立刻封掉?
A:临时封禁用 iptables -A INPUT -s 192.168.1.100 -j DROP(请替换实际 IP)。如果想永久封,写入 /etc/hosts.deny 或配置 firewalld(如 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" drop' 再 reload)。
如果你正在处理 Linux 登录日志审计与异常爆破账号筛查,建议先按本文步骤完整执行,再根据自己的环境调整 awk 字段位置;
遇到日志缺失或字段异常时,优先回看“避坑指南”部分。