必须显式设置 PermitEmptyPasswords no 并重启 SSH 服务,同时禁用 PermitRootLogin、关闭 PasswordAuthentication、限制 AllowUsers,并清查 /etc/shadow 中空密码账户,配合 LogLevel VERBOSE 日志验证拦截效果。

直接在 /etc/ssh/sshd_config 中设置 PermitEmptyPasswords no,就能从协议层拒绝所有空密码登录尝试——这不是补丁,是源头拦截。
确认并启用空密码拦截机制
该参数默认多数为 no,但不可依赖默认值。必须显式配置并验证:
- 用
sudo nano /etc/ssh/sshd_config打开配置文件,定位到#PermitEmptyPasswords yes或类似注释行 - 取消注释并改为
PermitEmptyPasswords no;若整行不存在,则手动添加这一行(不带#号) - 保存后执行
sudo sshd -t检查语法是否正确,无报错再重启服务:sudo systemctl restart sshd
配套必须关闭的“后门”路径
仅设 PermitEmptyPasswords no 不够,还需堵住其他可能绕过它的路径:
-
PermitRootLogin no:禁用 root 直接远程登录,避免 root 账户被设为空密码后直通 -
PasswordAuthentication no(如已启用密钥登录):彻底关闭密码认证,空密码自然失效 -
AllowUsers或AllowGroups:明确指定可登录用户/组,防止意外账户混入
主动排查现存空密码账户
配置生效前,先清查系统里是否已有空密码账户,否则攻击者可能在你重启前就完成登录:
- 运行
sudo awk -F: '($2 == "" || $2 == "*") {print $1}' /etc/shadow,列出所有无密码或锁定状态的账户 - 对每个结果账户,用
sudo passwd -e <username>强制其下次登录必须改密,或直接sudo usermod -p '*' <username>锁定 - 检查
/etc/passwd中 shell 字段是否为/bin/bash等交互式 shell,非必要账户应设为/usr/sbin/nologin
日志与监控联动验证效果
配置不是一劳永逸,需靠日志确认它真正在起作用:
- 设置
LogLevel VERBOSE,使每次认证失败都记录具体原因(含是否因空密码被拒) - 观察
/var/log/auth.log或/var/log/secure,搜索Failed password和empty password关键词 - 若发现某账户仍被允许空密码登录,立即检查该账户是否在
AllowUsers白名单中,或是否存在 PAM 模块覆盖了 sshd 配置


















