一个认证因素是单件的使用信息,以证明你有权要执行的操作,如登录到系统中。的认证信道是认证系统提供了一个因子给用户或要求用户回答的方式。密码和安全令牌是身份验证因素的示例; 电脑和手机就是频道的例子。
SSH默认使用密码进行身份验证,大多数SSH强化说明建议使用SSH密钥。但是,这仍然只是一个因素。如果一个坏的演员已经破坏了您的计算机,那么他们也可以使用您的密钥来破坏您的服务器。
为了解决这个问题,在本教程中,我们将设置多因素身份验证。多重身份验证(MFA)需要多个因素才能进行身份验证或登录。这意味着不良行为者必须妥协多项内容,例如您的计算机和手机,才能进入。不同类型的因素通常概括为:
一个常见的因素是OATH-TOTP应用程序,如Google身份验证器。OATH-TOTP(开放式身份验证基于时间的一次性密码)是一种开放式协议,可生成一次性密码,通常为每30秒回收一次的6位数密码。
本文将介绍如何使用OATH-TOTP应用程序以及SSH密钥启用SSH身份验证。然后,通过SSH登录服务器将需要跨两个通道的两个因素,从而使其比单独使用密码或SSH密钥更安全。
要学习本教程,您需要:
在此步骤中,我们将安装和配置Google的PAM。
PAM代表Pluggable Authentication Module,是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允许基于时间或基于顺序的令牌。使用基于顺序的标记意味着代码从某个点开始,然后在每次使用后递增代码。使用基于时间的令牌意味着代码在经过一定时间后随机变化。我们会坚持基于时间,因为这就像Google身份验证器这样的应用程序所期望的,所以回答是的。
Do you want authentication tokens to be time-based (y/n) y
回答完这个问题后,很多输出都会滚动过去,包括一个大的QR码。确保在安全的地方记录密钥,验证码,紧急刮刮代码,如密码管理器。
此时,请使用手机上的身份验证器应用程序扫描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
通过回答“是”,您可以通过使每个代码在使用后立即过期来防止重放攻击。这可以防止攻击者捕获您刚刚使用的代码并使用它登录。
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中,那么现在这样做是一种很好的强化技术。
现在,下一步是配置SSH以使用您的TOTP密钥。我们需要告诉SSH有关PAM的信息,然后配置SSH以使用它。
首先,使用nano
或您喜欢的文本编辑器打开sshd配置文件进行编辑。
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
在此步骤中,我们将测试SSH密钥是否有效。
首先,打开另一个终端,然后尝试SSH服务器。您会注意到您使用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中输入验证码,然后登录服务器。您现在已为SSH启用MFA!
与您强化和保护的任何系统一样,您将负责管理该安全性。在这种情况下,这意味着不会丢失SSH密钥或TOTP密钥。但是,有时会发生一些事情,你可能会失去对你的钥匙的控制权。
以下是重新获得服务器访问权限的一些建议:
~/.google_authenticator
。这将确保PAM不知道您的配置,并且不会提示您输入代码。确保/etc/pam.d/sshd
仍然添加“nullok”,如步骤2; 如果更改此项,请确保重新启动SSH。~/.ssh/authorized_hosts
删除旧公共密钥。然后,您可以用新密钥替换它。通过两个通道(您的计算机+您的手机)有两个因素(SSH密钥+ MFA令牌),您已经使外部代理几乎不可能通过SSH强行进入您的计算机并大大提高了你的机器的安全性。
想要了解更多关于为SSH设置多重身份验证的相关教程,请前往腾讯云+社区学习更多知识。
参考文献:《How To Set Up Multi-Factor Authentication for SSH on Ubuntu 14.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。