在本指南中,我们将了解什么是多重身份验证及其重要性,最后如何使用 Google Authenticator 应用程序在 Linux 中为 SSH 设置多重身份验证。
介绍
安全是一项严肃的业务。 入侵的数量与日俱增,据估计,到 2025 年,网络犯罪将给公司造成 10.5 万亿美元的损失。
在技术堆栈的所有层上实施强大的安全层非常重要。 在本文中,我们将看到一种使用多重身份验证的 ssh 安全实现。
SSH,代表 Secure Shell,是一种网络协议,允许用户连接到远程机器(服务器)并访问资源。
ssh 协议实现了两种类型的安全性,即 基于密码的身份验证, 和 基于密钥的身份验证.
与基于密码的身份验证相比,基于密钥(公共 -> 私有)的身份验证被认为更安全,并且大多数 SSH 强化说明建议禁用基于密码的身份验证并仅启用基于密钥的身份验证。
无论您选择哪种身份验证机制,您都可以通过实施多因素身份验证设置来使 ssh 更加安全。
什么是多因素身份验证?
多因素身份验证(不久 外交部) 是一种安全的身份验证过程,需要从独立的凭证类别中选择一种以上的身份验证技术。
多重身份验证有时也称为 “双因素身份验证 (2FA)”.
验证你所说的是谁涉及两个因素。 第一个因素是创建用户帐户时创建的密码。
第二个因素是任何生成 OTP 的应用程序或任何向您发送短信或向您的设备拨打电话的协议。
根据应用程序的实现方式,您的身份验证方式会有所不同。 您用于 MFA 的一些常用工具是:
- 安装在生成令牌的移动设备上的应用程序。
- 像 Yubikey 这样的外部设备。
- 指纹。
- 面部识别。
- 基于短信或呼入的 OTP 密码。
要为 ssh 启用多因素身份验证,我们将使用 “谷歌身份验证器” 使用 OATH-TOTP 协议。 还有其他替代工具,例如 Twilio Authy 或者 免费OTP 您可以安装并试用。
我们将从在服务器和移动设备上安装 Google Authenticator 应用开始,并尝试启用 MFA 和验证。
安装谷歌身份验证器
首先在您的 Android 或 IOS 设备上通过 应用商店/iTunes.
现在,在您的 Linux 系统上安装 Google Authenticator 应用程序。
根据您的发行版,运行以下安装命令。
在 Ubuntu 及其衍生发行版运行以下命令。
$ sudo apt install libpam-google-authenticator
在 RHEL 基于发行版运行以下命令。
$ sudo dnf install google-authenticator -y
为了 拱 基于分发运行以下命令。
$ sudo pacman -S libpam-google-authenticator
为用户生成初始令牌
作为设置 MFA 的第一步,您必须从终端运行以下命令。 这将通过生成 TOTP 密钥来处理初始设置。 该密钥是给正在运行该命令的用户使用的,并不适用于系统中的所有用户。
$ google-authenticator
在某些步骤中,系统会提示您 (是的/n) 选项。
第1步 – 它将提示您选择基于时间的身份验证令牌。 基于时间的身份验证令牌将每 30 秒生成一个新代码。 按 “是” 接着说。
第2步 – 秘密令牌将与二维码一起生成。 打开 Google Authenticator 移动应用程序并扫描 QR 码或手动输入密钥以注册设备。 完成后,现在应用程序将开始每 30 秒生成一次令牌。

第 3 步 – 在这一步中,它会提示您更新 .google_authenticator
主目录下的文件。 所有的密钥、验证码、紧急划痕码都保存在这个文件中。 按 “是” 接着说。

第4步 – 选择 “是” 在此步骤中,一旦您使用它进行身份验证,令牌将立即过期。 在这种情况下,即使某些黑客获得了您的令牌,它也会过期。

第 5 步 – 这一步决定了允许的代币数量和时间范围。 当我选择 “n”,它将允许 90 秒内 3 个令牌 窗户。 如果我按 “是”,它将允许 240 秒内 17 个令牌 时间窗口。

第 6 步 – 此步骤将要求您启用速率限制。 速率限制允许攻击者 每 30 秒仅尝试 3 次登录尝试. 如果令牌是错误的,那么他们必须等待 ñ 是时候再试一次了。

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

