如何在 Ubuntu 18.04 上配置多因素身份验证

作者选择了 Electronic Frontier Foundation作为 Write for Donations计划的一部分接受捐款。

介绍

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

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

  • 用户知道的东西,如密码 * 用户拥有的东西,如从身份验证应用程序生成的验证代码

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

2FA 帮助加强特定服务或设备的认证过程:即使密码被泄露,攻击者也需要访问持有用于生成安全代码的认证器应用程序的用户设备. 为此,许多在线服务(包括DigitalOcean)提供了使用户账户2FA在认证阶段提高账户安全性的可能性.

在本指南中,您将配置 2FA 用于非 root sudoer 用户在 Ubuntu 18.04 安装中使用 Google PAM 模块. 由于您正在配置 2FA 用于非 root 用户,您仍将能够从您的 root 帐户访问机器,如果发生锁定。

前提条件

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

第1步:安装Google PAM模块

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

首先,作为您在前提条件中配置的非根用户登录:

1[environment local]
2ssh sammy@your_server_ip

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

1sudo apt-get update

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

1sudo apt-get install libpam-google-authenticator

这是一个非常小的包,没有依赖性,所以安装需要几秒钟,在下一节中,您将为系统上的非根用户配置2FA。

步骤 2 — 为用户配置 2FA

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

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

1google-authenticator

该命令将提示您提出几个配置问题。第一个问题将问您是否希望代币基于时间。基于时间的身份验证代币将在指定时间后到期,这在大多数系统上默认为30秒。基于时间的代币比非基于时间的代币更安全,大多数2FA实现都使用它们。您可以在这里选择任何选项,但本教程将选择使用基于时间的身份验证代币:

1[secondary_label Output]
2Do you want authentication tokens to be time-based (y/n) y

在回答y这个问题后,你会看到几个线路输出到你的控制台:

  • 一个QR代码:这是您需要使用您认证程序扫描的代码. 一旦你扫描了它,它会立即变成一个生成密码的设备,每30秒创建一个新的检察官办公室。
  • 联合国 您的密钥: 这是配置您认证器应用程序的替代方法 。 如果您正在使用不支持 QR 扫描的应用程序, 您可以输入密钥来配置您的认证应用程序 。
  • 联合国 您的校验代码 : 这是这个特定的QR代码产生的第一个六位数验证码.
  • 联合国 您的紧急抓取代码 : 也被称为备份代码,这些一用符将允许您在失去认证器设备时通过2FA认证. 把这些代码保存在安全的地方,以避免被锁出账户. .

在您配置了身份验证器应用程序并将备份代码保存到一个安全的地方后,提示会询问您是否想要更新配置文件。如果您选择n,则需要重新运行配置程序。

1[secondary_label Output]
2Do you want me to update your "~/.google_authenticator" file (y/n) y

下一个问题会问你是否想阻止身份验证代码被使用多次。默认情况下,你只能使用每个代码一次,即使它仍然有效30秒。这是最安全的选择,因为它阻止了攻击者在你使用该代码后以某种方式获取身份验证代码的重播攻击。

1[secondary_label Output]
2Do you want to disallow multiple uses of the same authentication
3token? This restricts you to one login about every 30s, but it increases
4your chances to notice or even prevent man-in-the-middle attacks (y/n) y

下一个问题询问您是否想要在认证符的正常有效时间之前或之后的短时间内被接受. 校验代码非常有时间敏感性,这意味着如果设备不同步,可以拒绝您的令牌. 此选项允许您围绕这个问题工作, 延长校验代码的默认有效性时间, 这样即使您的设备暂时不同步, 您的认证代码也会被接受 。 确保所有设备的时间都一样是最好的选择,因为选择是'将降低系统的安全性。 对这个问题的答复n ' 不容许宽限期:

1[secondary_label Output]
2By default, tokens are good for 30 seconds and in order to compensate for
3possible time-skew between the client and the server, we allow an extra
4token before and after the current time. If you experience problems with poor
5time synchronization, you can increase the window from its default
6size of 1:30min to about 4min. Do you want to do so (y/n) n

最后一个问题是,您是否希望在尝试中启用登录率限制。这将不允许每 30 秒内超过三次失败登录尝试,这是一个很好的增强安全性的技术。

1[secondary_label Output]
2If the computer that you are logging into isn't hardened against brute-force
3login attempts, you can enable rate-limiting for the authentication module.
4By default, this limits attackers to no more than 3 login attempts every 30s.
5Do you want to enable rate-limiting (y/n) y

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

第3步:在Ubuntu中激活2FA

谷歌PAM模块现在正在生成你的用户的2FA代码,但Ubuntu还不知道它需要使用这些代码作为用户身份验证过程的一部分。

你在这个时候有两个不同的选择:

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

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

<美元 > [注] 注: 如果您要在SSH上访问的远程机器上启用2FA,就像数字海洋 Droplet一样,在继续使用此教程之前,需要遵循如何在Ubuntu 16.04指南上为SSH设置多功能认证的第二步和第三步。 此教程中的其余步骤适用于所有Ubuntu设施,但远程环境需要额外的更新来让SSH服务意识到2FA.

如果你没有使用SSH来访问你的Ubuntu安装,你可以立即继续在教程中剩余的步骤。

需要 2FA 用于登录和 sudo 请求

要在登录和随后的特权升级请求时被提示使用 2FA,您需要通过将行添加到现有文件的末尾来编辑 /etc/pam.d/common-auth 文件。

该文件适用于系统上的所有身份验证机制,不论使用的桌面环境。 它也适用于用户登录系统后发生的身份验证请求,例如在安装新包时的sudo升级请求。

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

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

添加文件末尾的突出行:

