本文介绍了一种方法,该方法如何使用USB存储设备作为身份验证令牌而不是传统密码登录Linux系统。这可以通过使用可插拔身份验证模块(PAM)和某种USB存储设备(例如带有SD卡的移动电话的USB memory 棒)来实现。
该身份验证技术还可以进一步扩展到Two-Factor身份验证,其中可以将涉及USB令牌和one-time密码的两种身份验证方法合并在一起以产生更高的安全性。本文是使用Ubuntu Linux系统编写的。但是,其他Linux发行版的用户应该能够按照以下描述的步骤获得相同的结果。
可插拔身份验证模块安装
可插拔身份验证模块以可从相关存储库访问的预编译软件包的形式在大多数Linux系统上可用。首先,我们需要安装PAM USB身份验证所需的软件包:
$ sudo apt-get install pamusb-tools libpam-usb
将USB设备添加到PAM配置
在下一步中,我们将添加一个打算用于PAM身份验证的USB设备。这可以通过pamusb-conf命令来完成,也可以通过编辑/etc/pamusb.conf文件来手动完成。使用pamusb-conf命令可以大大减少该操作的时间和难度。连接您的USB设备并执行以下操作linux命令以USB设备的名称作为参数。名称可以是您想要的任何名称。在这种情况下,我们使用”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.
(adsbygoogle = window.adsbygoogle || [])。push({});
pamusb-conf非常聪明,可以发现我们的USB设备,包括多个分区。完成此步骤后,已将XML代码块添加到/etc/pamusb.conf配置文件中,以定义我们的USB设备。
<pre>
<device id="my-usb-stick">
<vendor>
Verbatim
</vendor>
<model>
STORE N GO
</model>
<serial>
Verbatim_STORE_N_GO_07A10D0894492625-0:0
</serial>
<volume_uuid>
A842-0654
</volume_uuid>
</device>
</pre>
定义用于PAM身份验证的用户
显而易见,但是应该提到的是,我们可以将多个USB设备添加到PAM配置中,同时我们可以为一个或多个USB设备定义多个用户。在我们的示例中,我们将通过定义一个供单个用户用作凭据的USB设备来使事情简单明了。如果我们的系统上存在用户”ubuntu-user”,我们可以使用以下命令将其添加到PAM配置中linux命令:
$ 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配置中:
<user id="ubuntu-user">
<device>my-usb-stick</device>
</user>
配置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验证用户身份的当前标准。 “required”选项意味着必须提供正确的密码才能授予用户访问系统的权限。将/etc/pam.d/common-auth配置更改为:
注意:在对/etc/pam.d/common-auth进行任何更改之前,open-up单独的具有根访问权限的终端。这只是为了防止出现问题,并且您需要root用户访问权限才能将/etc/pam.d/common-auth更改回原始配置。
auth sufficient pam_usb.so
auth required pam_unix.so nullok_secure
此时,用户”ubuntu-user”可以使用其相关的USB设备pluged-in进行身份验证。这由pam_usb库的”sufficient”选项定义。
$ 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
(adsbygoogle = window.adsbygoogle || [])。push({});
通常不会发生此错误,但是作为临时解决方案,请将块USB设备的完整路径添加到/etc/pmount.allow中。例如,如果登录错误或命令:
$ sudo fdidk -l
将我的USB设备和分区列为/dev /sdb1,添加一行:
/dev/sdb1
到/etc/pmount.allow中即可解决此问题。这只是一个临时解决方案,因为您的USB设备每次连接到系统时都可以被不同地识别。在这种情况下,一种解决方案是编写USB udev规则。
如果系统中没有为”ubuntu-user”定义的USB设备,则用户需要输入正确的密码。要在授予系统访问权限之前强制用户使用两种身份验证例程,请将”sufficient”更改为”required”:
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设备或将USB设备连接到系统时触发。例如,当用户断开USB设备的连接时,pam_usb可以锁定屏幕,而当用户连接USB设备时,可以再次解锁屏幕。这可以通过简单修改/etc/pamusb.conf文件中的用户定义XML代码块来完成。
<user id="ubuntu-user">
<device>
my-usb-stick
</device>
<agent event="lock">gnome-screensaver-command -l</agent>
<agent event="unlock">gnome-screensaver-command -d</agent>
</user>