空口令为什么最危险
shadow 文件第二字段存放口令哈希:字段为空串表示该账号根本没有口令,任何人只要知道账号名就能直接登录,连猜口令这一步都省了。这不是理论风险,老设备、救援镜像、误操作留下的空口令账号长期存在,扫描器与蠕虫会直接识别并利用。锁定状态(字段以感叹号或星号开头)与空字段是两回事,必须分开判断。
基本信息
| 加固项 | 禁止存在空口令账号 |
|---|---|
| 适用平台 | Linux(RHEL/CentOS/Debian/Ubuntu) |
| 风险等级 | 高 |
| 判定标准 | /etc/shadow 第二字段为空串即空口令 |
| 区分要点 | 以感叹号或星号开头表示已锁定,不属于空口令 |
典型使用场景
- 基线核查:给出「不存在空口令账号」的结论与证据
- 接手存量机器时摸底:老系统里空口令账号出现概率明显更高
- 应急响应排查:攻击者把账号口令清空以维持访问是常见手法
- 批量整改前后的对照:整改前记录清单,整改后复核清零
- 合规测评:身份鉴别条款明确要求不存在无口令账号
核查命令
核查命令
awk -F: '($2 == "") { print $1 }' /etc/shadow # 空口令账号,预期无输出
awk -F: '($2 ~ /^[!*]/) { print $1 }' /etc/shadow | head # 已锁定账号,属正常
passwd -S -a 2>/dev/null | head -30 # P 有口令 L 锁定 NP 无口令可登录
awk -F: '($2 == "") { print $1 }' /etc/shadow | wc -l # 空口令账号数量shadow 第二字段判读
| 字段内容 | 含义 | 处置 |
|---|---|---|
| 空串 | 无口令,可直接登录 | 最高优先级,立即设置口令或锁定 |
| 感叹号开头 | 口令被锁定 | 正常,服务账号常见的状态 |
| 星号开头 | 无有效哈希,不可登录 | 正常,多为系统账号占位 |
| 美元符开头的哈希 | 存在加密口令 | 正常,继续核查强度与有效期 |
| 双感叹号 | 从未设置过口令且已锁定 | 确认该账号是否仍需交互登录 |
处置
处置
passwd someone # 交互式设置强口令(推荐,立即生效)
passwd -l someone # 或直接锁定,用于确认不再使用的账号
chage -l someone # 查看口令有效期,确认策略是否覆盖该账号
awk -F: '($2 == "") { print $1 }' /etc/shadow # 复核,应无输出不要直接编辑 /etc/shadow,也不要用 echo 追加写入:文件被并发写坏会导致所有账号无法登录。统一用 passwd、usermod、chage 这类带锁机制的命令操作,改完立即复核。
passwd -S 的 NP 状态表示无口令可登录,比空字段更隐蔽,容易被只查字段的脚本漏掉;救援模式与部分容器基础镜像里 root 的字段是星号或感叹号,那属于锁定而非空口令,核查结论里要写清区分口径。
与口令策略联动
清空一个空口令账号只是止血。更完整的做法是同时确认三件事:口令复杂度策略已配置、失败锁定已启用、账号口令有效期已设置,并且存量账号也被 chage 覆盖到。否则清理完一批,下一批仍会因策略缺失而出现。