OpenSSH_8.0p1默认禁用所有认证方法后客户端仍弹出密码提示的原因排查
嘿,我发现你踩了一个OpenSSH配置的坑——你误解了AuthenticationMethods none的实际作用!它根本不是“拒绝所有认证方法”,而是允许无需认证的登录,这完全和你想要的效果相反,这就是导致服务器行为矛盾的核心原因。
为什么会出现这种矛盾现象?
看你的服务器日志,当dummy用户尝试登录时,sshd首先处理了method none的请求,但因为你全局禁用了所有认证方法,这个无认证请求被拒绝了。但客户端这边没收到明确的“所有认证都不允许”的响应,就开始按自己的默认序列尝试各种认证方法(gssapi-with-mic、publickey、keyboard-interactive、password)。而服务器虽然全局关了这些方法,但因为没有正确限制认证方法的组合,还是会逐个处理这些请求,直到全部失败,这就导致客户端会一步步提示你输入密码。
正确的配置方案
要实现“默认拒绝所有用户,仅允许user1通过指定认证组合登录”,你需要调整配置如下:
# 全局默认禁用所有认证方式,不给任何未授权用户留机会 PasswordAuthentication no HostbasedAuthentication no ChallengeResponseAuthentication no KerberosAuthentication no GSSAPIAuthentication no PubkeyAuthentication no # 重点:不要设置AuthenticationMethods none! # 仅对user1开放指定的认证组合 Match User user1 PasswordAuthentication yes PubkeyAuthentication yes ChallengeResponseAuthentication yes # 要支持keyboard-interactive必须开启这个 AuthenticationMethods publickey,password publickey,keyboard-interactive
配置逻辑说明
- 全局锁死认证:全局配置把所有认证方法都关闭,这样任何不在Match块里的用户,连认证的机会都没有,sshd会直接断开连接,不会让客户端进入输入密码的流程。
- 精准授权特定用户:针对user1的Match块,我们开启了需要的认证方法,并用
AuthenticationMethods强制要求必须是“公钥+密码”或者“公钥+键盘交互”的组合登录,完全符合你的需求。 - 关于UsePAM no:如果你设置了
UsePAM no,那ChallengeResponseAuthentication控制的是sshd内置的键盘交互认证,所以必须开启它才能支持keyboard-interactive方法。
配置完重启sshd后,再用dummy用户尝试登录,你会发现客户端直接收到“Permission denied”,不会再提示输入密码了。
内容的提问来源于stack exchange,提问作者xeor
相关产品推荐
相关产品推荐

