直接在 /etc/shadow 中识别并禁用空密码账号是 Linux 安全运维最基础紧迫操作;空密码账号第二字段为空,可用 awk 命令定位,推荐 usermod -L 或 passwd -l 锁定而非删除,并验证 SSH 登录失败、服务正常及权限控制生效。

直接在 /etc/shadow 中识别并禁用空密码账号,是 Linux 安全运维中最基础、最紧迫的操作之一。空密码意味着攻击者只要知道用户名,就能绕过所有认证环节直接登录——这扇门一旦开着,无论系统在内网还是云上,都极易被自动化工具秒破。
快速定位空密码账号
/etc/shadow 的第二字段(以冒号分隔)存储加密密码。该字段为空字符串(username::19089:0:99999:7:::),就代表该用户未设密码。执行以下任一命令即可精准识别:
sudo awk -F: '($2 == "") {print $1}' /etc/shadow-
sudo awk -F: 'length($2) == 0 {print $1}' /etc/shadow(兼容性更强)
若输出用户名(如 test、backup、ftp),说明存在高危账号;无输出则当前无空密码账户。
安全禁用:锁定而非删除
空密码账号通常不是“垃圾”,而是因配置疏忽遗留的隐患。盲目 userdel 可能导致依赖该账号的服务崩溃(如某些监控脚本、日志轮转任务)。推荐使用锁定方式,既阻断登录,又保留账户结构供审计:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
sudo usermod -L username:在 shadow 密码字段前加!,彻底禁止所有认证方式(SSH、su、login) -
sudo passwd -l username:效果相同,语义更直观 - 对已知仅用于服务调用的系统账户(如
redis、mysql),可同步改 shell:sudo usermod -s /usr/sbin/nologin username
锁定后,cat /etc/shadow 中对应行会变成 username:!$6$... 或 username:!!...,表示无法通过密码认证。
验证是否真正生效
改完不能只看命令没报错,必须实测权限是否落地:
- 切换到普通用户(如
su - nobody),执行cat /etc/shadow 2>/dev/null || echo "blocked",输出blocked才说明文件权限受控 - 尝试用该账号 SSH 登录(如
ssh username@localhost),应立即拒绝,不提示输密码 - 检查关键服务是否仍正常运行(如
systemctl status nginx),避免误锁服务账户
防止复发:从源头堵住空密码路径
一次清理不能一劳永逸。需同步加固新建流程与系统策略:
- 新建用户时强制设密:
sudo useradd -m -s /bin/bash username && sudo passwd username,严禁跳过passwd - 检查 PAM 配置:
grep -r "nullok\|obscure" /etc/pam.d/,移除或注释掉允许空密码的参数(如nullok) - 确认
/etc/login.defs中PASS_MIN_LEN≥ 8,PASS_MIN_DAYS> 0,避免弱策略放行空口令 - 将空密码扫描加入定时任务,例如每周执行:
0 0 * * 0 sudo awk -F: '($2=="") {print $1}' /etc/shadow | mail -s "空密码告警" admin@example.com

