1[label /etc/pam.d/common-auth]
2...
3# and here are more per-package modules (the "Additional" block)
4session	required	pam_unix.so
5session	optional	pam_systemd.so
6# end of pam-auth-update config
7auth required pam_google_authenticator.so nullok

本行告诉Ubuntu认证系统在登录时需要2FA通过Google PAM模块. nullok 选项允许现有用户登录到系统, 即使他们没有为其账户配置 2FA 认证 。 换句话说,已经配置了2FA的用户需要在下个登录时输入认证代码,而还没有运行"google-autherticator"命令的用户则只能使用自己的用户名和密码登录,直到配置了2FA.

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

需要 2FA 仅用于登录

如果您想在桌面环境中首次登录系统时只被提示使用 2FA,则需要编辑您正在使用的桌面管理器的配置文件。配置文件的名称通常与桌面环境的名称匹配。

在无头服务器(如DigitalOcean Droplet)的情况下,您将更改 /etc/pam.d/common-session 文件,并根据您的环境打开相关文件:

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

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

 1[label /etc/pam.d/common-session]
 2#
 3# /etc/pam.d/common-session - session-related modules common to all services
 4#
 5...
 6# # and here are more per-package modules (the "Additional" block)
 7session	required	pam_unix.so
 8session	optional	pam_systemd.so
 9# end of pam-auth-update config
10auth required pam_google_authenticator.so nullok

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

您现在已经成功配置了Ubuntu,以便在登录时或在系统上执行的每个身份验证操作时提示您使用2FA,您现在准备测试配置并确保在登录Ubuntu安装时被要求使用2FA。

第4步:测试2FA

在之前的步骤中,您已配置 2FA 以每 30 秒产生代码. 在此步骤中,您将通过登录到您的 Ubuntu 环境来测试 2FA。

首先,退出并返回您的Ubuntu环境:

1[environment local]
2ssh sammy@your_server_ip

如果您正在使用基于密码的身份验证,您将被要求提供您的用户密码:

1[secondary_label Output]
2Password:

注意: 如果您在 DigitalOcean Droplet 或其他受证书身份验证保护的远程服务器上测试此功能,您将不会被要求提供密码,并且您的密钥将自动传输并接受。

输入您的密码,您将被要求使用 2FA 验证代码:

1[secondary_label Output]
2Verification code:

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

1[secondary_label Output]
2sammy@your_server_ip: ~#

如果 2FA 仅允许登录,您将不会再次被要求使用 2FA 代码,直到会话到期或您手动退出。

如果您通过common-auth文件启用了2FA,您将在每个登录和索取sudo特权时被提示:

1[secondary_label Output]
2sammy@your_server_ip: ~# sudo -s

3sudo password for sammy:

4Verification code:
5
root@your_server_ip:

在此步骤中,您已确认您的 2FA 配置正按预期工作. 如果您在这个阶段没有被要求验证代码,请返回教程的第三步,并确认您已编辑正确的 Ubuntu 身份验证文件。

步骤5:防止2FA锁定

在丢失或删除手机的情况下,重要的是要有适当的备份方法,以恢复访问您的2FA启用帐户。

  • 将您秘密配置代码的备份副本存储在安全的地方. 您可以手动做到这一点,但一些身份验证应用程序(如Authy)提供备份代码功能。

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

步骤6 — 在本地环境中从2FA锁中恢复(可选)

如果你有对机器的物理访问,你可以启动 rescue mode 以禁用 2FA. Rescue mode 是 Linux 中的一个 target 类型(类似于 runlevel) 用于预编程管理任务。

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

1reboot

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

The default GRUB menu in Ubuntu 18.04

接下来,按下键盘上的e键,在启动系统之前编辑GRUB配置。

The GRUB configuration file in edit mode

在出现的文件中,向下滚动,直到你看到一个从linux开始,到$vt_handoff结束的行。 到这个行的末尾,并添加systemd.unit=rescue.target,确保你在$vt_handoffsystemd.unit=rescue.target之间留下一个空间。

Editing the GRUB Configuration File to Enable Maintenance Mode

一旦你完成了更改,用Ctrl+X键盘组合保存文件,你的机器将重新启动,你会发现自己在命令行上。

Command line maintenance mode prompt in Ubuntu 18.04

一旦进入救助模式,打开 Google Authenticator 配置文件. 这将位于被锁定用户的家庭目录中:

1nano /home/sammy/.google-authenticator

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

现在你有两个选择:

  • 您可以复制秘密密钥并配置您的身份验证器应用程序。 * 如果您想从清洁的页面开始,您可以完全删除 ~/.google-authenticator 文件,以便为该用户禁用 2FA。

有了这两种选择,您可以通过使用GRUB启动加载器在本地环境中从2FA锁中恢复,在下一步,您将在远程环境中从2FA锁中恢复。

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

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

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

1ssh root@your_server_ip

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

1sudo nano /home/sammy/.google_authenticator

此文件的第一行是用户的秘密密密钥,这就是您需要配置验证器应用程序的内容。

现在你有两个选择:

  • 如果您想设置一个新的或被删除的设备,您可以使用秘密密钥来重新配置您的身份验证器应用程序。 * 如果您想从清洁的页面开始,您可以完全删除 /home/sammy/.google_authenticator 文件,以便为该用户禁用 2FA。

有了这两种选择,您可以使用 root 用户在本地环境中从 2FA 锁定中恢复。

结论

在这个教程中,您在Ubuntu 18.04机上配置了2FA. 2FA 配置在您的环境中, 您在您的账户中添加了一层额外的保护, 您的系统也变得更加安全 。 除您的传统认证方法外, 您还需要输入额外的验证代码才能登录 。 这使得一个成功获得您登录证书的攻击者无法在没有此额外验证码的情况下登录到您的账户.

Published At
Categories with 技术
comments powered by Disqus