两个账号文件的分工
理解 /etc/passwd 与 /etc/shadow 的字段结构是排查登录问题的基本功。passwd 有七段:用户名、密码占位符、UID、GID、注释、家目录、登录 shell。真正的密码哈希在 shadow 里,共九段:密码哈希、最后修改日期、最短使用天数、最长使用天数、过期前警告天数、宽限期、失效日期与保留字段。这种分工来自安全考虑:passwd 需要被大量程序读取,所以把哈希挪进只有 root 能读的 shadow,避免离线暴力破解。
基本信息
| 适用平台 | Linux(由 shadow-utils 维护,格式见 man 5 passwd 与 man 5 shadow) |
|---|---|
| 文件权限 | passwd 通常 644 所有用户可读;shadow 通常 600 且属主为 root |
| passwd 字段 | 用户名:密码占位:UID:GID:注释:家目录:登录 shell |
| shadow 字段 | 用户名:密码哈希:最后修改日:最短:最长:警告:宽限:失效日:保留 |
| 密码位特殊值 | 空表示无密码、! 或 !! 表示锁定、* 表示不可用的哈希占位 |
典型使用场景
- 用户无法登录:确认 shell、家目录、账号锁定与失效日期
- 授权核对:检查 UID 与 GID 是否与预期一致
- 口令策略:查看密码老化与过期规则是否生效
- 安全审计:找出 UID 为 0 的额外账号与无密码账号
- 账号清理:删除用户前后核对两个文件是否同步变更
常用示例
常用示例
grep deploy /etc/passwd
sudo grep deploy /etc/shadow
awk -F: '{print $1,$3,$6,$7}' /etc/passwd | head
awk -F: '$3==0{print $1}' /etc/passwd # 找出全部 UID 0 账号
sudo passwd -S deploy # 账号与口令状态摘要
sudo chage -l deploy # 查看口令老化策略shadow 字段序读法
| 字段 | 含义 | 说明 |
|---|---|---|
| 用户名 | 账号名 | 与 passwd 中的账号对应 |
| 密码哈希 | 加密口令或锁定标记 | 空、!、!!、* 各自含义不同 |
| 最后修改日 | 自 1970-01-01 起的天数 | 用于计算口令年龄 |
| 最短与最长 | 口令最短使用期与最长有效期 | 配合策略校验,最长到期后强制改密 |
| 警告与宽限 | 过期前警告天数与宽限天数 | 影响登录提示与缓冲期 |
| 失效日期 | 账号整体失效日,同样按天计 | 到点后账号不可登录 |
不要手工编辑 shadow:用 usermod、chage、passwd 等工具维护。直接改很容易造成字段错位或哈希损坏,使账号彻底无法登录。
passwd 第二段的 x 只是占位符,真正的哈希在 shadow。把哈希写回 passwd 是历史遗留做法,在当前实现下属于高风险配置。