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

JT.*_*JT. 23 ubuntu ssh two-factor google-authenticator

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

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

遵循/调整这些说明后,我收到了密码提示和 Google 身份验证提示:

我已经安装了软件包,编辑了我的/etc/ssh/sshd_config/etc/pam.d/ssh文件

/etc/ssh/sshd_config

ChallengeResponseAuthentication yes
AuthenticationMethods  publickey,keyboard-interactive
UsePAM yes
Run Code Online (Sandbox Code Playgroud)

并在底部/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")
Run Code Online (Sandbox Code Playgroud)

我知道 PAM 是顺序相关的,但sshd_config也是?

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

小智 30

让它运行良好,首先做了:

apt-get install libpam-google-authenticator
Run Code Online (Sandbox Code Playgroud)

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

# @include common-auth
auth required pam_google_authenticator.so
Run Code Online (Sandbox Code Playgroud)

并在/etc/ssh/sshd_config

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no
Run Code Online (Sandbox Code Playgroud)

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

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

  • @NickWilliams 我遇到了同样的问题。对我来说修复它的是我需要推荐答案显示的“@include common-auth”行。起初我只是认为这是对 /etc/pam.d/sshd 中`pam_google_authenticator` 行的评论。 (9认同)
  • 谢谢!我的解决方案并不完全相同(我需要注释掉`auth substack password-auth`),但是你的评论解决了我的问题! (5认同)
  • 我正在使用 CentOS 7。我在 `sshd_config` 中有 `PasswordAuthentication no`、`ChallengeResponseAuthentication yes`、`AuthenticationMethods publickey,keyboard-interactive` 和 `UsePAM yes`。它验证我的密钥 _然后_ 向我询问我的 Google 身份验证器令牌 _** 然后 **_ 向我询问我的密码。让我做所有三个 - 不能跳过其中任何一个。我还按照手册页的建议尝试了`AuthenticationMethods publickey,keyboard-interactive:pam`,但这并没有改变任何东西。有任何想法吗? (2认同)

Mik*_*cre 9

Linus Kendall 的答案应该适用于较旧的系统,但在较新的 Linux 机器上它是有问题的;在我的基于 arch linux 的网络服务器上,该配置导致 pam 在收到我的 ssh 密钥(即我需要所有 3 个密钥)后要求我提供身份验证器代码和密码。

防止此问题并且应该适用于每个系统的更简单的解决方案是将条目更改/etc/pam.d/sshd为:

auth sufficient pam_google_authenticator.so
Run Code Online (Sandbox Code Playgroud)

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

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no
Run Code Online (Sandbox Code Playgroud)

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

附带说明一下,如果您希望拥有一个 sftp 用户帐户,您可能需要绕过 google 身份验证器才能使其正常工作。这里有一个关于如何使用 sftp jail 安全地做到这一点的建议。在etc/ssh/sshd_config

Subsystem sftp internal-sftp
Match User ftp-user
  PasswordAuthentication yes
  AuthenticationMethods password
  ChrootDirectory /path/to/ftp/dir
  ForceCommand internal-sftp
Run Code Online (Sandbox Code Playgroud)

您需要将 /path/to/ftp/dir root 上的权限设为只写(例如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 用户将拥有公钥 + google 身份验证器登录名,以及一个用于数据传输的受密码保护的功能性 sftp 帐户。


blu*_*010 8

我终于能够通过放置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 意味着如果谷歌身份验证器拒绝登录尝试,身份验证将立即失败,跳过密码提示。

所以[success=done new_authtok_reqd=done default=die]是排序之间的混合sufficientrequisite控制值,因为我们要的行为从两个:如果成功,立即终止(足够的),如果失败,也立即(必需的)终止。

请注意,nullokpam_google_authenticator.so的参数意味着如果~/.google_authenticator找不到用户的文件,则公钥身份验证将照常进行。如果我只想使用 2FA 锁定我帐户的一个子集,这很有用。