如何在Ubuntu18.04上配置多重身份验证

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Electronic Frontier Foundation 来接受捐赠。

介绍

双因素身份验证 (2FA) 是一种身份验证方法,需要输入多条信息才能成功登录帐户或设备。 除了输入用户名和密码组合外,2FA 还要求用户输入额外的信息,例如 一次性密码 (OTP),例如六位数的验证码。

一般来说,2FA 要求用户输入不同类型的信息:

  • 用户 知道 的东西,例如密码
  • 用户 拥有 的东西,例如从验证器应用程序生成的验证码

2FA 是 多因素身份验证 (MFA) 的子集,除了用户知道的和他们拥有的东西之外,它还需要用户 的东西。 生物识别技术就是这种情况,它使用指纹或语音识别等技术。

2FA 有助于加强对特定服务或设备的身份验证过程:即使密码被泄露,攻击者也需要访问用户设备,该设备包含用于生成安全代码的身份验证器应用程序。 出于这个原因,许多在线服务(,包括 DigitalOcean)提供了为用户帐户启用 2FA 以在身份验证阶段提高帐户安全性的可能性。

在本指南中,您将使用 Google PAM 模块在 Ubuntu 18.04 安装上为非 root sudoer 用户配置 2FA。 由于您在非 root 用户上配置 2FA,因此在锁定的情况下,您仍然可以从您的 root 帐户访问机器。 本教程足够通用,可以应用于服务器和桌面安装,包括本地和远程。

先决条件

在开始本指南之前,您需要以下内容:

  • 一台 Ubuntu 18.04 服务器或桌面环境。 如果您使用的是 Ubuntu 服务器,请按照 Ubuntu 18.04 初始服务器设置 指南进行设置,包括具有 sudo 权限的非 root 用户和防火墙。
  • 安装在您的移动设备上的验证器应用程序,您可以使用它扫描 2FA 二维码,例如 Google AuthenticatorAuthy

第 1 步 — 安装 Google PAM 模块

为了在 Ubuntu 18.04 上配置 2FA,您需要为 Linux 安装 Google 的 PAM 模块Pluggable Authentication Module (PAM) 是 Linux 使用的身份验证机制。 您将使用 Google 的 PAM 模块让您的用户使用 Google 生成的 OTP 代码通过 2FA 进行身份验证。

首先,以您在先决条件中配置的非 root 用户身份登录:

ssh sammy@your_server_ip

更新 Ubuntu 存储库以下载最新版本的身份验证器:

sudo apt-get update

现在您的存储库是最新的,请安装最新版本的 PAM 模块:

sudo apt-get install libpam-google-authenticator

这是一个非常小的包,没有依赖项,因此安装需要几秒钟。 在下一部分中,您将为系统上的非 root 用户配置 2FA。

第 2 步 — 为用户配置 2FA

现在您已经安装了 PAM 模块,您将运行它来为登录的用户生成一个二维码。 这将创建代码,但 Ubuntu 环境不需要 2FA,直到您在本教程后面启用它。

运行 google-authenticator 命令启动和配置 PAM 模块:

google-authenticator

该命令将显示一个提示,询问您几个配置问题。 第一个问题将询问您是否希望令牌基于时间。 基于时间的身份验证令牌将在设定的时间后过期,在大多数系统上默认为 30 秒。 基于时间的令牌比不基于时间的令牌更安全,大多数 2FA 实现都使用它们。 您可以在此处选择任一选项,但本教程将选择 Yes 以使用基于时间的身份验证令牌:

OutputDo you want authentication tokens to be time-based (y/n) y

在回答 y 这个问题后,您会看到控制台输出了几行:

  • 二维码:这是您需要使用身份验证器应用程序扫描的代码。 扫描后,它会立即变成一个代码生成设备,每 30 秒创建一个新的 OTP。
  • 您的密钥:这是配置身份验证器应用程序的另一种方法。 如果您使用的应用程序不支持二维码扫描,您可以输入密钥来配置您的身份验证应用程序。
  • 您的验证码:这是此特定二维码生成的第一个六位数验证码。
  • 您的紧急临时代码:也称为备用代码,如果您丢失了身份验证设备,这些一次性令牌将允许您通过 2FA 身份验证。 将这些代码保存在安全的地方,以免被锁定在帐户之外。

配置身份验证器应用并将备份代码保存在安全位置后,提示将询问您是否要更新配置文件。 如果选择n,则需要再次运行配置程序。 您将输入 y 以保存您的更改并继续前进:

OutputDo you want me to update your "~/.google_authenticator" file (y/n) y

下一个问题将询问您是否要禁止多次使用验证码。 默认情况下,您只能使用每个代码一次,即使它保持有效 30 秒。 这是最安全的选择,因为它可以防止攻击者在您使用验证码后以某种方式设法获取您的验证码的重放攻击。 因此,禁止多次使用代码会更安全。 回答 y 以禁止多次使用同一令牌:

