空口令账户判定依据是/etc/shadow第二字段为空或"!!",需结合/etc/passwd中UID=0及shell、SSH、PAM配置综合评估风险,并用usermod -L锁定而非删除。

直接用 awk 扫 /etc/shadow 第二字段是否为空
空口令账户的判定依据非常明确:在 /etc/shadow 中,密码字段(第二列)为空字符串或仅含 !!,即代表该账户未设置密码,可被免密登录(本地或远程,取决于 shell 和 PAM 配置)。执行以下命令即可精准识别:
-
awk -F: '($2 == "") {print $1}' /etc/shadow—— 匹配第二字段完全为空的行 -
awk -F: '($2 == "!!") {print $1}' /etc/shadow—— 显式匹配!!(常见于新建但未设密的用户) -
awk -F: 'length($2) == 0 {print $1}' /etc/shadow—— 更健壮,兼容换行符/空白干扰
有输出即存在高危账户;无输出不代表绝对安全——需同步检查是否有人手动清空了密码字段但未触发 !! 写入(极少见,但真实发生过)。
别只看 /etc/shadow,还得确认这些账号能否实际登录
一个账户即使密码字段为空,也不一定构成“可利用风险”。关键要看它的登录能力是否被其他机制阻断:
- 检查
/etc/passwd中对应用户的 shell 字段:grep "^username:" /etc/passwd | cut -d: -f7;若为/sbin/nologin或/bin/false,则无法交互式登录,风险大幅降低 - 检查 SSH 登录限制:
sshd_config中的AllowUsers、DenyUsers或PermitEmptyPasswords no(默认为no,但必须确认) - 注意 PAM 配置:
/etc/pam.d/sshd或/etc/pam.d/common-auth中若含nullok参数,可能允许空口令通过认证(应移除)
典型误判场景:某服务账户 backup 在 /etc/shadow 中密码为空,但其 shell 是 /usr/sbin/nologin,且未开放 SSH 权限——它不构成远程攻击入口,但本地提权链中仍可能被滥用。
usermod -L 锁定比 passwd -l 更可靠,但别锁错人
发现空口令账户后,优先锁定而非删掉。两者效果相同(均在 shadow 密码字段前加 !),但 usermod -L 更直观、更少副作用:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
usermod -L username—— 推荐,语义清晰,不依赖当前密码状态 -
passwd -l username—— 等效,但部分旧系统对已空口令账户执行时可能报错或静默失败 -
绝对避免
userdel username—— 可能导致 cron、systemd 服务、日志轮转脚本等因找不到 UID 而异常
锁定后验证:sudo su - username -c 'echo ok' 应失败;同时检查 getent shadow username 输出第二字段是否以 ! 开头。
自动化巡检必须覆盖 root 权限 + 空口令双重条件
单独查空口令不够——攻击者最想拿到的是「空口令 + UID 0」的组合。一次命令就能揪出这种致命账户:
awk -F: '($2 == "" || $2 == "!!") {u[$1]=$0} END {while((getline line 0) {split(line, a, ":"); if(a[3] == 0 && u[a[1]]) print a[1]}}' /etc/shadow
更实用的写法是分步检查并取交集:
awk -F: '($2 == "" || $2 == "!!") {print $1}' /etc/shadow > empty_pw.txtawk -F: '($3 == 0) {print $1}' /etc/passwd > uid0.txtcomm -12 —— 输出同时满足两个条件的用户名
这类账户(如非 root 的 admin 或 test)必须立即处置——它们绕过所有常规权限控制,是红队必打点。日常巡检脚本里漏掉这个交叉检查,等于没做。










