如何使用密码生成器进行远程登录的身份验证?

我想通过添加另一因素,即密码生成器设备或手机上的密码生成应用程序,来加强我的SSH登录身份验证。默认设置中唯一明显的选项是固定密码和密钥对。我该如何做到这一点?
(如果我使用密码加密码生成器,这将提供两步验证(2FA):密码是“我知道的”,而密码是“我拥有的”。)
3个回答

一种做法是使用Google提供的工具Google Authenticator
  1. 安装libpam-google-authenticator Install libpam-google-authenticator

    • 或者只需执行sudo apt-get install libpam-google-authenticator
  2. 编辑/etc/pam.d/sshd以包含该模块:

    • sudoedit /etc/pam.d/sshd
    • 然后在文件顶部添加以下行并保存:

      auth required pam_google_authenticator.so
      
  3. 编辑SSH配置文件以启用挑战:

    • sudoedit /etc/ssh/sshd_config,然后将响应身份验证从:

      ChallengeResponseAuthentication no 
      

      更改为

      ChallengeResponseAuthentication yes
      

      然后保存文件。

  4. sudo restart ssh以重新启动SSH

  5. 运行google-authenticator

    • 这将提供您的密钥、验证码和紧急备用码。它还会询问您一些速率限制问题。

移动应用程序:

你需要其中一个来在另一台设备上接收验证码。

相关和有用的:

大部分答案来自Jean-Francois Theroux的博客文章,但已经更新。 Google Authenticator Wiki Ubuntu上使用Google Authenticator的安全指南 使用Google Authenticator实现SSH双因素认证 如果您正在使用无密码登录的SSH密钥,我理解您只能选择其中一种方式,请参考此问题:如何设置无密码SSH登录? 如果您正在使用Puppet,可以在这里找到一个Puppet模块:https://github.com/camptocamp/puppet-googleauthenticator 请参考Maarten的回答和链接到GitHub问题的原因,了解为什么需要在pam配置文件的顶部添加.so行:https://askubuntu.com/a/668398
请注意,将密码与一次性验证码结合使用是双因素认证:它结合了“你所知道的”(密码)和“你所拥有的”(验证码生成设备)。另一方面,如果您将一次性验证码与SSH密钥对结合使用,则完全是关于“你所拥有的”。当两个身份验证因素属于相同类型时,您并没有进行双因素认证;这有时被称为“一点五因素认证”。

在Ubuntu 22.04中,ChallengeResponseAuthentication被替换为KbdInteractiveAuthentication/etc/ssh/sshd_config文件中。 - mark

Google Authenticator对于个人服务器来说还不错,但你可能会发现它与现有的身份基础设施不太匹配。如果你想探索其他选项,考虑使用RADIUS作为认证协议和pam-radius插件。所有面向企业的双因素认证系统都支持radius。我们已经撰写了一份关于如何将WiKID双因素认证通过pam-radius添加到Ubuntu的文档。
使用radius可以将除SSH之外的其他系统与同一个认证服务器绑定。你还可以通过freeradius将认证请求路由到LDAP,然后再到你的双因素认证服务器,将授权与认证分离。顺便说一下,你也可以用AD做同样的事情。

我敦促大家将以下行放在上面而不是底部的/etc/pam.d/sshd中,如上述先前所述(现已更正):
auth required pam_google_authenticator.so

否则,您的系统将继续面临暴力攻击,从而危及两步验证的第一部分:您的密码。
首先,您需要输入验证码,然后再输入密码(无论验证码是否正确)。如果其中任何一个错误,您需要重新输入两者。您可以配置为相反的方式,但在当前默认的Ubuntu(15.04)sshd配置中,这可能会更加困难。
有关为什么需要这样做的详细信息,请查看此问题:

https://github.com/google/google-authenticator/issues/514