OutputDo 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 会降低系统的安全性。 对此问题回答 n 以不允许宽限期:

OutputBy 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

最后一个问题询问您是否要为登录尝试启用速率限制。 这将不允许每 30 秒超过 3 次失败的登录尝试,这是一种很好的安全强化技术。 通过回答 y 启用它:

OutputIf 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

您现在已经使用 PAM 模块为非 root 用户配置并生成了 2FA 代码。 现在您的代码已生成,您需要在您的环境中启用 2FA。

第 3 步 — 在 Ubuntu 中激活 2FA

Google PAM 模块现在正在为您的用户生成 2FA 代码,但 Ubuntu 还不知道它需要使用这些代码作为用户身份验证过程的一部分。 在此步骤中,您将更新 Ubuntu 的配置,使其除了常规身份验证方法外还需要 2FA 令牌。

此时您有两种不同的选择:

  • 每次用户登录系统时,您都可以要求 2FA 和每次用户请求 sudo 权限时的
  • 您只能在登录期间要求 2FA,随后的 sudo 身份验证尝试只需要用户密码。

第一个选项非常适合共享环境,您可能希望保护需要 sudo 权限的任何操作。 第二种方法更适用于本地桌面环境,您是系统上唯一的用户。

注意: 如果您在通过 SSH 访问的远程计算机上启用 2FA,例如 DigitalOcean Droplet,您需要按照 如何设置多重身份验证中的步骤 2 和 3在继续本教程之前,请先参考 Ubuntu 16.04 上的 SSH。 本教程中的其余步骤适用于所有 Ubuntu 安装,但远程环境需要额外更新以使 SSH 服务了解 2FA。

如果您不使用 SSH 访问您的 Ubuntu 安装,您可以立即继续本教程中的其余步骤。


登录和 sudo 请求需要 2FA

要在登录和后续提权请求期间提示 2FA,您需要通过在现有文件的末尾添加一行来编辑 /etc/pam.d/common-auth 文件。

common-auth 文件适用于系统上的所有身份验证机制,无论使用何种桌面环境。 它也适用于在用户登录系统后 发生的身份验证请求,例如在从终端安装新软件包时的 sudo 升级请求期间。

使用以下命令打开此文件:

sudo nano /etc/pam.d/common-auth

在文件末尾添加突出显示的行:

/etc/pam.d/common-auth

...
# and here are more per-package modules (the "Additional" block)
session required    pam_unix.so
session optional    pam_systemd.so
# end of pam-auth-update config
auth required pam_google_authenticator.so nullok

此行告诉 Ubuntu 身份验证系统在通过 Google PAM 模块登录时需要 2FA。 nullok 选项允许现有用户登录系统,即使他们尚未为其帐户配置 2FA 身份验证。 也就是说,配置了2FA的用户下次登录时需要输入验证码,而没有运行google-authenticator命令的用户只能使用用户名和密码登录直到他们配置 2FA。

添加行后保存并关闭文件。

仅登录需要 2FA

如果您只想在桌面环境中首次登录系统时提示您进行 2FA,则需要编辑您正在使用的桌面管理器的配置文件。 配置文件的名称通常与桌面环境的名称相匹配。 例如,从 Ubuntu 16.04 开始的默认 Ubuntu 桌面环境 gdm 的配置文件是 /etc/pam.d/gdm

对于无头服务器,例如 DigitalOcean Droplet,您将改为编辑 /etc/pam.d/common-session 文件。 根据您的环境打开相关文件:

sudo nano /etc/pam.d/common-session

将突出显示的行添加到文件末尾:

/etc/pam.d/common-session

#
# /etc/pam.d/common-session - session-related modules common to all services
#
...
# # and here are more per-package modules (the "Additional" block)
session required    pam_unix.so
session optional    pam_systemd.so
# end of pam-auth-update config
auth required pam_google_authenticator.so nullok

当用户通过命令行(本地或远程通过 SSH)连接到系统时,这将告诉 Ubuntu 需要 2FA,但在随后的身份验证尝试期间(例如 sudo 请求)则不会。

您现在已成功配置 Ubuntu,以在登录期间或在系统上执行的每个经过身份验证的操作时提示您进行 2FA。 您现在已准备好测试配置,并确保在您登录 Ubuntu 安装时系统提示您进行 2FA。

第 4 步 — 测试 2FA

在上一步中,您已将 2FA 配置为每 30 秒生成一次代码。 在此步骤中,您将通过登录 Ubuntu 环境来测试 2FA。

首先,注销并重新登录到您的 Ubuntu 环境:

ssh sammy@your_server_ip

如果您使用基于密码的身份验证,系统将提示您输入用户密码:

OutputPassword:

