shadow 空口令与锁定状态检查
口令哈希存放在 /etc/shadow,每一行第二个字段就是关键信息:为空表示该账号不需要口令即可登录;以感叹号或星号开头表示口令被禁用或不接受口令认证;以美元符号开头则是各类加密算法的哈希。把这三类区分清楚,就能在账号排查时快速找出「看起来禁用了、实际还能用」的账号——尤其要留意星号,它只是不接受口令认证,账号本身仍可被密钥登录。
基本信息
| 文件与权限 | /etc/shadow,通常为 600 且属主 root:shadow,普通用户不可读 |
|---|---|
| 第二字段含义 | 空表示无口令;感叹号或星号表示禁用;美元符号开头为哈希 |
| 哈希前缀 | $1$ MD5、$5$ SHA-256、$6$ SHA-512、$y$ yescrypt 等 |
| 检查方式 | 按冒号分列过滤第二字段;passwd -S 查看单个账号状态 |
| 权限要求 | 读取需 root;修改必须通过 passwd、usermod 等命令 |
| 对比线索 | Debian 系可用 /etc/shadow- 上一版备份做差异比对 |
典型使用场景
- 排查存在空口令的账号,这是最直接的登录风险
- 确认后门账号是否配置了口令、口令是新设还是历史遗留
- 核对系统账号是否处于不可登录状态
- 清理账号后验证其口令确实已失效
- 做合规检查时确认没有可密码登录的高权限账号
找空口令与锁定状态
找空口令与锁定状态
sudo awk -F: '($2=="") {print $1, "空口令"}' /etc/shadow # 空口令账号
sudo awk -F: '($2 ~ /^[!*]/) {print $1, "已禁用/不接受口令"}' /etc/shadow | head -n 20
sudo awk -F: 'length($2)>0 && $2 !~ /^[!*]/ {print $1, substr($2,1,3)}' /etc/shadow | head -n 20 # 哈希算法
sudo passwd -S root; sudo passwd -S 某个账号 # 单账号状态
sudo ls -l --time-style=full-iso /etc/shadow /etc/shadow- # 改动时间与备份对比
sudo diff /etc/shadow- /etc/shadow 2>/dev/null | head -n 20 # Debian 系看差异行第二字段读法
| 取值 | 含义 | 风险提示 |
|---|---|---|
| 为空 | 不需要口令即可登录 | 最高风险,等同于公开入口 |
| 以 ! 开头 | 账号口令被锁定 | 常见于系统账号,但仍可被其他方式登录 |
| 以 * 开头 | 不接受口令认证 | 并非万能锁:配置了公钥仍可登录 |
| $1$ | MD5 口令哈希 | 算法过旧,建议升级为更强的哈希 |
| $5$ 或 $6$ | SHA-256 或 SHA-512 哈希 | 较新的常见取值 |
| $y$ | yescrypt 哈希 | 部分新发行版的默认算法 |
不要手工编辑 shadow 文件:格式或字段顺序写错会导致账号无法登录,甚至整个认证体系异常。修改口令与锁定状态一律使用 passwd、usermod、chage 这类命令,并保留改动前的备份。
不同发行版对锁定记号的语义略有差异:判断某个账号是否真的无法登录,最好用 passwd -S 的输出确认,而不是只看字段第一个字符,避免把「不接受口令」误当作「完全不可登录」。