介绍
双因素身份验证 (2FA)是一种身份验证方法,需要输入多条信息才能成功登录帐户或设备。 除了输入用户名和密码组合之外,2FA还要求用户输入一条额外的信息,例如一次性密码 (OTP),如六位数的验证码。
通常,2FA要求用户输入不同类型的信息:
2FA是多因素身份验证 (MFA)的子集,除了用户知道的内容和他们拥有的内容之外,还需要用户提供的内容 。 这就是生物识别技术的情况,它使用指纹或语音识别等技术。
2FA有助于加强对特定服务或设备的身份验证过程:即使密码被泄露,攻击者也需要访问用户设备,该设备包含用于生成安全代码的身份验证器应用程序。 出于这个原因,许多在线服务( 包括DigitalOcean )提供了为用户帐户启用2FA以在身份验证阶段提高帐户安全性的可能性。
在本指南中,您将使用Google PAM模块在Ubuntu 18.04安装上为非root sudoer用户配置2FA。 由于您是在非root用户上配置2FA,因此在锁定时您仍然可以从root帐户访问该计算机。 本教程将足以应用于本地和远程的服务器和桌面安装。
在开始本指南之前,您需要以下内容:
要在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。
现在您已经安装了PAM模块,您将运行它以生成登录用户的QR代码。 这将创建代码,但在本教程后面启用它之前,Ubuntu环境不需要2FA。
运行google-authenticator
命令以启动和配置PAM模块:
google-authenticator
该命令将显示一个提示,询问您几个配置问题。 第一个问题将询问您是否希望令牌基于时间。 基于时间的身份验证令牌将在一段时间后过期,在大多数系统上默认为30秒。 基于时间的令牌比不基于时间的令牌更安全,并且大多数2FA实现使用它们。 您可以在此处选择任一选项,但本教程将选择“ Yes
以使用基于时间的身份验证令牌:
OutputDo you want authentication tokens to be time-based (y/n) y
在回答了这个问题后,你会看到几行输出到你的控制台:
配置验证器应用程序并将备份代码保存在安全位置后,提示将询问您是否要更新配置文件。 如果选择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
会降低系统的安全性。 回答这个问题,不允许宽限期:
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秒进行三次以上的失败登录尝试,这是一种很好的安全加强技术。 通过回答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。
Google PAM模块现在为您的用户生成2FA代码,但Ubuntu还不知道它需要在用户的身份验证过程中使用这些代码。 在此步骤中,除常规身份验证方法外,您还将更新Ubuntu的配置以要求2FA令牌。
此时您有两种不同的选择:
sudo
权限时,您都可以要求2FA。sudo
身份验证尝试只需要用户密码。第一个选项对于共享环境是理想的,您可能希望保护任何需要sudo
权限的操作。 对于本地桌面环境而言,第二种方法更实用,在该环境中,您是系统中唯一的用户。
注意:如果要在通过SSH访问的远程计算机上启用2FA,例如DigitalOcean Droplet,则需要按照Ubuntu 16.04上的如何为SSH设置多重身份验证指南中的第2步和3进行操作,然后再继续执行此操作教程。 本教程中的其余步骤适用于所有Ubuntu安装,但远程环境需要其他更新才能使SSH服务知晓2FA。
如果您不使用SSH访问Ubuntu安装,则可以立即继续执行本教程中的其余步骤。
要在登录和后续权限提升请求期间提示输入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,则需要编辑正在使用的桌面管理器的配置文件。 配置文件的名称通常与桌面环境的名称相匹配。 例如,在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。
在上一步中,您已配置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权限并请求sudo权限:
Outputsammy@your_server_ip: ~# sudo -s
sudo password for sammy:
Verification code:
root@your_server_ip:
在此步骤中,您已确认2FA配置正在按预期工作。 如果在此阶段未提示您输入验证码,请返回本教程的第3步并确认您已编辑了正确的Ubuntu验证文件。
如果手机丢失或擦除,请务必使用适当的备份方法来恢复对启用了2FA的帐户的访问权限。 当您第一次配置2FA时,您有几个选项可确保您可以从锁定中恢复:
如果由于任何原因您无法访问备份选项,则可以采取其他步骤来恢复对启用了2FA的本地环境或远程服务器的访问。
如果您可以物理访问本机,则可以启动救援模式以禁用2FA。 救援模式是Linux中的目标类型(类似于运行级别 ),用于执行管理任务。 您需要在GRUB中编辑一些设置,这是Ubuntu中的默认引导加载程序,才能进入救援模式。
要访问GRUB,首先要重新启动计算机:
reboot
出现GRUB菜单时,请确保突出显示Ubuntu条目。 这是18.04安装上的默认名称,但如果在安装后手动更改它,则可能会有所不同。
接下来,在启动进入系统之前,按键盘上的e
键编辑GRUB配置。
在出现的文件中,向下滚动,直到看到以linux
开头并以$vt_handoff
。 转到此行的末尾并附加systemd.unit=rescue.target
,确保在$vt_handoff
和systemd.unit=rescue.target
之间留出空格。 这将告诉您的Ubuntu机器启动进入救援模式。
完成更改后,使用Ctrl+X
键盘组合保存文件。 您的计算机将重新启动,您将发现自己处于命令行。 按Enter
进入救援模式。
进入救援模式后,打开Google身份验证器配置文件。 这将位于锁定用户的主目录中:
nano /home/sammy/.google-authenticator
此文件中的第一行是用户的密钥,用于配置身份验证器应用程序。
您现在有两个选择:
~/.google-authenticator
文件以禁用此用户的2FA。 以非root用户身份再次登录后,您可以再次配置2FA并获取全新的密钥。无论选择哪种方式,您都可以使用GRUB引导加载程序从本地环境中的2FA锁定中恢复。 在下一步中,您将从远程环境中的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锁定中恢复。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。