注意: 如果您在 DigitalOcean Droplet 或其他受证书身份验证保护的远程服务器上进行测试,则不会提示您输入密码,并且您的密钥将被自动传递和接受。 因此,系统只会提示您输入验证码。


输入您的密码,系统将提示您输入 2FA 验证码:

OutputVerification code:

输入验证码后,您将登录:

Outputsammy@your_server_ip: ~#

如果仅对登录启用了 2FA,则在会话到期或您手动注销之前,系统不会再次提示您输入 2FA 代码。

如果您通过 common-auth 文件启用了 2FA,则每次登录时都会提示您输入它并请求 sudo 权限:

Outputsammy@your_server_ip: ~# sudo -s

sudo password for sammy:

Verification code:

root@your_server_ip:

在此步骤中,您已确认您的 2FA 配置按预期工作。 如果在此阶段未提示您输入验证码,请返回教程的第三步并确认您已编辑正确的 Ubuntu 身份验证文件。

第 5 步 — 防止 2FA 锁定

如果手机丢失或被擦除,请务必采用适当的备份方法来恢复对启用 2FA 的帐户的访问权限。 首次配置 2FA 时,您有几个选项可确保您可以从锁定中恢复:

  • 将您的秘密配置代码的备份副本保存在安全的地方。 您可以手动执行此操作,但一些身份验证应用程序(如 Authy)提供备份代码功能。
  • 将您的恢复代码保存在可以在 2FA 启用环境之外访问的安全位置。

如果出于任何原因您无法访问备份选项,您可以采取其他步骤来恢复对启用 2FA 的本地环境或远程服务器的访问。

第 6 步 — 从本地环境的 2FA 锁定中恢复(可选)

如果您可以物理访问机器,则可以启动到 救援模式 以禁用 2FA。 救援模式是 Linux 中的 target 类型(类似于 runlevel),用于执行管理任务。 您需要编辑 GRUB 中的一些设置,这是 Ubuntu 中的默认引导加载程序,以进入救援模式。

要访问 GRUB,您将首先重新启动您的机器:

reboot

当 GRUB 菜单出现时,确保突出显示 Ubuntu 条目。 这是 18.04 安装的默认名称,但如果您在安装后手动更改它可能会有所不同。

接下来,在引导进入系统之前,按键盘上的 e 键编辑 GRUB 配置。

在出现的文件中,向下滚动直到看到以 linux 开头并以 $vt_handoff 结尾的行。 转到此行的末尾并附加 systemd.unit=rescue.target,确保在 $vt_handoffsystemd.unit=rescue.target 之间留一个空格。 这将告诉您的 Ubuntu 机器启动到救援模式。

完成更改后,使用 Ctrl+X 键盘组合保存文件。 您的机器将重新启动,您会发现自己在命令行中。 按 Enter 进入救援模式。

进入救援模式后,打开 Google Authenticator 配置文件。 这将位于锁定用户的主目录中:

nano /home/sammy/.google-authenticator

此文件中的第一行是用户的密钥,用于配置身份验证器应用程序。

你现在有两个选择:

  • 您可以复制密钥并配置您的身份验证器应用程序。
  • 如果您想从头开始,您可以完全删除 ~/.google-authenticator 文件以禁用该用户的 2FA。 再次以非root用户登录后,可以再次配置2FA,得到一个全新的秘钥。

无论选择哪一种,您都可以使用 GRUB 引导加载程序从本地环境中的 2FA 锁定中恢复。 在下一步中,您将从远程环境的 2FA 锁定中恢复。

步骤 7 — 从远程环境的 2FA 锁定中恢复(可选)

如果您的非 root sudoer 帐户在远程计算机上被锁定,您可以使用 root 用户暂时禁用 2FA 或重新配置 2FA。

首先使用 root 用户登录到您的机器:

ssh root@your_server_ip

登录后,打开位于锁定用户主目录中的 Google Authenticator 设置文件:

sudo nano /home/sammy/.google_authenticator

此文件中的第一行是用户的密钥,这是您配置身份验证器应用程序所需的。

你现在有两个选择:

  • 如果您想设置新的或已擦除的设备,您可以使用密钥重新配置您的身份验证器应用程序。
  • 如果您想从头开始,您可以完全删除 /home/sammy/.google_authenticator 文件以禁用该用户的 2FA。 以非root用户登录后,可以再次配置2FA并获得一个全新的秘钥。

无论选择哪种方式,您都可以使用 root 用户从本地环境中的 2FA 锁定中恢复。

结论

在本教程中,您在 Ubuntu 18.04 机器上配置了 2FA。 通过在您的环境中配置 2FA,您为您的帐户添加了额外的保护层,并使您的系统更加安全。 除了传统的身份验证方法外,您还必须输入额外的验证码才能登录。 这使得设法获取您的登录凭据的攻击者无法在没有此额外验证码的情况下登录您的帐户。