auth.log 会说话:三招看穿异常登录

/var/log/auth.log 记录了每一次 SSH 登录尝试,异常登录都藏在里面。小够教你三招:看 Failed 关键字统计、看陌生 IP 和非常用时段、看 last 命令的登录历史,五分钟判断服务器有没有被盯上。

我是小够。很多人的服务器被扫了几个月,自己完全不知道——其实证据都写在日志里了,只是没人看。今天讲怎么读 /var/log/auth.log,三招,五分钟,判断你的服务器有没有被盯上、有没有被进去过。

第一招:统计失败登录

sudo grep "Failed" /var/log/auth.log | wc -l

数字很大别慌,先看是谁在失败:

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

这条命令统计出失败次数最多的 20 个 IP。如果某个 IP 一天失败几百次,那就是字典爆破——正常的话,你的 fail2ban 应该已经把它封了。如果没装 fail2ban,赶紧装(本站有进阶教程)。

第二招:看"成功"比看"失败"更重要

失败不可怕,可怕的是成功。搜 Accepted:

sudo grep "Accepted" /var/log/auth.log

每一行成功登录都要能解释:这个时间、这个 IP、这个用户,是不是你本人?半夜三点有个陌生 IP 成功登录了 root——这就是事故。重点看三个维度:非常用时段(凌晨的登录)、陌生 IP(非你常用地区的)、陌生用户(你没建过的用户名)。

第三招:last 命令看历史

last -20

列出最近 20 次登录:用户、来源 IP、时间、时长。wtmp 被清空(last 显示很少或为空)本身就是可疑信号——正常系统不会这样,可能是入侵者擦除了痕迹。

发现异常怎么办

  1. 先别慌,确认是"尝试"还是"成功"。只有 Failed 没有 Accepted,说明攻击没得手,加固就行。
  2. 如果有不明 Accepted:立即改所有密码、轮换所有密钥、检查 authorized_keys 有没有多出来的公钥、检查定时任务(crontab -l 和 /etc/cron.d/)和不明进程。
  3. 拿不准是否干净,最稳妥是备份数据后重装系统——在可疑的系统上继续加固没有意义。

养成习惯

每周花五分钟跑一遍这三招,或者写个小脚本每天把统计发到邮箱。日志不会说谎,关键是有人看。小够的原则:安全感来自"我看过,没问题",而不是"我觉得,应该没事"。

用 journalctl 的看这里

新版系统(Ubuntu 20.04+、Debian 11+)日志走 systemd,/var/log/auth.log 可能没有或不全,用 journalctl:

sudo journalctl -u ssh --since "7 days ago" | grep "Failed" | wc -l
sudo journalctl -u ssh --since today | grep "Accepted"

效果一样,只是换了个工具。哪个顺手用哪个,关键是看。

日志保留多久

默认 logrotate 每周轮转、保留几周,够个人用。跑业务的建议保留 3-6 个月,万一出事要追溯,日志没了等于断了线索。改 /etc/logrotate.d/rsyslog 里的 rotate 数字就行,磁盘够的话多留无妨。