如何为系统范围的两因素身份验证配置 U2F 密钥(例如 YubiKey)?

Ham*_*h W 5 security login pam

Yubico 官方指南仅涵盖为 GDM 登录启用它,我如何为所有登录启用它,包括 TTY、ssh、sudo 等?

Ham*_*h W 6

免责声明:本指南更改了默认的 PAM 配置,这可能会导致您无法使用计算机。对于这些说明造成的任何不良后果,我不承担任何责任。与往常一样,在更改文件之前备份所有文件,准备好实时磁盘以在需要时恢复更改,并研究您不确定的任何内容以了解正在发生的情况。
我已经使用 YubiKey 4 对此进行了测试并确认其有效。它应该适用于任何支持 U2F 规范的安全密钥,包括大多数 YubiKey。

这是基于Yubico 指南,对保护范围进行了一些更改。


1. 从 Yubico PPA 安装 U2F 工具

首先,启用 Yubico PPA并安装 U2F PAM 模块:

sudo add-apt-repository ppa:yubico/stable && sudo apt-get update
sudo apt-get install libpam-u2f
Run Code Online (Sandbox Code Playgroud)

2. 配置您的密钥

Yubico 指南在您的主目录中创建配置,但如果您的主目录已加密,您将无法在重新启动时访问该目录。为了解决这个问题,我们需要在未加密的地方创建配置。这取决于个人喜好,但这里我们将在 下创建它/etc

pamu2fcfg | sudo tee /etc/u2f_keys
Run Code Online (Sandbox Code Playgroud)

当您的设备闪烁时,触摸该联系人以将密钥与您的帐户关联。

如果您想向您的帐户添加更多密钥,请运行以下命令:

pamu2fcfg -n | sudo tee -a /etc/u2f_keys
Run Code Online (Sandbox Code Playgroud)

(拥有多个密钥是一个好主意:如果您的主密钥丢失或损坏,您仍然可以使用其他密钥访问您的帐户。)

3. 测试您的关键配置

为了测试此配置,我们首先仅针对 sudo 命令启用它。从计算机上删除密钥并编辑/etc/pam.d/sudo

sudo nano /etc/pam.d/sudo
Run Code Online (Sandbox Code Playgroud)

在下面添加以下行@include common-auth

auth       required   pam_u2f.so authfile=/etc/u2f_keys
Run Code Online (Sandbox Code Playgroud)

打开一个新的终端窗口,然后运行sudo echo test​​. 系统将提示您输入密码,然后该命令将失败。这是正常现象,因为您的密钥不在计算机中。

插入钥匙,sudo echo test再次运行。输入您的密码,并在提示触摸时触摸您的按键,然后您的终端应该echo test

这确认了配置良好,我们可以继续为所有身份验证启用此功能。再次编辑/etc/pam.d/sudo,并删除我们添加的行。

4 为所有身份验证启用 2FA

这是我们偏离 Yubico 指南的一点,因为该指南仅涵盖为 GDM 启用 2FA,而我们希望为所有身份验证(包括 TTY、SSH、sudo 等)启用它。首先我们需要编辑/etc/pam.d/common-auth

sudo nano /etc/pam.d/common-auth
Run Code Online (Sandbox Code Playgroud)

在文件底部添加以下行:

auth    required   pam_u2f.so nouserok authfile=/etc/u2f_keys cue
Run Code Online (Sandbox Code Playgroud)
  • nouserok意味着没有关联密钥的用户将不会收到 2FA 提示,因此仍然能够登录。如果省略此选项,则没有密钥的用户将无法登录。
  • authfile/etc告诉模块在而不是默认位置(主目录)中查找文件。
  • cue将提示触摸并显示一条消息(“请触摸设备”)。

(有关选项的完整列表,请参阅Yubico 的文档。)

至此,我们就完成了。任何登录尝试都需要使用密钥进行 2FA。以下是可选的。

5. 禁用 sudo 的 2FA

就我个人而言,我不想使用我的密钥来运行 sudo。禁用它非常简单,尽管有点混乱。我不确定是否有更好的方法来做到这一点。再次编辑 sudo pam 文件:

sudo nano /etc/pam.d/sudo
Run Code Online (Sandbox Code Playgroud)

删除显示 的行@include common-auth。接下来,将 的内容复制并粘贴到/etc/pam.d/common-auth我们删除的行所在的位置,但删除我们在启用 U2F 模块之前添加的行。最后一点至关重要:如果您保留该行,您仍然需要一个密钥来运行 sudo。删除该行就不再需要运行 sudo 的密钥。

如果您想要为 ssh 或其他身份验证方案禁用 2FA,您可以调整此过程。如果您运行ls /etc/pam.d,它将显示可用的文件:每个文件都以其控制的场景命名。再次强调,除非您知道自己在做什么并在进行更改之前备份文件,否则不要这样做。

6. 确保物理访问安全

当然,任何人都可以通过使用 live CD/USB 驱动器启动并恢复更改来禁用此功能,因此,如果您的威胁模型包括物理访问,您将需要启用完整的系统加密、禁用 USB/CD 启动并设置 BIOS 密码或其他防止第三方篡改的方法。请记住,您的安全取决于配置中最薄弱的环节。