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

尝试在 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也是吗?

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

答案1

已经运行良好,首先执行以下操作:

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-generic x86_64) 和 ssh -v : OpenSSH_6.6.1p1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f 2014 年 1 月 6 日

答案2

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 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

您需要将 /path/to/ftp/dir 上的权限设置为 root 只写(例如chown root:root /path/to/ftp/dirchmod 755 /path/to/ftp/dir。该目录上的所有父级也需要安全权限。我通常这样做的方法是创建 chroot 目录/home/shared/user,在其中创建一个目录(例如“数据”),然后挂载我想要共享的任何目录,如下所示:sudo mount -o bind /path/to/ftp/dir /home/shared/user/data

如果您遵循所有这些步骤,您将拥有公钥 + google 身份验证器登录您的 ssh 用户,以及一个用于数据传输的受密码保护的 sftp 帐户。

答案3

我最终能够通过将其放置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 仅锁定部分帐户,这很有用。

相关内容