前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 14.04上为SSH设置多重身份验证

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

原创
作者头像
小铁匠米兰的v
修改2018-10-22 11:35:29
1.4K0
修改2018-10-22 11:35:29
举报
文章被收录于专栏:云计算教程系列

介绍

一个认证因素是单件的使用信息,以证明你有权要执行的操作,如登录到系统中。的认证信道是认证系统提供了一个因子给用户或要求用户回答的方式。密码和安全令牌是身份验证因素的示例; 电脑和手机就是频道的例子。

SSH默认使用密码进行身份验证,大多数SSH强化说明建议使用SSH密钥。但是,这仍然只是一个因素。如果一个坏的演员已经破坏了您的计算机,那么他们也可以使用您的密钥来破坏您的服务器。

为了解决这个问题,在本教程中,我们将设置多因素身份验证。多重身份验证(MFA)需要多个因素才能进行身份验证或登录。这意味着不良行为者必须妥协多项内容,例如您的计算机和手机,才能进入。不同类型的因素通常概括为:

  1. 知道的东西,比如密码或安全问题
  2. 拥有的东西,如身份验证器应用程序或安全令牌
  3. 独有东西,比如你的指纹或声音

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

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

准备

要学习本教程,您需要:

  • 一个Ubuntu 14.04 腾讯云CVM。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 添加了SSH密钥的sudo非root用户。
  • 安装了OATH-TOTP应用程序的智能手机或平板电脑,如Google身份验证器(iOSAndroid)。

第1步 - 安装libpam-google-authenticator

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

PAM代表Pluggable Authentication Module,是Linux系统上用于对用户进行身份验证的身份验证基础结构。由于Google制作了一个OATH-TOTP应用程序,他们还制作了一个生成TOTP的PAM,并且与任何OATH-TOTP应用程序完全兼容。

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

代码语言:javascript
复制
sudo apt-get update

接下来,安装PAM。

代码语言:javascript
复制
sudo apt-get install libpam-google-authenticator

安装PAM后,我们将使用安装了PAM的帮助应用程序为要添加第二个因子的用户生成TOTP密钥。此密钥是逐个用户生成的,而不是系统范围的。这意味着每个想要使用TOTP身份验证应用程序的用户都需要登录并运行帮助应用程序才能获得自己的密钥。

代码语言:javascript
复制
google-authenticator

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

此PAM允许基于时间或基于顺序的令牌。使用基于顺序的标记意味着代码从某个点开始,然后在每次使用后递增代码。使用基于时间的令牌意味着代码在经过一定时间后随机变化。我们会坚持基于时间,因为这就像Google身份验证器这样的应用程序所期望的,所以回答是的。

代码语言:javascript
复制
Do you want authentication tokens to be time-based (y/n) y

回答完这个问题后,很多输出都会滚动过去,包括一个大的QR码。确保在安全的地方记录密钥,验证码,紧急刮刮代码,如密码管理器。

此时,请使用手机上的身份验证器应用程序扫描QR码或手动输入密钥。如果QR码太大而无法扫描,您可以使用QR码上方的URL来获得更小的版本。添加完成后,您会看到一个六位数的代码,该代码每30秒就会在您的应用中发生变化。

剩下的问题告诉PAM如何运作。我们将逐一介绍它们。

代码语言:javascript
复制
Do you want me to update your "~/.google_authenticator" file (y/n) y

这基本上将键和选项写入.google_authenticator文件。如果你拒绝,程序退出并且没有写入任何内容,这意味着验证程序将无法运行。

代码语言:javascript
复制
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

通过回答“是”,您可以通过使每个代码在使用后立即过期来防止重放攻击。这可以防止攻击者捕获您刚刚使用的代码并使用它登录。

代码语言:javascript
复制
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分钟的窗口中发现问题,否则不是更安全的选择。

代码语言:javascript
复制
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以使用它。

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

代码语言:javascript
复制
sudo nano /etc/pam.d/sshd

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

代码语言:javascript
复制
. . .
# 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配置文件进行编辑。

代码语言:javascript
复制
sudo nano /etc/ssh/sshd_config

寻找ChallengeResponseAuthentication并设置其值为yes

代码语言:javascript
复制
. . .
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes
. . .

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

代码语言:javascript
复制
sudo service ssh restart

第3步 - 让SSH意识到MFA

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

首先,打开另一个终端,然后尝试SSH服务器。您会注意到您使用SSH密钥登录了第二个会话,而没有输入验证码或密码。这是因为默认情况下SSH密钥会覆盖所有其他身份验证选项。我们需要告诉SSH使用TOTP代码并使用SSH密钥代替您的密码。

现在,再次打开sshd配置文件。

代码语言:javascript
复制
sudo nano /etc/ssh/sshd_config

找到PasswordAuthentication行,通过删除该行头部的#字符取消注释,并将其值更新为no。这告诉SSH不要提示输入密码。

代码语言:javascript
复制
. . .
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no
. . .

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

代码语言:javascript
复制
. . .
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive

保存并关闭文件。

接下来,打开PAM sshd配置文件。

代码语言:javascript
复制
sudo nano /etc/pam.d/sshd

找到@include common-auth行并通过添加一个#字符作为该行的第一个字符将其注释掉。这告诉PAM不要提示输入密码; 我们之前告诉SSH不要进入sshd_config`。

代码语言:javascript
复制
. . .
# Standard Un*x authentication.
#@include common-auth
. . .

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

代码语言:javascript
复制
sudo service ssh restart

现在尝试再次登录服务器。您应该看到使用SSH密钥进行部分身份验证,然后系统会提示您输入验证码。它看起来像这样:

代码语言:javascript
复制
ssh sammy@your_server_ip
​
Authenticated with partial success.
Verification code:

从OAUTH-TOTP ap中输入验证码,然后登录服务器。您现在已为SSH启用MFA!

结论

与您强化和保护的任何系统一样,您将负责管理该安全性。在这种情况下,这意味着不会丢失SSH密钥或TOTP密钥。但是,有时会发生一些事情,你可能会失去对你的钥匙的控制权。

以下是重新获得服务器访问权限的一些建议:

  • 如果您丢失或无权访问TOTP应用,请使用恢复代码作为验证码。如果你拿到一部新手机并忘记将你的钥匙从旧手机中取出,或者手机电量耗尽,就会发生这种情况。
  • 如果丢失了密钥和备份,请使用控制台登录。然后重命名或删除文件~/.google_authenticator。这将确保PAM不知道您的配置,并且不会提示您输入代码。确保/etc/pam.d/sshd仍然添加“nullok”,如步骤2; 如果更改此项,请确保重新启动SSH。
  • 如果丢失了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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 第1步 - 安装libpam-google-authenticator
  • 第2步 - 配置OpenSSH
  • 第3步 - 让SSH意识到MFA
  • 结论
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档