Linux 系统登录核心文件超全详解
2026-06-08
运维
00

目录

一、先懂原理:Linux登录到底发生了什么?
1.1 本地登录与远程登录的底层文件调用差异
1.2 完整登录校验全流程(必背底层逻辑)
二、核心账号文件:/etc/passwd —— 用户的“身份证”
2.1 文件是干啥的?
2.2 字段逐字拆解(一共7个字段,用 : 分隔)
2.3 实操查看命令
2.4 系统内置用户是干嘛的?
2.5 修改的正确姿势与风险
三、核心密码文件:/etc/shadow —— 安全的铁闸
3.1 为什么需要 /etc/shadow?
3.2 九个字段逐字拆解
3.3 密码加密算法与禁止破解原理
3.4 修改密码属性实战
强制用户下次登录立即改密码
查看用户密码策略
设置密码最长有效期90天,过期前7天警告,过期后14天缓冲
锁定 / 解锁用户密码
3.5 生产核心禁忌
四、用户组核心文件:/etc/group 与 /etc/gshadow
4.1 /etc/group —— 用户组信息
4.2 /etc/gshadow —— 几乎用不上的组密码
五、登录全局控制:/etc/login.defs
5.1 文件定位
5.2 核心参数逐行解析(生产必配)
5.3 企业安全加固建议
六、登录认证“法官”:/etc/pam.d/ 系列文件
6.1 PAM 是什么?
6.2 读懂 PAM 配置行的四列
6.3 企业常用 PAM 管控场景
6.4 实战:限制 SSH 登录失败次数(防暴力破解)
七、登录日志三剑客:排查异常的最后防线
7.1 /var/log/lastlog —— 每个用户最后一次登录记录
7.2 /var/log/wtmp —— 所有成功登录/注销的“史官”
7.3 /var/log/btmp —— 所有失败登录的“黑名单”
7.4 日志误删修复与轮转注意事项
八、高频运维实操案例
案例1:禁止用户登录、锁定用户、解锁用户实操
案例2:修改全局新用户密码过期策略并批量调整已有用户
案例3:排查暴力破解与异常登录
案例4:手动修复用户登录异常
案例5:手动清空某用户失败登录计数(faillock)
九、高频误区与生产禁忌
9.1 严禁直接用 vi 修改 passwd / shadow / group / gshadow
9.2 /etc/shadow 中密码字段为空、星号、感叹号的本质区别
9.3 密码过期 vs 账号过期 vs 锁定
9.4 登录日志生产禁忌
十、总结:丝般顺滑的登录背后,是这些文件在协同
10.1 核心文件总结
10.2 运维日常速查清单

最近在工作闲暇之余,重新回顾了《鸟哥的私房菜》,看到 Linux 登录文件这方面,还是忍不住自己总结的想法(毕竟摸鱼的时间有点多)。相信每一位接触Linux的同学,无论是刚学会敲第一个ls命令的萌新,还是每天要管理成百上千台服务器的后端开发与SRE,都绕不开一个最基础的动作——登录

“‘登录’有啥好讲的?不就是输个账号密码、SSH一怼就进去了吗?” 很多新人是这么想的。可一旦你深入下去就会发现,一个看似简单的登录,背后牵扯着一整套极其精密、环环相扣的配置文件体系。用户为什么能登录?密码是怎么校验的?密码策略是谁规定的?登录日志记到了哪里?被暴力破解时我们应该看哪些文件锁IP?

