介绍
身份验证因素是一整块的使用信息,以证明你有权限执行的操作,如登录到系统中。 认证信道是认证系统提供了一个因子给用户或要求用户回答的方式。 密码和安全令牌是认证因素的示例; 电脑和手机是频道的例子。
默认情况下,SSH使用密码进行身份验证,大多数SSH强化指示建议使用SSH密钥。 然而,这仍然只是一个因素。 如果一个坏的演员已经损害了您的计算机,那么他们可以使用您的密钥来危害您的服务器以及。
为了打击的是,在本教程中,我们将建立多因子认证, 多因素认证 (MFA),需要多个因素,以进行身份验证,或者登录。这意味着一个坏演员就必须妥协多件事情,像你的电脑和你的手机,进入。不同类型的因素通常总结为:
- 有些事情,你知道 ,就像一个密码或安全问题
- 你拥有的东西,像一个认证程序或安全令牌
- 一些你,喜欢你的指纹或语音
一个常见的因素是一个宣誓TOTP应用程序,如谷歌的Authenticator。 宣誓TOTP(基于时间的开放认证一次性密码)是一种开放式协议,生成一个一次性使用密码,通常是被回收的每6位数字30秒。
本文将介绍如何使用OATH-TOTP应用程序以及SSH密钥启用SSH身份验证。 然后通过SSH登录到您的服务器将需要两个通道的两个因素,从而使它比单独的密码或SSH密钥更安全。
先决条件
要遵循本教程,您需要:
一个Ubuntu 14.04 Droplet。
与SSH密钥A sudo的非root用户添加,您可以通过以下设置初始服务器安装教程 。
第1步 - 安装libpam-google-authenticator
在此步骤中,我们将安装和配置Google的PAM。
PAM,它代表插入认证模块 ,是在Linux系统中使用验证用户身份验证基础架构。 因为Google制作了OATH-TOTP应用程序,他们还制作了一个生成TOTP的PAM,并且与任何OATH-TOTP应用程序完全兼容。
首先,更新Ubuntu的储存库缓存。
sudo apt-get update
接下来,安装PAM。
sudo apt-get install libpam-google-authenticator
安装PAM后,我们将使用与PAM一起安装的帮助程序应用程序为要添加第二个因素的用户生成TOTP密钥。 此密钥是基于用户生成的,不是系统范围的。 这意味着每个想使用TOTP身份验证应用程序的用户都需要登录并运行帮助应用程序来获取自己的密钥。
google-authenticator
运行命令后,您会被问到几个问题。 第一个询问认证令牌是否应该是基于时间的。
此PAM允许基于时间或基于顺序的令牌。 使用基于序贯令牌意味着代码开始在某一点,然后在每次使用后递增代码。 使用基于时间的标记指的是代码后,在一定时间的经过随机变化。 我们会坚持基于时间,因为这是谷歌Authenticator期望的应用程序,所以回答是。
Do you want authentication tokens to be time-based (y/n) y
回答这个问题后,很多输出将滚动过去,包括一个大的二维码。 请确保将密钥,验证码和紧急事故代码记录在安全的地方,例如密码管理器。
此时,在手机上使用您的验证器应用程序扫描QR码或手动键入密钥。 如果QR码太大而无法扫描,您可以使用QR码上方的URL来获取较小的版本。 添加完成后,您会在应用中看到一个六位数的代码,每30秒更改一次。
剩下的问题告诉PAM如何运作。 我们将逐一介绍它们。
Do you want me to update your "~/.google_authenticator" file (y/n) y
这基本上写入键和选项的.google_authenticator
文件。 如果你说不,程序退出,没有写入,这意味着认证器将不工作。
Do you want to disallow multiple uses of the same authentication
token? This restricts you to one login about every 30s, but it increases
your chances to notice or even prevent man-in-the-middle attacks (y/n) y
通过在这里回答yes,您可以通过使每个代码在使用后立即过期来防止重放攻击。 这可以防止攻击者捕获您刚刚使用的代码并使用它登录。
By default, tokens are good for 30 seconds and in order to compensate for
possible time-skew between the client and the server, we allow an extra
token before and after the current time. If you experience problems with poor
time synchronization, you can increase the window from its default
size of 1:30min to about 4min. Do you want to do so (y/n) n
回答是这里允许在一个移动的四分钟窗口中最多8个有效的代码。 通过回答否,我们在1:30分钟滚动窗口中将其限制为3个有效代码。 除非你发现1:30分钟的问题,否则更安全的选择。
If the computer that you are logging into isn't hardened against brute-force
login attempts, you can enable rate-limiting for the authentication module.
By default, this limits attackers to no more than 3 login attempts every 30s.
Do you want to enable rate-limiting (y/n) y
速率限制意味着远程攻击者只能在被阻止之前尝试一定数量的猜测。 如果您以前没有配置速率限制直接到SSH,现在这样做是一个伟大的加固技术。
第2步 - 配置OpenSSH
现在下一步是配置SSH以使用您的TOTP密钥。 我们需要告诉SSH关于PAM,然后配置SSH使用它。
首先,打开使用编辑sshd的配置文件nano
或您喜爱的文本编辑器。
sudo nano /etc/pam.d/sshd
将以下行添加到文件的底部。
. . .
# Standard Un*x password updating.
@include common-password
auth required pam_google_authenticator.so nullok
末尾的“nullok”字告诉PAM这个认证方法是可选的。 这允许没有OATH-TOTP密钥的用户仍然使用他们的SSH密钥登录。 一旦所有用户都有OATH-TOTP密钥,您可以删除此行上的“nullok”,使其成为MFA强制性。
保存并关闭文件。
接下来,我们将配置SSH以支持此类身份验证。 打开SSH配置文件进行编辑。
sudo nano /etc/ssh/sshd_config
寻找ChallengeResponseAuthentication
,并将其值设置为yes
。
. . .
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes
. . .
保存并关闭文件,然后重新启动SSH以重新加载配置文件。
sudo service ssh restart
第3步 - 使SSH意识到MFA
在这一步中,我们将测试SSH密钥是否工作。
首先,打开另一个终端,然后尝试SSHing到服务器。 您会注意到,您使用SSH密钥登录了第二个会话,而无需输入验证码或密码。 这是因为SSH密钥默认覆盖所有其他身份验证选项。 我们需要告诉SSH使用TOTP代码,并使用SSH密钥代替密码。
现在,再次打开sshd配置文件。
sudo nano /etc/ssh/sshd_config
找到PasswordAuthentication
线,删去注释它#
字符的行头,并更新其价值no
。 这告诉SSH不要提示输入密码。
. . .
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no
. . .
接下来,在文件底部添加以下行。 这告诉SSH需要哪些验证方法。
. . .
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
保存并关闭文件。
接下来,打开PAM sshd配置文件。
sudo nano /etc/pam.d/sshd
找到这行@include common-auth
,并加入了其注释掉#
字符作为上线的第一个字符。 这告诉PAM不要提示输入密码; 我们曾告诉SSH不要在sshd_config
。
. . .
# Standard Un*x authentication.
#@include common-auth
. . .
保存并关闭文件,然后重新启动SSH。
sudo service ssh restart
现在尝试再次登录服务器。 您应该会看到您使用SSH密钥部分验证,然后系统提示您输入验证码。 它将如下所示:
ssh sammy@your_server_ip
Authenticated with partial success.
Verification code:
从OAUTH-TOTP ap中输入您的验证码,然后登录服务器。 您现在已启用MFA的SSH!
结论
与任何加固和安全的系统一样,您负责管理该安全性。 在这种情况下,这意味着不丢失您的SSH密钥或您的TOTP密钥。 然而,有时事情发生,你可以失去控制的钥匙,让你进去。
以下是重新获得对您的服务器的访问权限的一些建议:
如果你输了,或者没有进入,您TOTP应用程序,使用你的恢复代码作为验证码。 如果您收到新手机,并忘记将密钥导出旧密钥,或者如果您的手机耗尽电源,则会发生这种情况。
如果丢失了密钥和备份,通过DigitalOcean控制面板使用控制台登录,然后请重命名或删除该文件
~/.google_authenticator
。 这将确保PAM不知道您的配置,并且不会提示您输入代码。 确保/etc/pam.d/sshd
仍然在第2步“nullok补充说:”像; 如果您更改此,请确保重新启动SSH。如果你失去了你的SSH密钥,再次使用控制台登录并删除旧的公开
~/.ssh/authorized_hosts
。 然后,您可以将其替换为新密钥。
通过两个渠道(您的计算机+您的手机)有两个因素(SSH密钥+ MFA令牌),你已经使外部代理几乎不可能通过SSH强行进入您的机器的方式,大大增加了安全性你的机器。