您还可以将参数传递给 google-authenticator 命令,该命令将创建密钥和其他设置,而无需执行这一系列步骤。
$ google-authenticator -q -t -d -f -r 3 -R 30 -w 3
请参阅 Google 身份验证器帮助部分以了解这些参数的作用。
$ google-authenticator –-help

为多重身份验证配置 SSH
我们必须对 openSSH 进行一些配置更改,以便我们可以开始使用 MFA。
笔记:
- 作为最佳实践,请始终在进行任何更改之前备份您的配置文件。 如果出现任何问题,则可以还原更改。
- 由于您正在对 SSH 配置文件进行更改,请确保您已单独打开一个会话,这样您就不会意外地被锁定在自己之外。
运行以下命令来备份 SSH 配置文件。
$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
$ sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.backup
首先,通过设置启用 SSH 以使用 MFA ChallengeResponseAuthentication
选项 “是的”.

接下来,编辑 /etc/pam.d/sshd
文件:
$ sudo vi /etc/pam.d/sshd
并将以下行添加到文件的底部。
auth required pam_google_authenticator.so nullok auth required pam_permit.so

如果您希望对所有用户强制执行 MFA,请删除该词 “零点”.
重新启动 ssh 服务以使更改生效。
$ sudo systemctl restart sshd
测试两因素身份验证
是时候测试我们所做的更改是否有效了。
通过 SSH 连接到服务器,您将被要求输入密码作为第一因素,然后是验证码作为第二因素身份验证,如下图所示。
$ ssh [email protected]/IPaddress

输入 SSH 密码和验证码后,就可以登录了。
您还记得我们没有为所有用户启用 MFA 作为强制性吗? 让我们测试一下,看看我是否能够与另一个我没有生成和设置令牌的用户连接。
我有一个 测试用户 并且我能够成功连接而无需提示输入验证码。

看? 我也可以不用验证码登录。
基于密钥的身份验证的多因素身份验证
如果您设置了基于密钥的身份验证,则不会为您提供密码或验证码。 为什么?
因为,默认情况下,ssh 首先使用公钥身份验证,如果找到密钥,则使用该密钥进行身份验证。 如果找不到密钥,它将使用基于密码的身份验证。
您可以使用 冗长的 模式来检查这一点。
$ ssh -v [email protected]/IPaddress ## With verbose

将以下行添加到底部 /etc/ssh/sshd_config
文件:
AuthenticationMethods publickey,password publickey,keyboard-interactive
下一个打开 /etc/pam.d/sshd
并注释掉以下行。

如果你不评论 "@include common-auth"
,那么它将启用两个以上的因素进行身份验证。 它将首先使用密钥进行身份验证,然后是密码和令牌。 我只需要一个用于身份验证的密钥和令牌,因此我将其禁用。

重新启动 sshd
服务并测试更改是否正常。
$ sudo systemctl restart sshd
现在如果我尝试连接,它使用公钥作为第一因素,验证码作为第二因素进行身份验证。

恢复步骤
在某些情况下,您可能会丢失或更换您的移动设备。 在这种情况下,您必须重新安装 google-authenticator 应用程序并注册密钥才能开始生成令牌。
如果您被锁定在系统之外,那么您必须联系您的系统管理员,为您提供新的密钥来注册和使用它。 但是还有另一种方法,您可以自己登录并生成密钥。
还记得在初始步骤中生成的代码吗? 您可以使用 紧急刮码 作为登录令牌。每个临时代码只能使用一次。 Save 它在某个安全的地方 所以它可以在最需要的时候使用。
代码保存在 ~/.google_authenticator
文件。
$ cat ~/.google_authenticator

您现在可以通过运行以下命令再次重新生成自己的密钥。
$ google-authenticator
结论
在本文中,我向您展示了如何安装 google 身份验证器并为具有不同配置的 SSH 启用多因素身份验证。
作为管理员,您还可以编写 bash 脚本 自动化生成密钥并与用户共享的过程。 您还应该在设置 MFA 之前强化 ssh,这样您的系统就更安全了。 我们计划在单独的文章中介绍它们。 敬请关注!
相关阅读:
- 如何在 Linux 中配置基于 SSH 密钥的身份验证
- 查找用户是否使用基于密码或基于密钥的 SSH 身份验证
- 如何在 Linux 中允许或拒绝对特定用户或组的 SSH 访问
- 禁用特定用户或组的 SSH 密码验证