这些问题都藏在/etc/passwd/etc/shadow/etc/group/etc/login.defs/etc/pam.d/*/var/log/wtmp…… 这些核心文件之中。

毫不夸张地说,吃透 Linux 登录核心文件,是你从“命令行使用者”迈向“系统管理者”最重要的一步。 否则,当有一天用户突然无法登录,或者你察觉到服务器被陌生人半夜摸进来“逛了一圈”,你却连从哪排查都不知道——这绝对不是一名合格工程师该有的样子。

今天这篇超长干货,我希望能帮你彻底打通 Linux 登录的任督二脉。我会用”原理先行→文件逐字段拆解→实操命令→生产禁忌→排错案例”的思路,把每一个文件掰开揉碎讲清楚。适配 CentOS 7/8/9 及 Ubuntu 18.04/20.04/22.04 主流环境,所有差异点都会标注。文末还为你准备了可以直接打印贴在工位上的运维速查清单,让你在日常工作中遇到登录问题时,30秒内快速定位并执行正确命令。那我们,开始吧。


一、先懂原理:Linux登录到底发生了什么?

在学习配置文件之前,我们必须先弄懂 Linux 登录的完整流程。否则你就相当于拿着一堆零件,却不知道图纸长啥样。Linux 所有登录行为,绝非简单的“输入密码校验”,而是一套配置文件定义规则 + PAM模块认证校验 + 日志全程记录的闭环体系。

1.1 本地登录与远程登录的底层文件调用差异

无论是站在物理机前用键盘登录(本地终端 tty),还是通过 SSH 从别处远程连入,Linux 的登录验证最终校验的核心文件一致,但调用流程略有区别:

  • 本地登录(服务器终端、虚拟机控制台):触发 /etc/pam.d/login 认证规则,读取 passwd / shadow / login.defs 全局规则,完成本地账号校验。
  • 远程SSH登录(Xshell、FinalShell、终端SSH):触发 /etc/pam.d/sshd 认证规则,优先复用系统登录核心配置,同时叠加SSH服务专属拦截规则。

1.2 完整登录校验全流程(必背底层逻辑)

任何用户登录Linux系统,都会严格遵循以下8步流程,所有登录报错、权限异常、登录失败都能在这个流程中精准定位根源:

  1. 用户输入账号、密码,发起登录请求
  2. 系统读取 /etc/passwd,校验账号是否存在、是否为可登录用户;
  3. 读取 /etc/shadow,校验密码密文、账号有效期、锁定状态;
  4. 读取 /etc/login.defs,匹配全局登录规则、密码策略、UID/GID权限规范;
  5. 调用 PAM认证模块,执行密码复杂度、登录次数、权限拦截校验;
  6. 读取 /etc/group/etc/gshadow,加载用户所属用户组权限;
  7. 认证通过则分配Shell环境、登录终端;认证失败则拒绝登录
  8. 全程写入 wtmp / btmp / lastlog 日志,记录登录成功/失败行为,用于后续审计排错。

关键词:不管是本地还是远程,核心的用户属性、密码、组信息、登录日志几乎来自同一套文件,只是调用的 PAM 服务名称不同(login vs sshd)。这意味着你在 /etc/pam.d/ 里的策略会直接影响两种登录方式。

基于这套完整流程,本文将四大类登录核心文件逐一对标拆解:账号文件、组文件、权限规则文件、日志记录文件,做到知原理、懂字段、会实操、避风险。


二、核心账号文件:/etc/passwd —— 用户的“身份证”

2.1 文件是干啥的?

/etc/passwd 是 Linux 系统里最基础的用户信息库,它记录了系统中所有用户(包括系统用户和普通用户)的账号基本信息。它的可读性很高,理论上你可以直接用 cat 看个通透。

文件基础属性速览:

  • 文件路径/etc/passwd
  • 文件权限:全局可读(644),仅 root 可修改
  • 核心作用:存储系统所有用户的基础信息,包含 UID、GID、家目录、登录 Shell 等,是系统识别用户的唯一依据
  • 系统差异:CentOS 与 Ubuntu 字段结构完全一致,无差异

但请注意:它虽然名字里带 “passwd”,但其实早已不存放真正的密码了,密码早已被挪到了 /etc/shadow 里,这里用一个占位符代替。

2.2 字段逐字拆解(一共7个字段,用 : 分隔)

我们随便挑一行看看:

展开代码
root:x:0:0:root:/root:/bin/bash

把它切成七段:

字段序号字段值示例含义详解
1root用户名用户登录时输入的字符串,唯一标识,不允许重复。
2x密码占位符历史上的密码散列存放于此,现在统一用 x 代替,真实密码在 /etc/shadow。如果你看到 !*,说明该账号密码已被禁用。绝对不要把普通系统用户的 x 直接删掉留空,否则可能导致免密登录!
30UIDUser ID,系统内核只认数字。0 是 root 专属,权限最大。CentOS 一般普通用户从 1000 开始,Ubuntu 也是 1000。1-999 为系统内置用户,自定义服务账户通常分配 500-999 的系统 UID。
40GID用户的主组 ID,必须对应 /etc/group 中一个组的 GID。用户创建文件时,默认归属组就是这个主组。
5root用户描述信息GECOS 字段,可以随意填写,一般用来记录全名、办公室电话等。用 usermod -c "张三" zhangsan 修改的就是这个字段。
6/root家目录用户登录后的默认工作目录。普通用户一般在 /home/用户名,root 为 /root。若是 /sbin/nologin 这类用户,家目录仍会存在但可能用不上。
7/bin/bash登录 Shell用户登录后启动的程序。这是控制用户能否登录的关键! 如果设为 /sbin/nologin/bin/false,则即使密码正确也无法获得终端 Shell,常用于服务账户。

2.3 实操查看命令

日常不建议直接 vim 去浏览,而是用这些安全命令:

展开代码
# 查看所有系统用户 cat /etc/passwd # 查看某一个用户的信息 getent passwd root # 或者 grep ^root /etc/passwd # 筛选所有可登录用户(shell为/bin/bash) grep "/bin/bash" /etc/passwd # 筛选所有禁止登录的系统用户 grep "/sbin/nologin" /etc/passwd # 仅查看有哪些系统 UID 小于 1000 的“早期用户” awk -F: '$3 < 1000 {print $1, $3}' /etc/passwd

2.4 系统内置用户是干嘛的?

你会发现 /etc/passwd 里不仅有你创建的 zhangsan,还有一大堆诸如 bindaemonnobody 的用户,它们的 Shell 基本都是 /sbin/nologin

  • root(UID=0):系统最高权限管理员,拥有所有权限,唯一超级用户。禁止修改 root 的 UID=0 属性,会直接丢失超级权限,系统崩溃。
  • bin、daemon:系统内置服务用户,用于运行系统基础进程,无登录权限。
  • nobody:低权限匿名用户,UID 通常是 65534,用于运行第三方服务,权限极低,防止提权攻击。

这些系统用户是为了“进程所有权分离”。比如 nginx 用户跑 Nginx 进程,一旦进程被攻破,黑客拿到的只是一个没有 Shell 的受限账户,无法直接登陆系统,极大降低了风险。禁止随意删除系统内置用户,会导致系统服务启动失败。

2.5 修改的正确姿势与风险

生产禁忌一:严禁直接 vi /etc/passwd 随意增删改! 原因:

  1. 可能破坏文件锁,如果有其他进程同时在写(虽然不常见),会损坏文件。
  2. 万一多按了个空格、少个冒号,所有依赖此文件的操作(包括 susudo、登录)都可能直接挂掉。
  3. 手动编辑极易出现隐藏格式错误,导致全系统用户无法登录、系统瘫痪。

正确修改方式:

  • 修改用户信息:使用 usermod。例如改注释:usermod -c "zhang san" zhangsan

  • 如果实在需要手动编辑(批量替换),必须使用系统提供的 vipw 命令,它会锁定文件、编辑结束后校验格式。

    展开代码
    vipw # 编辑 /etc/passwd vipw -s # 编辑 /etc/shadow(直接进入带锁的安全编辑)

三、核心密码文件:/etc/shadow —— 安全的铁闸

3.1 为什么需要 /etc/shadow?

早年间,加密后的密码直接塞在 passwd 第二位,但 passwd 文件对所有用户可读(需要有读权限才能让 ls -l 正确显示属主名),这就给了恶意者暴力破解的机会。后来大家才想出把密码挪到只有 root 才能读的 shadow 文件中。passwdx 其实就是在对你说:密码在我兄弟那,我没密码,别找我。

文件基础属性速览:

  • 文件路径/etc/shadow
  • 文件权限:600,仅 root 可读写,普通用户无任何权限,系统最核心安全文件
  • 核心作用:存储用户密码密文、密码有效期、账号锁定状态、过期规则,是密码校验的唯一依据
  • 系统差异:CentOS 与 Ubuntu 加密算法略有差异(详见下方),字段结构完全一致

3.2 九个字段逐字拆解

shadow 文件固定9个字段,管控密码所有安全规则,登录密码错误、账号过期、锁定无法登录,全部由该文件控制。

我们看一行 shadow 记录:

展开代码
root:$6$xyz...hashtext:19000:0:99999:7:14::
字段序号字段值示例含义生产关注点
1root用户名必须和 passwd 里一致,一一对应,唯一匹配。
2$6$...加密后的密码核心字段:$6$代表 SHA-512 加密。如果为空,表示没有密码,登录时直接回车即可(极其危险)。如果值为 !!!,表示密码被锁定,用户无法用密码登录,但可用 SSH key。* 代表账号被禁用。各种状态区别后面细讲。
319000上次改密码的日期从 1970年1月1日到修改日期的天数。chage -l user 可直观查看。设为 0 会强制用户下次登录必须修改密码。
40密码最小使用天数两次改密码之间至少间隔几天。0 表示随时可改。如果设为 7,用户今天改了密码明天又想改,系统会拒绝。可防用户频繁修改再改回老密码。
599999密码最大使用天数超过这个天数密码就过期,登录后会强制修改。安全策略一般设为 90 天,默认 99999 表示永久有效。
67密码过期前警告天数密码快过期了,提前几天每天给用户弹提醒,默认 7 天。
714密码过期后宽限天数密码过期后,用户还能登录的“死缓”天数,但必须立即修改密码。如果这个天数也过了,账户被彻底锁定,需管理员解锁。
8(空)账户过期日期从 1970 年 1 月 1 日起的天数。超过这个日期,账户直接失效,无论密码是否过期。常用于临时工/合作方账户管控。
9(空)保留字段系统预留,暂无实际作用。

3.3 密码加密算法与禁止破解原理

第二字段如果是一串 $id$salt$hash 的形式,$id$ 标识了算法:

  • $1$ 表示 MD5 (不安全,不推荐)
  • $5$ 表示 SHA-256
  • $6$ 表示 SHA-512 (CentOS 7~9 默认,Ubuntu 18.04 默认)
  • $y$ 表示 yescrypt (Ubuntu 20.04 之后的新默认算法,比 SHA-512 更抗破解)

你可以通过 /etc/login.defs 中的 ENCRYPT_METHOD 控制新密码的加密算法。

防破解机制:Linux 默认采用 SHA-512 加盐加密,每个用户密码随机加盐,即使两个用户密码相同,密文也完全不同。密文不可逆解密,只能暴力碰撞。生产环境搭配密码复杂度、登录次数限制,可杜绝绝大多数破解行为。

3.4 修改密码属性实战

强制用户下次登录立即改密码

展开代码
chage -d 0 zhangsan # 直接将最后修改日置为 0 # 或者 passwd -e zhangsan # 同样效果,过期密码

查看用户密码策略

展开代码
chage -l zhangsan

设置密码最长有效期90天,过期前7天警告,过期后14天缓冲

展开代码
chage -M 90 -W 7 -I 14 zhangsan

锁定 / 解锁用户密码

锁定:在 shadow 密码字段前加 !!!,用户无法用密码登录,但 SSH 密钥不受影响。

展开代码
passwd -l zhangsan # 锁定 passwd -u zhangsan # 解锁

等价于 usermod -Lusermod -U

完全禁止用户登录(包含密钥等方式):可以改 shell 为 /sbin/nologin,或将账户过期日期设为 1。

展开代码
usermod -s /sbin/nologin zhangsan # 或 chage -E 1970-01-01 zhangsan

3.5 生产核心禁忌

绝对禁止手动 vi 编辑 shadow 文件,一旦密文格式错乱,用户直接永久无法登录,且无法修复。统一使用 usermodpasswdchage 等系统命令自动写入。


四、用户组核心文件:/etc/group 与 /etc/gshadow

4.1 /etc/group —— 用户组信息

用户组用于批量管控用户权限,决定用户对系统文件、命令、服务的访问权限。

文件作用:记录系统所有用户组名称、GID、组内成员,区分主组和附属组,是权限批量管控的核心。

字段格式:组名:密码占位符:GID:成员列表

展开代码
develop:x:1001:zhangsan,lisi,wangwu

四字段解析

  • 组名:用户组名称。
  • 密码占位符:一般用 x,真密码在 /etc/gshadow 里,但组密码几乎无人使用。
  • GID:组唯一标识。
  • 成员列表:以逗号分隔的用户名列表,这里的用户属于该组的附属组成员。主组用户不显示在此。

主组与附属组的区别: 用户在 /etc/passwd 第4字段的 GID 对应的组就是他的主组,用 id 命令可以看到 gid=... 后面那个。而 /etc/group 里成员列表里的则是附属组。用户创建的文件默认属组就是主组;如果他需要同时属于多个组拥有交叉权限,那就靠附属组。

  • 主组:用户创建时默认所属组,用户创建文件的默认所属组,一个用户仅有一个主组。
  • 附属组:用户额外加入的权限组,用于补充权限,一个用户可拥有多个附属组。
展开代码
id zhangsan # uid=1000(zhangsan) gid=1001(develop) groups=1001(develop),27(sudo)

这里主组就是 develop,同时还属于 sudo 附属组。

修改命令:

展开代码
# 改变用户主组 usermod -g ops zhangsan # 添加附属组 usermod -aG docker zhangsan # 编辑组文件推荐 vigr # 带锁编辑 /etc/group vigr -s # 编辑 /etc/gshadow

4.2 /etc/gshadow —— 几乎用不上的组密码

文件作用:存储用户组密码、组管理员信息,权限极高,默认 600 权限。

格式:组名:加密密码:组管理员:成员名单

绝大多数情况下,组密码是 !*,即禁用。它的作用在于:当一个非组成员临时想切换到该组访问文件时,他可以使用 newgrp 组名 命令,然后输入组密码来临时获取该组权限。不过在生产环境,我们更倾向于通过 sudo 或直接将用户加入附属组来实现,很少启用组密码。

企业运维使用规范

  • 生产环境极少使用组密码,多用于临时赋予用户组权限、无需添加用户入组。
  • 组密码为空、!!! 均代表无组密码,禁止随意配置组密码,避免权限泄露
  • 支持设置组管理员,可独立管理组内成员,无需 root 权限。

五、登录全局控制:/etc/login.defs

5.1 文件定位

/etc/login.defs 这个文件非常有意思,它就像是系统的**“用户创建与密码策略的默认模具”**。它是 Linux 系统登录、密码策略、用户创建规则的全局总开关,所有新建用户、登录校验全部遵循该文件规则。

重点:它对已有用户完全没影响,只控制 useraddgroupadd 等命令创建新用户/组时的默认值,同时定义了一系列全局的安全限制。

5.2 核心参数逐行解析(生产必配)

我们截取几个核心配置项:

展开代码
# 用户的邮件目录 MAIL_DIR /var/spool/mail # 密码最大天数(新用户) PASS_MAX_DAYS 99999 # 密码最小天数 PASS_MIN_DAYS 0 # 密码最小长度 PASS_MIN_LEN 5 # 注意:PAM 模块可能会覆盖这个限制 # 密码过期前警告天数 PASS_WARN_AGE 7 # 普通用户 UID 起止范围 UID_MIN 1000 UID_MAX 60000 # 系统用户 UID 起止范围 SYS_UID_MIN 201 SYS_UID_MAX 999 # 普通用户 GID 范围 GID_MIN 1000 GID_MAX 60000 # 创建用户时是否自动创建家目录 CREATE_HOME yes # 用户家目录默认 umask (022 对应 755 目录权限) UMASK 077 # Ubuntu 默认可能是 022,CentOS 默认 077 更多?CentOS 7 默认为 077 # 是否删除用户时一并删除其主组(如果组内无其他人) USERGROUPS_ENAB yes # 新密码加密算法 ENCRYPT_METHOD SHA512 # CentOS 7/8/9默认;Ubuntu 20.04后为 YESCRYPT

生产修改规范

  • 必须开启密码有效期,杜绝永久密码漏洞。
  • 统一 UID/GID 规则,避免用户 ID 冲突导致权限异常。
  • 可配置 LOGIN_MAX 限制最大登录数,防止恶意批量登录占用资源。

5.3 企业安全加固建议

展开代码
# 强制新用户密码最长90天必须更换 PASS_MAX_DAYS 90 PASS_MIN_DAYS 1 PASS_WARN_AGE 10

修改后重启生效,这些修改仅对之后创建的用户生效,不影响已存在的用户。要批量修改已存在用户的密码策略,需要结合 chage 命令。


六、登录认证“法官”:/etc/pam.d/ 系列文件

6.1 PAM 是什么?

PAM(Pluggable Authentication Modules) 是一套可插拔认证模块,是 Linux 登录的动态校验网关。它把登录认证的逻辑从应用程序中抽离出来。不论是 loginsshdsudopasswd,它们要做身份检查时,都会调用自己对应的 PAM 配置文件(通常在 /etc/pam.d/ 下),再由这些配置文件依次调用 pam_unix.sopam_faillock.so 等模块完成校验。

这就意味着:我们只要修改 /etc/pam.d/sshd,就能改变所有 SSH 登录的认证行为,而无需改动 sshd 源码。

核心认证文件

  • /etc/pam.d/login:管控本地终端登录认证规则
  • /etc/pam.d/sshd:管控远程 SSH 登录认证规则

6.2 读懂 PAM 配置行的四列

以一行 pam_unix.so 为例:

展开代码
auth required pam_unix.so nullok try_first_pass
  • 第一列

    :功能类型。四种:

    • auth : 用户认证(验证你是谁)
    • account: 账户状态检查(过期没?允许登录吗?)
    • password: 修改密码相关
    • session: 登录前后要做的事(挂载家目录、打印提示信息、记录日志)
  • 第二列

    :控制标记。决定该模块验证成功/失败后如何继续:

    • required: 失败则整个认证最终失败,但继续运行下一模块,不立刻告诉用户(防信息泄露)。
    • requisite: 失败立刻返回,直接断掉。
    • sufficient: 如果成功,且之前没有失败,则直接通过;失败则忽略继续。
    • optional: 成败不影响全局。
  • 第三列:模块路径,通常写库名。

  • 第四列:模块参数。

6.3 企业常用 PAM 管控场景

  • 密码复杂度校验(长度、大小写、特殊字符)
  • 登录次数限制(错误 5 次锁定账号)
  • 指定 IP 登录拦截、白名单放行
  • 禁止空密码用户登录

6.4 实战:限制 SSH 登录失败次数(防暴力破解)

CentOS 8 / 9 使用 pam_faillock.so

编辑 /etc/pam.d/system-auth/etc/pam.d/password-auth,在 auth 段中加入:

展开代码
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=1800

并在 auth 段尾部加入:

展开代码
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=1800 auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=1800

解释:连续 5 次密码错误锁定 1800 秒(30分钟)。deny=5 失败次数,unlock_time 解锁时间秒数。

CentOS 7 使用 pam_tally2

展开代码
auth required pam_tally2.so deny=5 unlock_time=1800 even_deny_root root_unlock_time=600

even_deny_root 表示连 root 也锁,省得被人无限撞库。

Ubuntu 20.04 / 22.04

Ubuntu 同样使用 pam_faillock,但配置在 /etc/pam.d/common-auth 中。编辑:

展开代码
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=1800 auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=1800 auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=1800

配置完后,可以通过 faillock --user zhangsan --reset 手动解锁用户。

⚠️ 禁忌:编辑 PAM 文件前,务必另开一个 root 终端作为备份会话,避免配置错误自己把自己锁在外面!重启 sshd 服务后生效,但不要断开当前连接,先测试新建连接。


七、登录日志三剑客:排查异常的最后防线

任何一次登录,无论成功还是失败,Linux 都会留下痕迹。三条核心日志文件构成了我们排查入侵、故障回溯的基础,也是排查异常登录、暴力破解的唯一依据

7.1 /var/log/lastlog —— 每个用户最后一次登录记录

  • 文件类型:二进制日志,不可直接 cat 查看
  • 核心作用:记录系统每个用户最近一次登录时间、登录 IP、登录终端
  • 排错场景:排查陌生账号首次登录、僵尸账号登录行为
展开代码
# 查看所有用户最后一次登录时间和来源 lastlog # 查看特定用户 lastlog -u zhangsan # 只显示最近一周内登录过的用户 lastlog -t 7

输出示例:

展开代码
Username Port From Latest root pts/0 192.168.1.100 Mon Jan 15 09:15:32 +0800 2024 zhangsan pts/1 10.0.0.5 Fri Jan 12 18:23:45 +0800 2024

如果某个账户突然出现来自陌生 IP 的最后登录,就需要高度警惕了。

7.2 /var/log/wtmp —— 所有成功登录/注销的“史官”

  • 文件类型:二进制日志
  • 核心作用:记录系统所有成功登录、退出、重启、关机完整历史
  • 底层命令last 命令数据全部来源于该文件
展开代码
# 查看最近的所有登录记录 last # 查看某个用户的登录记录 last zhangsan # 根据终端 pts/0 筛选 last pts/0 # 如果不指定文件,默认读取 /var/log/wtmp;也可以指定之前轮转过的日志 last -f /var/log/wtmp.1

输出会显示用户、终端、来源 IP、登录时间、退出时间、持续时间等。

排障用法

  • 有人怀疑半夜有人登录服务器,直接 last | grep -v 'reboot' | head 一看便知。
  • 通过来源 IP 可辅助判断是否为异常地区登录。

7.3 /var/log/btmp —— 所有失败登录的“黑名单”

  • 文件类型:二进制日志
  • 核心作用:记录所有登录失败、密码错误、账号探测、爆破尝试记录
  • 底层命令lastb
  • 生产刚需:每日排查恶意 IP 暴力破解、异常扫描行为
展开代码
# 查看所有失败记录 lastb # 查看最近 20 条 lastb -n 20 # 实时查看看失败记录中的 IP 分布,找出可疑 IP lastb | awk '{print $3}' | sort | uniq -c | sort -nr | head

你可能会看到大量来自某个 IP 的 root 登录失败记录,大概率是被人扫了。

结合 /var/log/auth.log(Ubuntu)或 /var/log/secure(CentOS) 这些明文日志记录了更详细的 PAM 认证过程,比如“pam_unix(sshd: auth): authentication failure”,我们可以精确定位时间、用户、来源 IP、端口等。

展开代码
grep "Failed password" /var/log/secure | grep -oP 'from \K\S+' | sort | uniq -c | sort -nr

7.4 日志误删修复与轮转注意事项

如果你不小心把 /var/log/btmp 删了,lastb 会报错无文件。可以这样恢复:

展开代码
touch /var/log/btmp chmod 600 /var/log/btmp chown root:utmp /var/log/btmp # 注意属组可能是utmp或root,视系统而定

同样适用于 wtmplastlog

展开代码
touch /var/log/wtmp /var/log/lastlog chmod 664 /var/log/wtmp /var/log/lastlog chown root:utmp /var/log/wtmp /var/log/lastlog

lastlastlog 就会恢复正常,只是历史数据没了而已。

生产注意事项

  • 禁止随意删除 wtmp/btmp/lastlog 日志,丢失安全审计记录,无法追溯攻击行为。
  • 必须开启日志轮转(logrotate),防止日志文件过大占用磁盘。务必检查 /etc/logrotate.conf 和相关配置是否包含了 wtmp 和 btmp 的轮转规则。
  • 重要生产服务器需定期备份登录日志,用于安全合规审计。

八、高频运维实操案例

案例1:禁止用户登录、锁定用户、解锁用户实操

展开代码
# 方式1:锁定密码(shadow密码字段加!!,禁止密码登录,但SSH key仍可登录) passwd -l xiaozhang # 方式2:修改shell为nologin,完全禁止登录(含SSH key) usermod -s /sbin/nologin xiaozhang # 方式3:设置账户过期日期,彻底禁用 chage -E 1970-01-01 xiaozhang # 解锁恢复登录 passwd -u xiaozhang usermod -s /bin/bash xiaozhang

案例2:修改全局新用户密码过期策略并批量调整已有用户

展开代码
# 修改 login.defs 设置新用户默认 90 天过期 vim /etc/login.defs # 对已有用户 zhangsan 应用 90 天策略 chage -M 90 -m 1 -W 7 -I 14 zhangsan # 批量:例如所有 UID>=1000 的用户 for u in $(awk -F: '($3>=1000 && $1!="nobody"){print $1}' /etc/passwd); do chage -M 90 -W 7 -I 14 "$u" done

案例3:排查暴力破解与异常登录

展开代码
# 查看所有登录失败记录 lastb # 统计爆破IP排行(高频排查命令) lastb | awk '{print $3}' | sort | uniq -c | sort -nr | head -10 # 从安全日志中提取失败密码的IP grep "Failed password" /var/log/secure | grep -oP 'from \K\S+' | sort | uniq -c | sort -nr

假设发现 112.xxx.xxx.xxx 有过百次失败尝试,立刻拉黑:

展开代码
# 临时使用 iptables iptables -A INPUT -s 112.xxx.xxx.xxx -j DROP # 或使用 fail2ban 自动封禁

案例4:手动修复用户登录异常

账号无法登录时,遵循以下排查链路:

  1. passwd 账号是否存在grep 用户名 /etc/passwd
  2. shadow 密码/锁定状态passwd -S 用户名chage -l 用户名
  3. login.defs 策略 → 检查是否有全局限制
  4. PAM 拦截规则 → 查看 /var/log/secure 是否有 PAM 拒绝记录
  5. 日志报错信息lastb 查看失败记录中的具体原因

案例5:手动清空某用户失败登录计数(faillock)

展开代码
# 查看失败记录 faillock --user zhangsan # 重置 faillock --user zhangsan --reset

如果用的还是 pam_tally2

展开代码
pam_tally2 --user zhangsan --reset

九、高频误区与生产禁忌

9.1 严禁直接用 vi 修改 passwd / shadow / group / gshadow

前面已经强调,风险点在于:

  • 两个文件对格式、字段、换行要求极致严格,手动编辑极易出现隐藏格式错误,导致全系统用户无法登录、系统瘫痪。
  • 可能损坏文件结构,导致系统无法解析用户;
  • 其他正在运行的程序可能同时读写,造成竞态条件;
  • 如果保存时权限变动,可能引起更严重漏洞。

唯一正确的文本编辑方式

  • vipw —— 编辑 passwd,保存时自动检查并同步 shadow
  • vigr —— 编辑 group,同时可能带 -s 编辑 gshadow
  • 或者干脆只用 useraddusermodchagepasswd 等系统命令自动写入。

9.2 /etc/shadow 中密码字段为空、星号、感叹号的本质区别

字段样子含义能直接用密码登录吗?能通过 SSH key 登录吗?
::: :(空)没有密码。本地登录直接给 Shell,生产高危漏洞是(无密码)
:!密码被锁定(如 passwd -l(如果密钥允许)
:!!同上,不同发行版标记
:*账户被认为“禁用”,常见于系统账户一般否(视 PAM 配置,常拒绝)
正常密码哈希 $6$...有密码

重要结论: 要想完全禁止某个用户的所有登录方式(包括密钥),最稳妥的方法是直接把 Shell 改成 /sbin/nologin 或设置账户过期日期。很多新手把锁定当成“删号”,结果用户用 SSH key 照样溜达进来,务必注意。

9.3 密码过期 vs 账号过期 vs 锁定

  • 密码过期chage -M 控制的期限。用户登录时会被强制要求换密码,还能进系统。
  • 账号过期chage -E 设置固定日期,过了这天无论密码多正确都不能登录。
  • 锁定passwd -l,只是密码不能用,其他方式仍可能登入。

9.4 登录日志生产禁忌

  • 禁止随意删除 wtmp/btmp/lastlog 日志,丢失安全审计记录,无法追溯攻击行为。
  • 必须开启日志轮转(logrotate),防止日志文件过大占用磁盘。
  • 重要生产服务器需定期备份登录日志,用于安全合规审计。

十、总结:丝般顺滑的登录背后,是这些文件在协同

Linux 登录体系是一套 规则定义 → 权限匹配 → 认证校验 → 日志审计 的闭环体系。所有登录故障、安全漏洞、权限异常,都可以通过上述四大类文件精准定位。掌握底层文件原理,才能摆脱“只会敲命令不懂原理”的新手阶段,具备生产环境故障排错、安全加固的核心能力。

10.1 核心文件总结

分类文件核心作用
账号类文件/etc/passwd用户基础信息(UID/GID/Shell/家目录)
/etc/shadow密码安全规则(密文/有效期/锁定状态)
组权限文件/etc/group组信息、主组/附属组成员
/etc/gshadow组安全配置(极少使用)
全局规则文件/etc/login.defs全局登录策略、新用户默认参数
/etc/pam.d/*登录认证拦截、密码复杂度、失败锁定
日志审计文件/var/log/lastlog每个用户最后一次登录
/var/log/wtmp全部成功登录/注销记录
/var/log/btmp全部失败登录/暴力破解记录

10.2 运维日常速查清单

任务命令 / 文件
查看用户信息getent passwd 用户名grep ^用户名 /etc/passwd
查看所有可登录用户grep "/bin/bash" /etc/passwd
查看禁止登录用户grep "/sbin/nologin" /etc/passwd
安全编辑 passwdvipw
查看密码安全配置cat /etc/shadow
查看密码策略chage -l 用户名
强制用户下次登录改密码chage -d 0 用户名passwd -e 用户名
锁定用户密码passwd -l 用户名usermod -L 用户名
解锁用户密码passwd -u 用户名usermod -U 用户名
修改 Shell 禁止登录usermod -s /sbin/nologin 用户名
设定账户失效日期chage -E "2025-12-31" 用户名
查看全局登录策略cat /etc/login.defs
查看所有成功登录last
查看某用户成功登录last 用户名
查看失败登录记录lastb
实时分析暴力破解 IP`lastb
查看用户最后登录lastlog -u 用户名
检查并修改全局密码默认vim /etc/login.defs
重置用户失败计数(faillock)faillock --user 用户名 --reset(CentOS 8+ / Ubuntu)
修改用户密码passwd 用户名
PAM 防爆破配置system-authcommon-auth 中加入 pam_faillock.so deny=5 unlock_time=1800

本文作者:zzz

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!