其乐融融的IT技术小站

如何在Linux中为SSH启用多因素身份验证

译者 | 康少京

审校 | 梁策 孙淑娟

介绍

安全无小事。随着入侵事件数量与日俱增,据估计,到2025年,网络犯罪将给企业带来10.5万亿美元的损失。

所以,在技术堆栈之上构筑一个强大的安全层十分必要。在本文中,我们将展示如何使用多因素身份验证的SSH 实现安全。

SSH,即Secure Shell,它是一种网络协议,允许用户连接到远程机器(服务器)并访问资源。

SSH协议实现了两种安全类型,即基于密码的身份验证和基于密钥的身份验证。

与基于密码的身份验证相比,一般认为基于密钥的(公共->私有)身份验证更为安全,因此大多数SSH强化说明更建议禁用基于密码的身份验证,只启用基于密钥的身份验证。

但无论选择哪种身份验证机制,我们都可以通过实现多因素身份验证设置来提高SSH的安全性。

什么是多因素身份验证?

多因素身份验证(MFA)是一种安全的认证过程,它需要从独立的凭证类别中选择多种认证技术。

多因素身份验证也称为“双因子验证 (2FA)”。

在验证你的所述身份时,多因素身份验证涉及两个因素:

第一是创建用户账户时创建的密码。

第二是任何生成动态口令(OTP)的应用程序,或任何向设备发送短信或拨打电话的协议。

根据应用程序的实现方式,身份验证的方式会有所不同。MFA使用的一些常用工具包括:

  • 安装在移动设备上生成令牌的应用程序。
  • 如Yubikey 之类的外部设备。
  • 指纹
  • 面部识别
  • 基于OTP密码的短信或来电

为了启用SSH多因素身份验证,我们将使用“Google Authenticator”应用程序。 它使用OATH-TOTP,以及Twilio Authy 或者FreeOTP等其他替代工具,你可以安装并试用。

我们将从在服务器和移动设备上安装Google Authenticator 应用开始,并尝试启用 MFA和验证。

安装谷歌身份验证器

首先通过playstore/Itunes在Android或IOS设备上安装Google Authenticator 应用程序。

现在,在Linux系统上安装Google Authenticator应用程序。

根据发行版本,运行以下安装命令。

在Ubuntu及其衍生发行版中,运行以下命令:

$ sudo dnf install google-authenticator -y

在基于RHEL的发行版中,运行以下命令:

$ sudo dnf install google-authenticator -y

对基于Arch 的发行版,运行以下命令;

$ sudo pacman -S libpam-google-authenticator

为用户生成初始令牌

作为设置MFA的第一步,你必须从终端运行以下命令。这将通过生成TOTP密钥来完成初始设置。此密钥适用于运行命令的用户,并不适用于系统中的所有用户。

$ google-authenticator

在某些步骤中,系统会提示你使用 (y/n) 选项。

第1步:它将提示你选择基于时间的身份验证令牌。基于时间的身份验证令牌将每30秒生成一个新代码。 按“y”继续。

运行Google身份验证器命令

第2步:秘密令牌将与二维码一起生成。打开Google Authenticator移动应用程序,扫描二维码或手动键入密钥来注册设备。完成后,现在应用程序将开始每30秒生成一次令牌。

密钥和验证码

第3步:在这一步中,它将提示你更新在主目录下的google_authenticator文件。所有的密钥、验证码、紧急刮擦码都保存在这个文件中。按“y”继续。

更新google_authenticator文件

第 4 步:若在这一步中选择“y”,令牌在进行身份验证后将立即过期。在这种情况下,即使一些黑客得到了你的令牌也会过期。

禁止多次使用相同的身份验证

第 5 步:这一步决定允许使用令牌个数以及时间范围。当选择“n”时,它将允许在90秒的窗口内使用3个令牌。如果我按“y”,它将在240秒的时间窗口内允许17个令牌。

令牌数量

第 6 步:此步骤将要求你启用速率限制。速率限制允许攻击者每30秒仅尝试3次登录尝试。如果令牌错误,那么他们必须等待N次重试。

限速

我们已经完成了第一步。打开文件~/.google_authenticator,你可以找到这些步骤做的所有设置和密码。

$ cat ~/.google_authenticator

查看 google_authenticator 设置

你还可以将参数传递给google-authenticator命令,该命令将创建密钥和其他设置,而无需执行这一系列步骤。

$ google-authenticator -q -t -d -f -r 3 -R 30 -w 3

