能否仅为用户配置SSH密码,不设置本地登录密码?解析PermitEmptyPasswords风险
嘿,这个需求很实用!核心就是要把本地登录和SSH登录的认证逻辑拆分开,既不用开启危险的PermitEmptyPasswords yes,又能实现「本地无需登录密码、SSH必须验证密码」的效果。下面给你两种靠谱的方案:
这是最安全也最容易维护的方式,思路是给用户设置一个SSH专用密码,然后让本地登录直接跳过密码校验:
步骤1:设置SSH登录密码
先给目标用户设置一个密码(这个就是后续SSH登录要用的密码):
sudo passwd your_username
按照提示输入并确认密码即可。
步骤2:配置本地登录免密
编辑本地登录的PAM配置文件/etc/pam.d/login,在auth段的最上方添加一行:
auth sufficient pam_succeed_if.so user = your_username quiet
这行规则的意思是:如果登录的是指定用户,直接通过认证,不需要输入密码。
如果想让所有本地用户都免密登录(不推荐,风险较高),可以把user = your_username去掉,改成:
auth sufficient pam_succeed_if.so quiet
步骤3:确保SSH强制密码验证
编辑SSH服务配置文件/etc/ssh/sshd_config,检查并确保以下配置项:
PasswordAuthentication yes ChallengeResponseAuthentication no UsePAM yes PermitEmptyPasswords no # 保持默认的no,绝对不要改成yes
保存后重启SSH服务生效:
sudo systemctl restart sshd
这样配置后,本地登录该用户时直接进入系统,无需输入密码;而通过SSH登录时,必须输入你刚才设置的密码,完全符合你的需求,而且安全性拉满。
如果你坚持要让用户的本地密码为空,也可以通过PAM配置实现,但风险相对高一点:
步骤1:清除用户本地密码
执行命令清除用户的本地密码:
sudo passwd -d your_username
步骤2:配置本地登录允许空密码
编辑/etc/pam.d/login,修改auth相关的规则,确保包含:
auth sufficient pam_unix.so nullok
这允许本地登录时使用空密码(直接进入)。
步骤3:配置SSH强制非空密码认证
编辑/etc/pam.d/sshd,添加或修改规则:
auth required pam_unix.so nonull
注意:这个方案存在逻辑矛盾——用户本地密码为空,但SSH要求非空密码,你需要额外给SSH配置单独的密码认证(比如PAM第三方模块或SSH虚拟用户),配置复杂度高且容易出问题,因此更推荐方案1。
内容的提问来源于stack exchange,提问作者XuMuK




