用Yubikey进行无密码登录

2021-02-18 03:08:06

Yubikey当前是用于U2F身份验证的事实上的设备。它使您可以在SSH,系统登录,签名GPG密钥等之上添加额外的安全性。它还与其他几种身份验证方法兼容,例如WebAuthn和PAM。

这篇文章将展示如何使用Yubikey来使用和不使用密码来解锁系统锁定屏幕。然后将研究拔下Yubikey时如何自动锁定屏幕。

要使用Yubikeys登录,我们需要配置PAM。 PAM或可插入身份验证模块定义了常见Linux实用程序(例如sudo,su和passwd)的身份验证流程。我们将覆盖xlock锁管理器的默认身份验证流程,以允许使用Yubikey登录。

注意:在大多数锁管理器(例如i3lock或xscreensaver)中,上述过程应该相似。

我们将首先使用PAM复制xlock随附的默认身份验证。使用此配置,用户只能使用自己的密码登录。

所有PAM配置文件都位于/etc/pam.d/目录下。我们创建一个名为xlock的文件,该文件复制默认的身份验证:

注意:为了使上述配置文件生效,该工具(xlock)必须与PAM兼容。我们可以通过检查ldd / usr / bin / xlock |的输出来确认xlock与PAM兼容。 grep libpam.so。

第一个注释行指示PAM版本。接下来的几行定义了身份验证流程:

include是PAM控制标志,其中包括系统身份验证配置文件(此文件定义了默认身份验证流程)。这个标志也可以用来加载模块,我们将在后面看到。

现在我们将Yubikey登录功能添加到我们的PAM配置中,但是我们首先需要为PAM安装Yubico模块并进行设置。

Yubikeys背后的公司Yubico公开了可用于Yubikey身份验证的pam_yubico.so模块。

它提供两种认证机制,客户端模式和质询-响应模式。客户端模式向Yubico服务器发送请求以验证用户的OTP,并需要有效的Internet连接以使用户登录。由于这很不方便,我们将仅在本文中探讨质询-响应模式。

在继续进行配置之前,必须手动安装pam_yubico软件包。该软件包可在大多数Linux发行版中轻松获得。在Arch Linux上可以通过以下方式安装:

警告:建议您使用辅助帐户执行后续步骤,因为这样可能会永久锁定您的帐户(在PAM配置错误的情况下)。

每个Yubikey必须与唯一的公共ID配对,pam_yubico模块使用该ID来唯一标识用户。公开ID包含从OTP令牌中提取的前12个字符。

要获取Yubikey的公共ID,请打开外壳并按Yubikey按钮。您将在下面看到类似的输出:

现在,复制前12个字符(vvctffbvkhdn),并将它们以及用户名添加到/ etc /目录中名为yubikey_mappings的文件中。在我们的情况下,这将是:

注意:该文件还允许指定多个Yubikey映射,每个映射之间用换行符分隔。

Yubikey在尝试验证用户身份时,需要以某种方式验证生成的OTP(一次性密码)。通过使用质询-响应模式来做到这一点。

要设置质询-响应模式,我们首先需要安装称为ykman的Yubikey管理器工具。在Arch Linux上可以通过以下方式安装:

ykman工具将生成一个秘密凭证并将其存储在本地文件中。每当用户尝试使用xlock登录时,pam_yubico模块都会根据存储的凭据验证生成的OTP。

$ ykman otp chalresp --generate 2使用随机生成的密钥:29eb38b6f50b246c46f954af9710a77c78792114在插槽2中编写质询响应凭证吗? [y / N]:y

警告:请确保您正在写入数据的插槽尚未包含任何凭据,因为它可能无法恢复!

设置质询-响应凭证后,需要将其写入本地文件,稍后由pam_yubico读取。

Yubico提供了另一个名为ykpamcfg的工具(应与yubikey-manger软件包捆绑在一起)以将该文件写入磁盘。它以Yubikey插槽号作为参数,并将密码写入文件中:

现在我们将更新/etc/pam.d/xlock文件并在最开始添加Yubico PAM。

当按下“ Enter”键时,debug将所有身份验证步骤打印到控制台。

将模块类型设置为足够的意味着,如果Yubikey身份验证成功,则将不处理进一步的步骤,并且用户将登录。这是启用无密码登录的关键点。但是,在身份验证失败的情况下,仍将应用其余的身份验证步骤,即如果未插入Yubikey,用户仍然可以使用其密码登录。

如果将模块类型设置为必填而不是足够,它将启用两因素身份验证(2FA),这将要求用户插入其Yubikey并输入密码以登录。

注意:对于无密码登录,用户将需要在插入Yubikey的情况下按Enter键以解锁屏幕。

直到锁定屏幕为止,仍然需要手动调用xlock命令。如果我们在拔出Yubikey时能以某种方式自动锁定屏幕,那就太好了。我们可以使用Udev实现这一目标。

Udev是Linux中使用的设备管理器,可用于许多任务。它跟踪所有外部设备的状态变化,例如,可用于识别何时插入或拔出USB设备。每个设备输出一系列可用于唯一标识它的属性。

我们将使用这些属性创建一个Udev规则,该规则将在拔下Yubikey时触发xlock.service系统服务。

注意:我们也可以使用Shell脚本而不是Systemd来实现此目的,但是Udev不鼓励使用脚本执行长时间运行的程序,因为它会在一段时间后终止它们。

Systemd是Linux服务管理器,可用于启动用户进程。我们在/ etc / systemd / system /目录中创建一个名为xlock.service的文件:

我们首先需要为我们的设备(Yubikey)标识一组唯一的属性。 udevadm工具允许在设备状态更改时监视Udev输出。 我们将调用以下命令,然后删除我们的Yubikey: $ udevadm monitor --environment --udev monitor将为以下命令打印接收到的事件:UDEV-规则处理后udev发送的事件UDEV [461872.738673] remove /devices/pci0000:00/0000:00:14.0/usb1/1-2 /1-2.1/1-2.1:1.0/0003:1050:0407.0157/input/input294/event18(input)ACTION =删除ID_VENDOR = Yubico SUBSYSTEM = input DEVNAME = / dev / input / event18 ID_INPUT_KEY = 1 ... 我们在上面仅显示了截断的输出,但是一旦您确定要使用的属性,请在/etc/udev/rules.d/目录中创建一个名为yubikey-actions.rules的文件: 如果一切正常,那么无论何时您拔下Yubikey,您的屏幕都应该会被锁定。