首页/安全/取证与溯源速查/shadow 密码状态字段解读
Linux 取证135 条

shadow 密码状态字段解读

shadow 第二个字段表示口令状态:! 或 * 为不可登录、!! 为未设置、空表示空口令可登录;配合修改字段可还原口令变更窗口。

取证与溯源速查安全更新于 2026-10-13

shadow 口令位

/etc/shadow 的第二字段是口令哈希或锁定标记,普通用户不可读。字段为空表示该账号无需口令即可登录;以 ! 或 * 开头表示没有可用的口令哈希。取证判断账号能否被无口令登录时,必须把该字段与 /etc/passwd 里的 uid、shell 一起看。

基本信息

适用平台Linux(shadow-utils 体系)
文件/etc/shadow(口令在 /etc/passwd 中显示为 x)
权限RHEL 系 root:root 0000,Debian 系 root:shadow 0640
字段顺序登录名:口令:上次改密:最短:最长:警告:失效:账号过期:保留
口令位取值空=无口令,!=被锁定,*=无可用口令,!!=passwd -l 锁定
采集要求复制原件,同时记录 mtime/ctime 与 sha256

典型使用场景

  • 排查是否存在可空口令直接登录的账号
  • 判断账号是被锁定、口令失效还是账号已过期
  • 输出账号生命周期时间轴,用于与登录日志对齐
  • 与 /etc/passwd、/etc/group、sudoers 联动确认权限边界
  • 交接或合规检查时生成口令策略现状清单

最小示例

最小示例
sudo awk -F: '($2=="") {print "EMPTY:", $1}' /etc/shadow   # 口令位为空即无口令可登录
sudo awk -F: '($2 ~ /^!/) {print "LOCKED:", $1}' /etc/shadow  # ! 开头为锁定状态
stat -c '%n mtime=%y ctime=%z' /etc/shadow                    # 记录时间戳供时间线使用
chage -l alice                                                # 查看该账号的口令期限策略
sudo awk -F: '($3==0 || $3>20000) {print $1, "lastchg="$3}' /etc/shadow  # 改密时间为 0 或未来日期
sudo sha256sum /etc/shadow > shadow.sha256                     # 采集即固化哈希

输出逐列读法

字段含义异常信号
登录名账号名,需与 passwd 对齐shadow 有而 passwd 无的孤立条目
口令位哈希或锁定标记空字段=可无口令登录,优先处置
上次改密自 1970-01-01 起的天数为 0 或晚于当前日期说明被改写
最短/最长两次改密的最小与最大间隔天数最长 99999 等于基本不过期
警告/失效到期提醒天数与宽限天数失效 99999 表示口令永不过期
账号过期账号整体失效日期为具体日期时需核对是否已过期
口令策略基线在 /etc/login.defs 的 PASS_MAX_DAYS、PASS_MIN_LEN 等项;判断某账号是否合规要同时读 login.defs 与实际字段值。
同目录还有 /etc/shadow- 备份与 /etc/gshadow,备份文件的 mtime 常能反映上一次批量改密的时点。
发现空口令账号先记录、哈希与截图,再决定是否锁号;直接执行 passwd -l 或 usermod -L 会改写 ctime,使后续比对失去基线。

易错点

  • 把 * 与 ! 都当成锁定:* 多表示从未设置可用口令的系统账号,! 表示被锁定或口令未设置,报告里混用会得出相反结论
  • 只看 shadow 不看 passwd:uid 为 0 的重复账号、shell 为 /bin/bash 的系统账号才是真正的提权入口
  • 未固化哈希与时间戳就处置账号:passwd、usermod 会改写文件时间戳,事后无法证明原始状态
  • 漏掉文件 mtime/ctime:账号被增删改的时间点往往只保留在这两个时间戳和审计日志里

数据来源与参考

  • man 5 shadow(shadow-utils)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