如何在 Ubuntu 14.04 上为 SSH 设置多因素身份验证

<$>[注] 本文已更新为Ubuntu 16.04(https://andsky.com/tech/tutorials/how-to-set-up-multi-factor-authentication-for-ssh-on-ubuntu-16-04)。更新版本还包含有关如何超越基本设置的其他信息。

介绍

一个 authentication factor 是用于证明您有权执行某项操作的单一信息,例如登录系统。一个 authentication channel 是认证系统向用户提供一个因素的方式,或者要求用户作出回应。

SSH 默认使用密码进行身份验证,大多数 SSH 硬化指令建议使用 SSH 密钥,但这仍然只是一个因素。

为了打击这一点,在本教程中,我们将设置多因素身份验证。 Multi-factor authentication (MFA) 需要超过一个因素来身份验证,或登录. 这意味着一个糟糕的演员将不得不妥协多个事情,如您的计算机和您的手机,进入。

1、你所知道的东西,如密码或安全问题 2.你所拥有的东西,如身份验证应用程序或安全代币 3.你所拥有的东西,如你的指纹或声音

一个常见的因素是OATH-TOTP应用程序,如Google Authenticator。 OATH-TOTP(开放身份验证基于时间的一次密码)是一个开放的协议,生成一次性密码,通常是一个6位数的数字,每30秒就被回收。

本文将介绍如何使用 OATH-TOTP 应用程序除了 SSH 密钥外启用 SSH 身份验证,然后通过 SSH 登录您的服务器将需要两条渠道的两个因素,从而使其比单独使用密码或 SSH 密钥更安全。

前提条件

要遵循本教程,您将需要:

步骤 1 — 安装 libpam-google-authenticator

在此步骤中,我们将安装和配置谷歌的PAM。

PAM,即可插入身份验证模块,是Linux系统用于验证用户的身份验证基础设施,因为谷歌创建了OATH-TOTP应用程序,所以他们还创建了一个PAM,可以生成TOTP,并且完全兼容任何OATH-TOTP应用程序。

首先,更新Ubuntu的存储库缓存。

1sudo apt-get update

接下来,安装PAM。

1sudo apt-get install libpam-google-authenticator

当 PAM 安装时,我们将使用与 PAM 安装的辅助应用来生成您想要添加第二因子的用户的 TOTP 密钥。

1google-authenticator

运行命令后,您将被问到几个问题,第一个问题是是否应该基于时间的身份验证令牌。

这种PAM允许基于时间或序列的代币。使用 sequential-based tokens 意味着代码在某个特定点开始,然后在每次使用后增加代码。

1Do you want authentication tokens to be time-based (y/n) y

回答此问题后,大量的输出将滚过,包括一个大型QR代码,请确保您在安全的地方记录秘密密密钥、验证代码、紧急扫描代码,如密码管理器。

在此时,使用手机上的身份验证应用程序扫描QR代码或手动键入秘密密密钥。如果QR代码太大,可以使用QR代码上方的URL获取更小的版本。

剩下的问题告诉PAM如何运作,我们将逐一审查。

1Do you want me to update your "~/.google_authenticator" file (y/n) y

这基本上会将密钥和选项写入.google_authenticator 文件. 如果你说不,程序会停止,没有任何东西被写下来,这意味着身份验证器不会工作。

1Do you want to disallow multiple uses of the same authentication
2token? This restricts you to one login about every 30s, but it increases
3your chances to notice or even prevent man-in-the-middle attacks (y/n) y

通过在这里回答,您正在通过使每个代码在使用后立即过期来防止重播攻击,从而防止攻击者捕捉您刚刚使用的代码并使用它登录。

1By default, tokens are good for 30 seconds and in order to compensate for
2possible time-skew between the client and the server, we allow an extra
3token before and after the current time. If you experience problems with poor
4time synchronization, you can increase the window from its default
5size of 1:30min to about 4min. Do you want to do so (y/n) n

回答在这里允许在移动的四分钟窗口中最多 8 个有效代码. 回答,我们将其限制在 1:30 分钟滚动窗口中的 3 个有效代码。

1If the computer that you are logging into isn't hardened against brute-force
2login attempts, you can enable rate-limiting for the authentication module.
3By default, this limits attackers to no more than 3 login attempts every 30s.
4Do you want to enable rate-limiting (y/n) y

速度限制意味着远程攻击者只能在被阻止之前尝试一定数量的猜测。

步骤 2 – 配置 OpenSSH

现在下一步是配置SSH以使用您的TOTP密钥,我们需要告诉SSH关于PAM,然后配置SSH以使用它。

首先,打开 sshd 配置文件以使用nano或您最喜欢的文本编辑器进行编辑。

1sudo nano /etc/pam.d/sshd

将下列行添加到文件的底部。

1. . .
2# Standard Un*x password updating.
3@include common-password
4auth required pam_google_authenticator.so nullok

结尾上的nullok字告诉PAM这种身份验证方法是可选的,这允许没有OATH-TOTP密钥的用户仍然使用他们的SSH密钥登录。一旦所有用户都有OATH-TOTP密钥,您可以在这个行中删除nullok,使其成为MFA强制性的。

保存并关闭文件。

接下来,我们将配置SSH以支持此类身份验证。

1sudo nano /etc/ssh/sshd_config

搜索ChallengeResponseAuthentication,并将其值设置为

1. . .
2# Change to yes to enable challenge-response passwords (beware issues with
3# some PAM modules and threads)
4ChallengeResponseAuthentication yes
5. . .

保存并关闭文件,然后重新启动 SSH 来重新加载配置文件。

1sudo service ssh restart

步骤 3 – 让 SSH 意识到 MFA

在此步骤中,我们将测试 SSH 密钥是否有效。

首先,打开另一个终端,现在尝试 SSHing 进入服务器. 您会注意到您已使用您的 SSH 密钥登录到第二个会话中,而无需输入您的验证代码或密码. 这是因为 SSH 密钥默认上限所有其他身份验证选项。

现在,重新打开 sshd 配置文件。

1sudo nano /etc/ssh/sshd_config

查找PasswordAuthentication行,删除#字符,并将其值更新为

1. . .
2# Change to no to disable tunnelled clear text passwords
3PasswordAuthentication no
4. . .

接下来,在文件底部添加下面的行,这会告诉SSH需要使用哪些身份验证方法。

1. . .
2UsePAM yes
3AuthenticationMethods publickey,keyboard-interactive

保存并关闭文件。

然后打开 PAM sshd 配置文件。

1sudo nano /etc/pam.d/sshd

找到@include common-auth的行,并通过添加#字符作为行上的第一个字符来评论它,这告诉PAM不要请求密码;我们之前告诉SSH不要在sshd_config中。

1. . .
2# Standard Un*x authentication.
3#@include common-auth
4. . .

保存并关闭文件,然后重新启动 SSH。

1sudo service ssh restart

现在尝试再次登录服务器,你应该看到你用你的SSH密钥部分验证了,然后被要求你的验证代码。

1[label Example login output]
2ssh sammy@your_server_ip
3
4Authenticated with partial success.
5Verification code:

输入您的 OAUTH-TOTP 应用程序的验证代码,您将登录到服务器. 您现在已启用 MFA 用于 SSH!

结论

就像你硬化和保护的任何系统一样,你会对管理安全性负责,在这种情况下,这意味着你不会失去你的SSH密钥或TOTP秘密密钥,但有时事情会发生,你可能会失去对密钥的控制。

以下是恢复访问您的服务器的一些建议:

  • ** 如果你失去了,或没有访问到,你的TOTP应用程序,**使用你的恢复代码作为验证代码. 如果你得到一个新手机,忘了从旧的,或者如果你的手机失去了电源.
  • ** 如果你失去了你的秘密密密钥和备份,**使用控制台通过DigitalOcean控制面板登录.然后重新命名或删除文件 ~/.google_authenticator. 这将确保PAM不知道你的配置,并不会提示你一个代码。 确保 /etc/pam.dss/hd仍然有nullok添加,如在步骤2中;如果你更改,请确保重新启动SSH。 ** 如果你失去了你的SSH密钥,使用控制台再次登录并删除你的

通过在两个渠道(您的计算机 + 您的手机)中有两个因素(SSH 密钥 + MFA 代币),您几乎不可能让外部代理人通过 SSH 进入您的机器,并大大提高了您的机器的安全性。

Published At
Categories with 技术
Tagged with
comments powered by Disqus