尝试使用公共密钥(无密码)和可在Ubuntu 14.04.1上运行的Google Authenticator获取SSH


20

我正在使用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也取决于订单吗?

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

Answers:


28

使其运行良好,首先做了:

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

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

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


因此,为了后代,我意识到了我的问题。我也尝试过PasswordAuthentication no,但是不是。问题是/是〜/ .ssh / config文件中有/有ControlMaster autoControlPath指令。我想确保自己没有被锁定,所以我总是将SSH会话保持打开状态。由于我的计算机只会重复使用它们,所以我总是在系统不要求令牌的情况下进入。我将您的答案标记为正确,因为遵循该答案的人确实可以正常工作。谢谢!
JT。

2
我用的CentOS 7.我有PasswordAuthentication noChallengeResponseAuthentication yesAuthenticationMethods publickey,keyboard-interactive,和UsePAM yessshd_config。它会验证我的密钥,然后要求我提供Google Authenticator令牌,然后还要求我提供密码。让我完成所有这三个操作,不能跳过任何一个。我也AuthenticationMethods publickey,keyboard-interactive:pam按照手册页的建议进行了尝试,但这没有任何改变。有任何想法吗?
尼克·威廉姆斯

6
@NickWilliams我遇到了同样的问题。对我来说,解决此问题的原因是我需要赞扬@include common-auth答案显示的内容。我只是以为最初是对pam_google_authenticator/etc/pam.d/sshd中该行的注释。
freb 2015年

5
谢谢!我的解决方案不完全相同(我需要注释掉auth substack password-auth),但是您的注释解决了我的问题!
尼克·威廉姆斯


7

我终于可以通过将其放置auth [success=done new_authtok_reqd=done default=die] pam_google_authenticator.so nullok在的顶部来使此工作正常进行/etc/pam.d/sshd

根据pam.d手册页

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

因此,控制值[success=done new_authtok_reqd=done default=die]之间存在某种混合,因为我们希望两者都具有行为:如果成功,则立即终止(足够),如果失败,也立即终止(必要)。sufficientrequisite

请注意,nullokpam_google_authenticator.so 的参数表示,如果~/.google_authenticator未为用户找到文件,则公用密钥身份验证将照常进行。如果我只想锁定2FA帐户的一部分,这将很有用。


6

Linus Kendall的答案应该适用于较旧的系统,但在较新的Linux机器上则存在问题;在基于Arch Linux的Web服务器上,该配置导致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根目录上的权限仅写(例如chown root:root /path/to/ftp/dirchmod 755 /path/to/ftp/dir。。该目录上方的所有父级也都需要安全权限。我通常这样做的方法是/home/shared/user创建chroot目录,创建一个目录(例如“数据”),然后挂载我想共享的任何目录,如下所示:sudo mount -o bind /path/to/ftp/dir /home/shared/user/data

如果执行所有这些步骤,则将为ssh用户提供公钥+谷歌身份验证器登录名,以及一个功能受密码保护的sftp帐户,用于数据传输。


这很好。而且由于某种原因,我只是不乐于评论common-auth,所以这比Linus的解决方案更理想。
卢克·萨潘

非常感谢!浪费了一个晚上调试ssh,想知道为什么我仍然必须在pubkey + authcode之后键入密码……
felix021
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.