Linux 上的 USB 令牌身份验证
本文介绍了一种使用USB存储设备作为身份验证令牌代替传统密码登录Linux系统的方法。这可以通过使用可插拔身份验证模块 (PAM) 和某种 USB 存储设备(例如附有 SD 卡的移动电话的 USB 记忆棒)来完成。
这种身份验证技术还可以进一步扩展到双因素身份验证,其中涉及 USB 令牌和一次性密码的两种身份验证方法可以合并在一起以产生更高的安全性。本文是使用Ubuntu Linux系统编写的。但是,其他 Linux 发行版的用户应该能够按照下面描述的步骤来获得相同的结果。
在本教程中您将学习:
如何在主要 Linux 发行版上安装 PAM USB 身份验证
如何配置使用 U 盘登录
在主要 Linux 发行版上安装 PAM 身份验证
pam_usb
软件曾经广泛安装在任何主要 Linux 发行版上,但现在已不再存在于任何软件包存储库中。不过,它是在 GitHub 上维护的。我们将使用此版本为我们的 USB 记忆棒设置 PAM 身份验证。
我们需要做的第一件事是安装 pam_usb
的先决条件,然后下载该程序并在我们的系统上编译它。
您可以使用下面适当的命令通过系统的软件包管理器安装 pam_usb
必备组件。
要在 Ubuntu、Debian 和 Linux Mint 上安装 pam_usb
必备组件:
$ sudo apt install git libxml2-dev libpam0g-dev libudisks2-dev libglib2.0-dev gir1.2-udisks-2.0 python3 python3-gi
要在 Fedora、CentOS、AlmaLinux 和 Red Hat 上安装 pam_usb
必备组件:
$ sudo dnf install git libxml2-devel pam-devel libudisks2-devel glib2-devel python3-gobject
接下来,我们将克隆 pam_usb
GitHub 存储库并编译代码以安装它。
$ git clone https://github.com/mcdope/pam_usb.git
$ cd pam_usb/
$ make
$ sudo make install
将 USB 设备添加到 PAM 配置
在下一步中,我们将添加一个打算用于 PAM 身份验证的 USB 设备。这可以使用 pamusb-conf
命令或通过编辑 /etc/pamusb.conf
文件手动完成。使用 pamusb-conf 命令大大减少了此操作的时间和难度。连接您的 USB 设备并以 USB 设备的名称作为参数执行以下 linux 命令。该名称可以是您想要的任何名称。在这种情况下,我们使用“my-usb-stick”:
$ sudo pamusb-conf --add-device my-usb-stick
Please select the device you wish to add.
* Using "Verbatim STORE N GO (Verbatim_STORE_N_GO_07A10D0894492625-0:0)" (only option)
Which volume would you like to use for storing data ?
0) /dev/sdb2 (UUID: A842-0654)
1) /dev/sdb1 (UUID: CAAF-0882)
[0-1]: 0
Name : my-usb-stick
Vendor : Verbatim
Model : STORE N GO
Serial : Verbatim_STORE_N_GO_07A10D0894492625-0:0
UUID : A842-0654
Save to /etc/pamusb.conf ?
[Y/n] Y
Done.
pamusb-conf
足够智能,可以发现我们的 USB 设备,包括多个分区。完成此步骤后,XML 代码块已添加到 /etc/pamusb.conf
配置文件中以定义我们的 USB 设备。
Verbatim
STORE N GO
Verbatim_STORE_N_GO_07A10D0894492625-0:0
A842-0654
定义用于 PAM 身份验证的用户
这是显而易见的,但值得一提的是,我们可以将多个USB设备添加到PAM配置中,同时我们可以为一个或多个USB设备定义多个用户。在我们的示例中,我们将定义一个 USB 设备以供单个用户用作凭据,从而使事情变得简单。如果我们的系统上存在用户“ubuntu-user”,我们可以使用以下linux命令将其添加到PAM配置中:
$ sudo pamusb-conf --add-user ubuntu-user
Which device would you like to use for authentication ?
* Using "my-usb-stick" (only option)
User : ubuntu-user
Device : my-usb-stick
Save to /etc/pamusb.conf ?
[Y/n] y
Done.
pam_usb
用户的定义已添加到 /etc/pamusb.conf
配置中:
my-usb-stick
配置 PAM 以使用 pam_usb 库
至此,我们已经定义了一个 USB 设备“my-usb-stick”,用作用户“ubuntu-user”的身份验证凭据。但是,系统范围的 PAM 库尚不支持 pam_usb
模块。要将 pam_usb
添加到系统身份验证过程中,我们需要编辑 /etc/pam.d/common-auth
文件。
注意:如果您使用的是 RedHat 或 Fedora Linux 系统,此文件可以称为 /etc/pam/system-auth
。您的默认 PAM common-auth 配置应包含以下行:
auth required pam_unix.so nullok_secure
这是使用 /etc/passwd
和 /etc/shadow
来验证用户身份的当前标准。 “必需”选项意味着必须提供正确的密码才能授予用户访问系统的权限。将您的 配置更改为:
注意:在对 /etc/pam.d/common-auth
进行任何更改之前,请打开一个具有 root 访问权限的单独终端。这是为了防止出现问题,并且您需要 root 访问权限才能将 /etc/pam.d/common-auth
更改回原始配置。
auth sufficient pam_usb.so
auth required pam_unix.so nullok_secure
此时,用户“ubuntu-user”可以通过插入的相关USB设备进行身份验证。这是由 pam_usb 库的“足够”选项定义的。
$ su ubuntu-user
* pam_usb v0.4.2
* Authentication request for user "ubuntu-user" (su)
* Device "my-usb-stick" is connected (good).
* Performing one time pad verification...
* Regenerating new pads...
* Access granted.
注意:如果出现错误:
Error: device /dev/sdb1 is not removable
* Mount failed
通常不会发生此错误,但作为临时解决方案,将块 USB 设备的完整路径添加到 /etc/pmount.allow 中。例如,如果登录错误或命令:
$ sudo fdidk -l
将我的 USB 设备和分区列为 /dev/sdb1 ,添加一行:
/dev/sdb1
进入 /etc/pmount.allow
来解决这个问题。这只是一个临时解决方案,因为您的 USB 设备每次连接到系统时都会以不同的方式被识别。在这种情况下,一种解决方案是编写 USB udev 规则。
如果系统中不存在为“ubuntu-user”定义的 USB 设备,则用户将需要输入正确的密码。要强制用户在授予系统访问权限之前安装两个身份验证例程,请将“足够”更改为“必需”:
auth required pam_usb.so
auth required pam_unix.so nullok_secure
现在用户需要输入正确的密码并插入 USB 设备。
$ su ubuntu-user
* pam_usb v0.4.2
* Authentication request for user "ubuntu-user" (su)
* Device "my-usb-stick" is connected (good).
* Performing one time pad verification...
* Access granted.
Password:
让我们在拔掉 USB 设备并输入正确密码的情况下进行测试:
$ su ubuntu-user
* pam_usb v0.4.2
* Authentication request for user "ubuntu-user" (su)
* Device "my-usb-stick" is not connected.
* Access denied.
Password:
su: Authentication failure
USB 设备事件和 pam_usb
除了 USB 用户身份验证之外,还可以定义每次用户从系统断开或连接 USB 设备时触发 USB 设备事件。例如,pam_usb
可以在用户断开USB设备时锁定屏幕,并在用户连接USB设备时再次解锁屏幕。这可以通过简单修改 /etc/pamusb.conf
文件中的用户定义 XML 代码块来完成。
结束语
在本教程中,我们了解了如何在 Linux 系统上安装 pam_usb
软件包,并使用 PAM 身份验证来配置对 USB 拇指驱动器的登录访问。这是每次需要登录时输入密码的绝佳替代方案,而且也更安全。