shadow 第二列在说什么
/etc/shadow 每行是『账户:口令字段:时效字段…』。第二列承载两类信息:口令哈希与状态标记。以 $6$ 开头是 SHA-512 哈希,$5$ 是 SHA-256,$1$ 是较弱的 MD5;以 ! 或 !! 开头表示该账户被锁定;字段为空表示无口令。巡检时看这一列的形态就能判断账户是否存在弱口令或空口令风险。
基本信息
| 文件位置 | /etc/shadow(仅 root 可读) |
|---|---|
| 字段结构 | 账户:哈希与状态:最后修改:最短:最长:警告:宽限:失效 |
| 哈希标识 | $6$ SHA-512、$5$ SHA-256、$1$ MD5 |
| 锁定标记 | 前缀 ! 或 !! 表示已锁定、无可用口令 |
| 空字段 | 第二列为空表示该账户无口令即可登录 |
| 读取权限 | root;普通用户读取会提示权限不足 |
典型使用场景
- 安全巡检时批量识别锁定账户与异常状态账户
- 迎检前确认没有空口令账户
- 排查登录失败时判断账户是被锁定还是口令过期
- 确认系统账户(daemon、bin 等)处于锁定状态
- 核对哈希算法是否已从弱算法升级
巡检命令(root)
巡检命令(root)
awk -F: '{print $1, substr($2,1,3)}' /etc/shadow | head -30 # 账户与哈希前缀
awk -F: '$2=="" {print "空口令账户:", $1}' /etc/shadow # 找出无口令账户,重点关注
awk -F: '{print substr($2,1,3)}' /etc/shadow | sort | uniq -c | sort -rn # 哈希与状态分布统计
awk -F: '$2 ~ /^\$/ {print $1}' /etc/shadow | wc -l # 统计有哈希的账户数量
passwd -S root # 单账户状态(P 有口令、L 锁定、NP 无口令)处置与核对
处置与核对
passwd -l olduser # 锁定账户(标准工具,会写入 ! 前缀)
passwd -u olduser # 解锁,仅在确认需要恢复时执行
usermod -L -s /sbin/nologin svcacct # 服务账户:锁定口令并禁止交互登录
awk -F: '$2 !~ /^[!*]/ && $2 != "" {print $1}' /etc/shadow # 列出当前可用口令登录的账户
ls -l /etc/shadow /etc/passwd # 确认文件权限与属主符合基线(shadow 应为 000 或 400)字段形态与含义
| 第二列形态 | 含义 | 是否可登录 |
|---|---|---|
| $6$开头的一长串 | SHA-512 哈希,账户可正常登录 | 可以(口令正确即可) |
| !$6$… | 已锁定(passwd -l 写入) | 不可以 |
| !! 或 * | 从未设置或系统账户占位 | 不可以 |
| 空字段 | 无口令,认证直接通过 | 可以,最高风险项 |
| $1$ 开头 | MD5 弱算法哈希 | 可以,建议升级算法 |
锁定标记的语义随实现略有差异:! 与 !! 代表不同来源的锁定,判断时结合 passwd -S 的结果一起看,不要只看前缀。
变更账户状态统一用 passwd、usermod 这类标准工具,不要手工编辑 /etc/shadow:字段位置与格式一旦写错,登录相关的行为会变得难以预测。