有没有一种方法可以告诉 SSH 守护进程,“当远程设备尝试通过 SSH 连接时,验证authorized_keys,但如果没有提供密钥,则接受一次性密码,以便用户可以使用 ssh-copy-id 来提供它以供后续尝试”?
语境: 我希望能够设置一个 Linux 服务器,以便用户可以通过 SSH 进入该服务器,但我想使用 RSA 密钥对进行身份验证。我还有几个我希望能够连接的设备,因此这意味着提供多个密钥对(不是问题)。
本质上,我想使用 OTP 和 ssh-copy-id 从当前被拒绝访问的设备(因为它尚未提供公钥)向authorized_keys 添加条目。我目前必须从一台机器通过 SSH 登录能连接,编辑 sshd_config 文件以允许使用密码,然后使用静态密码复制 id,关闭密码身份验证并重新启动守护程序。我更喜欢一种从系统获取 OTP 的方法,然后使用它并继续工作......
答案1
公钥身份验证默认打开,并且具有比密码身份验证更高的优先级(由 PAM 处理或直接处理)。
sshd_config
您可以在选项中进行设置UsePAM yes
(Red Hat 上默认),这将推迟对 PAM 的身份验证——这是在/etc/pam.d/sshd
(在某些系统上可能略有不同)中配置的。
对于 OTP,您可以使用google_authenticator
或其他一些一次性密码的开放实现。这里有很多操作方法。您可以尝试搜索双因素身份验证,但基本上它是添加一行这样的
auth required pam_google_authenticator.so
并/etc/pam.d/sshd
进行一些配置:Arch对此有很好的说明:https://wiki.archlinux.org/index.php/Google_Authenticator
如果一次性密码或令牌丢失,仅使用一次性密码,而不使用第二个因素可能会存在潜在风险 - 我建议您不要采用这种方式,而是实施双因素身份验证而不是仅使用一次性密码。