使用Yubikey作为Linux的非接触式神奇解锁密钥

2020-08-18 02:32:40

YubiKey对安全性很有帮助,但当您将它们放在无人看管的计算机中时就不安全了。在这一点上,任何人都可以使用密钥进行双因素身份验证/SSH/GPG签名,所以这并不比仅仅使用普通密码好多少。不幸的是,当我离开电脑时,我有一个忘带钥匙的习惯。我还有登录密码,太长了,很容易打错。

谢天谢地,有一种方法可以解决这两个问题:放入计算机时使用Yubikey解锁,取出时锁定计算机!

我记得几年前看到的第一个这个概念的例子是Predator,Windows软件(有一个令人愉快的复古网站),当你移除一个特殊的USB驱动器时,它会锁定你的电脑。Linux的类似示例包括pamusb,它允许您通过插入特殊格式的U盘使用Linux的PAM登录。

当然,现在大多数人使用Yubikey来完成这一任务,Yubio有方便的指南来指导如何完成这一任务。然而,我想让它成为非接触的-也就是说,我想能够插入我的Yubikey并立即解锁我的笔记本电脑,而不需要点击登录或触摸Yubikey按钮。删除后,我想立即锁定我的计算机。

网上有一些关于如何做到这一点的指南(插入时解锁,拔出时锁定),但不幸的是,它们中的大多数都是本文描述的问题的牺牲品。他们中的许多人使用udev来检测Yubikey何时插入,但除了检查其供应商ID、型号ID,有时还会检查序列号(所有这些都很容易被伪造)之外,它们实际上并不验证密钥。

为了提供实际的安全性,大多数官方指南使用pam_u2f(通过U2F协议验证Yubikey)或pam_yubito(使用通过YubiCloud的在线验证或通过挑战-响应协议的离线验证)。U2F方法需要轻触Yubi键,而挑战-响应过程可以在没有用户交互的情况下完成,所以我选择了后者。我使用这个来自System76的优秀指南设置了传统的Yubikey身份验证。

然而,当我插入钥匙时,我仍然需要一些方法来测试挑战-响应是否成功。通常,当您登录或解锁计算机时(即按锁屏上的Enter键),会运行pam_yubito。但我不想要任何点击,所以我需要一种在没有交互的情况下运行它的方法。

这些规则在插入和删除键时有效地调用脚本,因此我可以从脚本触发任何操作。请注意,该脚本不应立即解锁计算机,以避免前面提到的安全问题。

为了实际测试插入时Yubikey的挑战响应,我决定使用pamtester,这是一个简单的实用程序,假装从命令行触发PAM身份验证。由于安装了pam_yubito,因此如果插入yybikey,这将自然地测试质询响应。

#!/bin/bash exec 1>;>;(logger-s-t";$(basename";$0";)";)2>;&;1echo";运行";如果[";$1";=";=";锁定";];则pkill-USR1 swaydle否则#unlock if echo&34;";|pam34;则#PAM登录成功#kill locker kill$(Pgrep Swaylock)PS AUX|grep swaylock#On On显示SWAYSOCK=$(ls/run/user/1000/sway-ip.*.sock)swaymsg";output*DPMS on";fi退出0。

锁定时,它会立即锁定我的桌面(通过向swayIdle发送SIGUSR1,该程序管理对Sway窗口管理器的锁定)。

在解锁时,它首先查看是否可以在没有交互的情况下使用pamtester进行身份验证(当没有插入Yubikey或密钥无效时,pamtester会要求输入密码)。如果可以,它会关闭锁屏,并使用Sway WM协议打开所有显示器。

最后的结果是令人惊讶的方便,并成功地让我记得拔出我的Yubikey时,我的电脑不只一次无人看管2!任务成功。

是的,是的,我知道不会有太大的危险,因为我们现在都困在家里。但谁知道呢--也许当我们最终回到校园时,这会有所帮助。↩︎。

由Disqus提供支持的评论