题 尝试在Ubuntu 14.04.1上使用公钥(无密码)+ google身份验证器进行SSH


我正在使用Ubuntu 14.04.1(使用OpenSSH 6.6和libpam-google-authenticator 20130529-2)。

我正在尝试设置公钥验证的SSH登录(没有密码),并提示用户输入来自Google验证器的代码。

遵循/调整这些说明已经获得了密码提示以及Google Auth提示:

我安装了包,编辑了我的 /etc/ssh/sshd_config 和 /etc/pam.d/ssh 档

/etc/ssh/sshd_config

ChallengeResponseAuthentication yes
AuthenticationMethods  publickey,keyboard-interactive
UsePAM yes

在底部 /etc/pam.d/ssh

auth required pam_google_authenticator.so nullok # (I want to give everyone a chance to set up their 2FA before removing "nullok")

我知道PAM依赖于订单,但是 sshd_config 也?

我究竟做错了什么?任何帮助,将不胜感激。


19
2017-09-19 15:42






答案:


它运作良好,首先做到了:

apt-get install libpam-google-authenticator

/etc/pam.d/sshd 我更改/添加了以下行(在顶部):

# @include common-auth
auth required pam_google_authenticator.so

并在 /etc/ssh/sshd_config

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no

运行良好,我现在收到公共密钥认证后的“验证码”提示。我不确定如何允许使用密码+令牌或密钥+令牌进行身份验证,因为我现在已经从PAM中有效地删除了密码身份验证方法。

使用Ubuntu 14.04.1 LTS(GNU / Linux 3.8.0-19-通用x86_64)和ssh -v:OpenSSH_6.6.1p1 Ubuntu-2ubuntu2,OpenSSL 1.0.1f 2014年1月6日


27
2017-09-29 19:19



所以,为了后人的缘故,我意识到了自己的问题。我也试过了 PasswordAuthentication no,但那不是它。问题在于我是否拥有过 ControlMaster auto 和 ControlPath 我的〜/ .ssh / config文件中的指令。我想确保我没有锁定自己,所以我总是打开SSH会话。由于我的计算机只是重用它们,所以我总是在没有系统要求令牌的情况下进入。我将你的答案标记为正确,因为有人跟随它确实会得到一个正常的工作。谢谢! - JT.
我正在使用CentOS 7.我有 PasswordAuthentication no, ChallengeResponseAuthentication yes, AuthenticationMethods publickey,keyboard-interactive,和 UsePAM yes 在 sshd_config。它验证了我的密钥 然后 问我的Google身份验证器令牌 然后也 问我的密码。让我做三个 - 不能跳过他们中的任何一个。我也试过了 AuthenticationMethods publickey,keyboard-interactive:pam 正如手册页所示,但这并没有改变任何东西。有任何想法吗? - Nick Williams
@NickWilliams我遇到了同样的问题。为我修好的是我需要赞扬的 @include common-auth 答案显示的那一行。我只是觉得这是一个评论 pam_google_authenticator 首先在/etc/pam.d/sshd中输入。 - freb
谢谢!我的解决方案并不完全相同(我需要发表评论 auth substack password-auth),但你的评论解决了我的问题! - Nick Williams
sysconfig.org.uk/two-factor-authentication-with-ssh.html - Christian


我终于能够通过放置来实现这一目标 auth [success=done new_authtok_reqd=done default=die] pam_google_authenticator.so nullok 在顶部 /etc/pam.d/sshd

根据 pam.d手册页

  • success=done 表示如果Google身份验证器注销,则不再执行身份验证,这意味着不会出现其他密码提示。
  • default=die 表示如果Google身份验证器拒绝登录尝试,则身份验证将立即失败,跳过密码提示。

所以 [success=done new_authtok_reqd=done default=die] 是一种混合之间的 sufficient 和 requisite 控制值,因为我们希望来自两者的行为:如果成功,立即终止(足够),如果失败,也立即终止(必需)。

请注意 nullok pam_google_authenticator.so的参数意味着如果a ~/.google_authenticator 找不到用户的文件,公钥验证正常进行。如果我想仅使用2FA锁定我的帐户的一部分,这非常有用。


7
2018-02-09 01:07





Linus Kendall的答案应该适用于较旧的系统,但在较新的Linux机器上则存在问题;在我的基于linux的网络服务器上,配置导致pam在收到我的ssh密钥后要求我的验证码和密码(即我需要全部3)。

一个更简单的解决方案,可以防止这个问题,并且应该适用于每个系统,是更改条目 /etc/pam.d/sshd至:

auth sufficient pam_google_authenticator.so

然后对Linus提到的``/ etc / ssh / sshd`进行相同的编辑:

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no

这应该在服务器接受您的公钥后询问您的身份验证器令牌。它不应该要求您的密码。

作为旁注,如果您希望拥有一个sftp用户帐户,您可能需要绕过Google身份验证器才能使其正常运行。以下是如何使用sftp监狱安全地执行此操作的建议。在 etc/ssh/sshd_config

Subsystem sftp internal-sftp
Match User ftp-user
  PasswordAuthentication yes
  AuthenticationMethods password
  ChrootDirectory /path/to/ftp/dir
  ForceCommand internal-sftp

您需要在/ path / to / ftp / dir root上写权限(例如 chown root:root /path/to/ftp/dirchmod 755 /path/to/ftp/dir。该目录上方的所有父级也需要安全权限。我通常这样做的方法是制作chroot目录 /home/shared/user,在那里创建一个目录(例如'data'),然后挂载我想要分享的目录,如下所示: sudo mount -o bind /path/to/ftp/dir /home/shared/user/data

如果您按照所有这些步骤操作,您将为您的ssh用户提供公钥+ Google身份验证器登录,并使用功能密码保护的sftp帐户进行数据传输。


6
2017-12-04 20:24



这很好用。而且由于某种原因,我只是觉得不能轻易地评论普通认证,这比Linus的解决方案更理想。 - Luke Sapan
非常感谢!浪费了一夜调试ssh,想知道为什么我仍然要在pubkey + authcode之后输入密码...... - felix021