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,使后续比对失去基线。