Linux 登陆日志是系统安全审计的核心,通过分析 /var/log/secure (RHEL/CentOS) 或 /var/log/auth.log (Debian/Ubuntu) 等关键文件,管理员可以实时追踪用户行为、检测暴力破解攻击并溯源异常登录,是构建服务器安全防线的第一道关卡,掌握这些日志的存储机制、解析方法以及基于日志的自动化防御策略,对于保障 Linux 服务器的机密性、完整性和可用性具有决定性意义。

核心日志文件详解与存储机制
在 Linux 生态中,登陆日志并非存储在单一文件中,而是根据发行版的不同和日志记录的阶段,分散在特定的系统文件内,理解这些文件的物理位置和记录格式,是进行有效分析的前提。
对于主流的 RedHat 系列发行版(如 CentOS、RHEL),最关键的登陆日志位于 /var/log/secure,该文件由系统日志守护进程 rsyslog 维护,记录了包括 SSH 登陆、su 切换用户、sudo 权限提升以及认证失败等所有与安全相关的详细信息,而在 Debian 和 Ubuntu 系统中,同类功能的日志文件通常被称为 /var/log/auth.log,虽然文件名不同,但其记录的字段逻辑和核心价值是一致的。
除了上述基于文本的日志文件外,Linux 还维护了二进制的登陆记录文件,主要包括 /var/log/wtmp 和 /var/log/btmp。wtmp 文件记录了所有的登陆(包括成功登陆)和重启历史,管理员可以通过 last 命令读取它,查看历史登陆会话的时长、来源 IP 和终端设备,相对地,btmp 文件专门用于记录失败的登陆尝试,通过 lastb 命令可以读取,这是排查暴力破解攻击最直接的数据源,由于这两个文件是二进制格式,普通文本编辑器无法直接查看,且具有防止被轻易篡改的特性。
日志关键字段解读与异常识别
要真正发挥日志的价值,必须具备从海量数据中提取关键情报的能力,一条典型的 SSH 登陆日志通常包含时间戳、主机名、服务名(sshd)、进程 ID 以及具体的认证信息。
成功的登陆日志通常包含 Accepted 关键字。Accepted password for root from 192.168.1.100 port 22 ssh2,这条信息表明用户 root 通过密码认证成功登陆,来源 IP 为 168.1.100,在审计时,如果发现 root 账户在非管理时段或来自非可信网段的 Accepted 记录,应立即触发警报。
失败的登陆尝试则包含 Failed 或 Invalid 关键字。Failed password for invalid user admin from 192.168.1.200 port 55666 ssh2,这条日志极具威胁情报价值,它不仅显示了认证失败,还揭示了攻击者正在尝试猜测用户名(如 admin、test),如果在短时间内出现大量针对不同用户名的 Failed 记录,且来源 IP 相同,这通常意味着正在发生字典攻击或撞库攻击。
还需关注 pam_unix 相关的日志,PAM(可插拔认证模块)是 Linux 系统的认证骨干,任何与 PAM 交互的失败记录都可能暗示系统配置错误或潜在的提权尝试,频繁的 session opened 和 session closed 记录可以帮助追踪用户在系统中的停留时间,判断是否存在异常的短时连接行为。

高效分析工具与实战命令
面对成千上万行的日志数据,依赖肉眼逐行查看是不现实的,熟练掌握 Linux 文本处理三剑客(grep、awk、sed)以及专用日志查询工具,是运维人员的必备技能。
筛选攻击源 IP 是最常见的需求,可以使用以下命令组合快速统计失败登陆次数最多的 IP 地址:
grep "Failed password" /var/log/secure | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head
这条命令的逻辑非常清晰:首先利用 grep 提取出所有包含“Failed password”的行,然后使用 awk 定位到倒数第四个字段(通常是源 IP),接着通过 sort 排序并利用 uniq -c 统计重复次数,最后再次 sort -nr 按数值倒序排列,输出前几名,通过这种方式,攻击者的 IP 及其攻击频率一目了然。
查看当前登陆用户则主要依赖 w 和 who 命令,它们读取的是 /var/run/utmp 文件,而查看历史登陆记录,则使用 last 命令,为了排查异常断开或非法登陆,可以重点关注 last 命令输出中标记为 still logged in 的会话,以及来自陌生域名的记录。
对于使用 systemd 的现代 Linux 发行版,journalctl 提供了更为强大的日志检索功能,使用 journalctl -u sshd -f 可以实时跟踪 SSH 服务的日志输出,类似于 tail -f 的效果,但结构化程度更高,结合 --since 和 --until 参数,可以精确查询特定时间窗口内的登陆事件,这对于事后取证至关重要。
自动化防御与日志管理策略
仅仅分析日志是被动的,真正的安全专家会将日志分析与自动化防御结合起来,基于日志的主动防御策略是提升系统安全性的关键。
部署 Fail2Ban 是最行之有效的解决方案之一,Fail2Ban 通过扫描日志文件(如 /var/log/secure),检测到多次失败的登陆尝试后,自动更新 iptables 或 firewalld 规则,封禁攻击源的 IP 地址,其配置文件 /etc/fail2ban/jail.local 允许管理员精细定义“最大重试次数”、“查找时间”和“封禁时长”,可以设置在 10 分钟内失败 3 次即封禁该 IP 1 小时,这种“即时反应”机制能极大阻断自动化脚本的无差别攻击。
除了防御攻击,日志轮转 也是不可忽视的管理环节,如果日志文件无限增长,最终会占满磁盘分区,导致系统宕机(DoS),通过配置 /etc/logrotate.conf 或 /etc/logrotate.d/ 下的自定义配置,可以设定日志按日、按周或按大小进行轮转,并保留指定数量的历史归档,对于关键的安全日志,建议保留更长的周期,甚至配置远程日志服务器,将日志实时同步到另一台受保护的服务器上,这样,即便攻击者获取了 root 权限并试图删除本地日志痕迹,远程服务器上依然保留着完整的罪证。

建议引入 集中式日志管理架构,如 ELK Stack(Elasticsearch, Logstash, Kibana)或 Graylog,这些工具不仅能聚合多台服务器的登陆日志,还能通过可视化的仪表盘展示登陆趋势、攻击来源分布等高级图表,帮助管理员从宏观层面掌握网络的安全态势。
相关问答
Q1: 如何查找 Linux 系统中最近尝试登陆失败次数最多的用户名?
A: 可以通过分析 /var/log/secure 或 /var/log/auth.log 文件来实现,使用命令 grep "Failed password" /var/log/secure | awk '{print $(NF-5)}' | sort | uniq -c | sort -nr | head,该命令会提取出所有登陆失败的用户名,并按失败次数倒序排列,让你迅速识别出攻击者主要针对哪个账户进行暴力破解。
Q2: 如果发现 /var/log/btmp 文件过大,是否可以直接删除?
A: 不建议直接使用 rm 命令删除 /var/log/btmp 文件,因为这可能会导致文件句柄被占用或权限属性丢失,进而影响 lastb 命令的正常工作,正确的做法是使用 truncate 命令清空文件内容,例如执行 truncate -s 0 /var/log/btmp,或者直接删除后使用 touch 命令重新创建并设置正确的权限(通常是 600),更好的方案是配置 logrotate 自动管理该文件的轮转和压缩。
如果您在配置 Linux 日志分析或自动化防御脚本时遇到具体问题,欢迎在下方留言,我们将为您提供更具体的技术支持。

















