我正在使用 Ubuntu 14.04.1(带有 OpenSSH 6.6 和 libpam-google-authenticator 20130529-2)。
我正在尝试设置 SSH 登录,其中公钥进行身份验证(无需密码)并且提示用户输入来自 Google 身份验证器的代码。
按照/调整这些说明,我得到了密码提示以及 Google Auth 提示:
- https://scottlinux.com/2013/06/02/use-google-authenticator-for-two-factor-ssh-authentication-in-linux/
- http://www.howtogeek.com/121650/how-to-secure-ssh-with-google-authenticators-two-factor-authentication/
- https://wiki.archlinux.org/index.php/Google_Authenticator和https://wiki.archlinux.org/index.php/SSH_keys#Two-factor_authentication_and_public_keys
- https://www.digitalocean.com/community/tutorials/how-to-protect-ssh-with-two-factor-authentication
我已经安装了该软件包,并编辑了我的/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/dir
,chmod 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]
有点像sufficient
和requisite
控制值之间的混合,因为我们希望同时获得这两种行为:如果成功,则立即终止(充分),如果失败,也立即终止(必要)。
请注意,nullok
pam_google_authenticator.so 的参数意味着如果~/.google_authenticator
未找到用户的文件,则公钥身份验证将照常进行。如果我想使用 2FA 仅锁定部分帐户,这很有用。