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

2FA是一种身份验证方法,需要输入多条信息才能成功登录帐户或设备。在本指南中,您将在Ubuntu 18.04上为用户配置2FA。

作者选择电子前沿基金会作为Write for DOnations计划的一部分接受捐赠。

介绍

双因素身份验证 (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 QR码,例如Google身份验证器Authy

第1步 - 安装Google PAM模块

要在Ubuntu 18.04上配置2FA,您需要安装适用于Linux的Google PAM模块 可插拔认证模块 (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模块,您将运行它以生成登录用户的QR代码。 这将创建代码,但在本教程后面启用它之前,Ubuntu环境不需要2FA。

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

google-authenticator

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

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

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

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

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

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

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

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

下一个问题询问您是否希望在正常有效时间之前或之后的短时间内接受身份验证令牌。 验证码对时间非常敏感,这意味着如果您的设备未同步,您的令牌可能会被拒绝。 此选项允许您通过延长验证码的默认有效时间来解决此问题,这样即使您的设备暂时不同步,您的验证码也会被接受。 确保所有设备上的时间相同是最佳选择,因为选择“ yes会降低系统的安全性。 回答这个问题,不允许宽限期:

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

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

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

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

第3步 - 在Ubuntu中激活2FA

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

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

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

第一个选项对于共享环境是理想的,您可能希望保护任何需要sudo权限的操作。 对于本地桌面环境而言,第二种方法更实用,在该环境中,您是系统中唯一的用户。

注意:如果要在通过SSH访问的远程计算机上启用2FA,例如DigitalOcean Droplet,则需要按照Ubuntu 16.04上如何为SSH设置多重身份验证指南中的第2步和3进行操作,然后再继续执行此操作教程。 本教程中的其余步骤适用于所有Ubuntu安装,但远程环境需要其他更新才能使SSH服务知晓2FA。

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

要求2FA登录和sudo请求

要在登录和后续权限提升请求期间提示输入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

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

Password:

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

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

Verification code:

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

sammy@your_server_ip: ~#

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

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

sammy@your_server_ip: ~# sudo -s

sudo password for sammy:

Verification code:

root@your_server_ip:

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

第5步 - 防止2FA锁定

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

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

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

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

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

要访问GRUB,首先要重新启动计算机:

reboot

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

Ubuntu 18.04中的默认GRUB菜单

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

编辑模式下的GRUB配置文件

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

编辑GRUB配置文件以启用维护模式

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

Ubuntu 18.04中的命令行维护模式提示

进入救援模式后,打开Goog​​le身份验证器配置文件。 这将位于锁定用户的主目录中:

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身份验证器设置文件:

sudo nano /home/sammy/.google_authenticator

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

您现在有两个选择:

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

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

结论

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


分享按钮