请参阅 google-authenticator help部分,了解这些参数的作用。

$ google-authenticator --help

显示 google-authenticator help部分

为多因素身份验证配置 SSH

在使用MFA前,我们必须对 openSSH 进行一些配置更改。

注:

最佳实践总是要求在任何更改之前备份配置文件。如果出现任何问题,还有恢复更改的余地。

那么在更改SSH配置文件时,请确保单独打开一个会话,这样你就不会将自己锁在外面了。

运行以下命令来备份SSH配置文件。

$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

$ sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.backup

首先,通过将 ChallengeResponseAuthentication选项设置为“yes”来启用,使SSH 能够使用MFA。

配置SSH以使用 MFA

接下来,编辑 /etc/pam.d/sshd 文件:

$ sudo vi /etc/pam.d/sshd

同时在文件底部添加以下内容:

auth required pam_google_authenticator.so nullok
auth required pam_permit.so

编辑 sshd Pam 配置文件

如果希望所有用户都必须使用MFA,请删除“nullok”一词。

重新启动 SSH 服务以使更改生效。

$ sudo systemctl restart sshd

测试双因素身份验证

接下来测试所做的更改是否生效:

通过SSH连接到服务器,系统会要求你输入密码作为第一因素,然后输入验证码作为第二因素身份验证,如下图所示。

$ ssh username@hostname/IPaddress

测试双因素身份验证

输入SSH密码和验证码后,就可以登录了。

由于我们没有为所有用户强制启用MFA,现在我们测试一下,看看是否能够连接到另一个没有生成和设置令牌的用户。

我有一个testuser ,能够在不需提示,输入验证码的情况下连接成功。

使用备用用户连接

看来, 也可以不用验证码登录。

基于密钥认证的多因素身份验证

如果你设置了基于密钥的身份验证,那么密码或验证码将不会提供。

因为默认情况下,SSH首先使用公钥身份验证,如果找到了密钥,则使用该密钥进行身份验证。如果找不到密钥,它将使用基于密码的身份验证。

你可以使用详细模式来检查这一点。

$ ssh -v username@hostname/IPaddress ## With verbose

带有详细模式的 SSH

在/etc/ssh/sshd_config文件的底部添加以下内容:

AuthenticationMethods publickey,password publickey,keyboard-interactive

接下来打开/etc/pam.d/sshd 并注释掉以下行。

通用认证

如果你没有注释掉"@include common-auth",那么它将启用两个以上的因素进行身份验证。首先它使用密钥进行身份验证,然后是密码和令牌。由于我只需要一个密钥和令牌来进行身份验证,所以要将它禁用。

三因素身份验证

重新启动sshd服务并测试更改是否正常。

$ sudo systemctl restart sshd

现在,如果我尝试连接,它使用公钥作为第一因素,验证码作为第二因素进行身份验证。

密钥和验证码

恢复步骤

在某些情况下,你可能会丢失或更换移动设备,这时你必须重新安装 google-authenticator应用程序并注册密钥才能开始生成令牌。

如果你被锁定在系统之外,那么就必须要联系系统管理员,为你提供注册和使用的新密钥。但是,你也可以通过另一种方法登录并自行生成密钥。

还记得在初始步骤中生成的代码吗?你可以使用紧急刮擦码作为登录的令牌。每个刮擦码只能使用一次,它可以保存在安全的地方,以便在最需要的时候使用。

代码保存在 ~/.google_authenticator 文件中。

$ cat ~/.google_authenticator

刮码

现在可以运行以下命令重新生成自己的密钥。

$ google-authenticator

结论

本文展示了如何安装谷歌身份验证器,以及使用不同配置为SSH启用多因素身份验证的方式。

作为管理员,你还可以编写bash脚本来自动生成密钥并与用户共享。在设置 MFA 之前,还应加强SSH让系统更安全。

作者介绍

卡尔希克(Karthick)是一位充满热情的软件工程师,喜欢探索新技术。他是一位公众讲师,喜欢撰写Linux和开源等方面的技术文章。

译者介绍

康少京,51CTO社区编辑,目前从事通讯类行业,底层驱动开发岗位,研究过数据结构,Python,现对操作系统和数据库等相关领域感兴趣。

原文标题:​​How To Setup Multi-Factor Authentication For SSH In Linux​​,作者:Karthick


赞 ()
分享到:更多 ()

相关推荐

内容页底部广告位3
留言与评论(共有 0 条评论)
   
验证码: