Linux 系统登录核心文件超全详解 最近在工作闲暇之余重新回顾了《鸟哥的私房菜》看到 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步流程所有登录报错、权限异常、登录失败都能在这个流程中精准定位根源用户输入账号、密码发起登录请求系统读取/etc/passwd校验账号是否存在、是否为可登录用户读取/etc/shadow校验密码密文、账号有效期、锁定状态读取/etc/login.defs匹配全局登录规则、密码策略、UID/GID权限规范调用 PAM认证模块执行密码复杂度、登录次数、权限拦截校验读取/etc/group、/etc/gshadow加载用户所属用户组权限认证通过则分配Shell环境、登录终端认证失败则拒绝登录全程写入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/passwd2.4 系统内置用户是干嘛的你会发现/etc/passwd里不仅有你创建的zhangsan还有一大堆诸如bin、daemon、nobody的用户它们的 Shell 基本都是/sbin/nologin。rootUID0系统最高权限管理员拥有所有权限唯一超级用户。禁止修改 root 的 UID0 属性会直接丢失超级权限系统崩溃。bin、daemon系统内置服务用户用于运行系统基础进程无登录权限。nobody低权限匿名用户UID 通常是 65534用于运行第三方服务权限极低防止提权攻击。这些系统用户是为了“进程所有权分离”。比如nginx用户跑 Nginx 进程一旦进程被攻破黑客拿到的只是一个没有 Shell 的受限账户无法直接登陆系统极大降低了风险。禁止随意删除系统内置用户会导致系统服务启动失败。2.5 修改的正确姿势与风险生产禁忌一严禁直接vi /etc/passwd随意增删改原因可能破坏文件锁如果有其他进程同时在写虽然不常见会损坏文件。万一多按了个空格、少个冒号所有依赖此文件的操作包括su、sudo、登录都可能直接挂掉。手动编辑极易出现隐藏格式错误导致全系统用户无法登录、系统瘫痪。正确修改方式修改用户信息使用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文件中。passwd的x其实就是在对你说密码在我兄弟那我没密码别找我。文件基础属性速览文件路径/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-512CentOS 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 -L和usermod -U。完全禁止用户登录包含密钥等方式可以改 shell 为/sbin/nologin或将账户过期日期设为 1。usermod -s /sbin/nologin zhangsan # 或 chage -E 1970-01-01 zhangsan3.5 生产核心禁忌绝对禁止手动 vi 编辑 shadow 文件一旦密文格式错乱用户直接永久无法登录且无法修复。统一使用usermod、passwd、chage等系统命令自动写入。四、用户组核心文件/etc/group 与 /etc/gshadow4.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 # uid1000(zhangsan) gid1001(develop) groups1001(develop),27(sudo)这里主组就是develop同时还属于sudo附属组。修改命令# 改变用户主组 usermod -g ops zhangsan # 添加附属组 usermod -aG docker zhangsan # 编辑组文件推荐 vigr # 带锁编辑 /etc/group vigr -s # 编辑 /etc/gshadow4.2 /etc/gshadow —— 几乎用不上的组密码文件作用存储用户组密码、组管理员信息权限极高默认 600 权限。格式组名:加密密码:组管理员:成员名单绝大多数情况下组密码是!或*即禁用。它的作用在于当一个非组成员临时想切换到该组访问文件时他可以使用newgrp 组名命令然后输入组密码来临时获取该组权限。不过在生产环境我们更倾向于通过sudo或直接将用户加入附属组来实现很少启用组密码。企业运维使用规范生产环境极少使用组密码多用于临时赋予用户组权限、无需添加用户入组。组密码为空、!、!!均代表无组密码禁止随意配置组密码避免权限泄露。支持设置组管理员可独立管理组内成员无需 root 权限。五、登录全局控制/etc/login.defs5.1 文件定位/etc/login.defs这个文件非常有意思它就像是系统的**“用户创建与密码策略的默认模具”**。它是 Linux 系统登录、密码策略、用户创建规则的全局总开关所有新建用户、登录校验全部遵循该文件规则。重点它对已有用户完全没影响只控制useradd、groupadd等命令创建新用户/组时的默认值同时定义了一系列全局的安全限制。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 默认可能是 022CentOS 默认 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 是什么PAMPluggable Authentication Modules是一套可插拔认证模块是 Linux 登录的动态校验网关。它把登录认证的逻辑从应用程序中抽离出来。不论是login、sshd、sudo、passwd它们要做身份检查时都会调用自己对应的 PAM 配置文件通常在/etc/pam.d/下再由这些配置文件依次调用pam_unix.so、pam_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 deny5 unlock_time1800并在auth段尾部加入auth [defaultdie] pam_faillock.so authfail audit deny5 unlock_time1800 auth sufficient pam_faillock.so authsucc audit deny5 unlock_time1800解释连续 5 次密码错误锁定 1800 秒30分钟。deny5失败次数unlock_time解锁时间秒数。CentOS 7 使用pam_tally2auth required pam_tally2.so deny5 unlock_time1800 even_deny_root root_unlock_time600even_deny_root表示连 root 也锁省得被人无限撞库。Ubuntu 20.04 / 22.04Ubuntu 同样使用pam_faillock但配置在/etc/pam.d/common-auth中。编辑auth required pam_faillock.so preauth silent audit deny5 unlock_time1800 auth [defaultdie] pam_faillock.so authfail audit deny5 unlock_time1800 auth sufficient pam_faillock.so authsucc audit deny5 unlock_time1800配置完后可以通过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.logUbuntu或/var/log/secureCentOS这些明文日志记录了更详细的 PAM 认证过程比如“pam_unix(sshd: auth): authentication failure”我们可以精确定位时间、用户、来源 IP、端口等。grep Failed password /var/log/secure | grep -oP from \K\S | sort | uniq -c | sort -nr7.4 日志误删修复与轮转注意事项如果你不小心把/var/log/btmp删了lastb会报错无文件。可以这样恢复touch /var/log/btmp chmod 600 /var/log/btmp chown root:utmp /var/log/btmp # 注意属组可能是utmp或root视系统而定同样适用于wtmp和lastlogtouch /var/log/wtmp /var/log/lastlog chmod 664 /var/log/wtmp /var/log/lastlog chown root:utmp /var/log/wtmp /var/log/lastloglast和lastlog就会恢复正常只是历史数据没了而已。生产注意事项禁止随意删除 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 # 批量例如所有 UID1000 的用户 for u in $(awk -F: ($31000 $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手动修复用户登录异常账号无法登录时遵循以下排查链路passwd 账号是否存在→grep 用户名 /etc/passwdshadow 密码/锁定状态→passwd -S 用户名或chage -l 用户名login.defs 策略→ 检查是否有全局限制PAM 拦截规则→ 查看/var/log/secure是否有 PAM 拒绝记录日志报错信息→lastb查看失败记录中的具体原因案例5手动清空某用户失败登录计数faillock# 查看失败记录 faillock --user zhangsan # 重置 faillock --user zhangsan --reset如果用的还是pam_tally2pam_tally2 --user zhangsan --reset九、高频误区与生产禁忌9.1 严禁直接用 vi 修改 passwd / shadow / group / gshadow前面已经强调风险点在于两个文件对格式、字段、换行要求极致严格手动编辑极易出现隐藏格式错误导致全系统用户无法登录、系统瘫痪。可能损坏文件结构导致系统无法解析用户其他正在运行的程序可能同时读写造成竞态条件如果保存时权限变动可能引起更严重漏洞。唯一正确的文本编辑方式vipw—— 编辑 passwd保存时自动检查并同步 shadowvigr—— 编辑 group同时可能带 -s 编辑 gshadow或者干脆只用useradd、usermod、chage、passwd等系统命令自动写入。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实时分析暴力破解 IPlastb查看用户最后登录lastlog -u 用户名检查并修改全局密码默认vim /etc/login.defs重置用户失败计数faillockfaillock --user 用户名 --resetCentOS 8 / Ubuntu修改用户密码passwd 用户名PAM 防爆破配置在system-auth或common-auth中加入pam_faillock.so deny5 unlock_time1800本文为同步搬运内容原创首发于个人独立博客网站https://www.zheng-chang-ren.xyz平台更新优先级说明所有技术笔记、实验教程、踩坑总结均会优先发布、长期维护于个人独立博客CSDN 仅作为辅助分发渠道。若想查阅全部完整文集、获取最新首发内容建议收藏并优先访问我的个人博客网站。