Canokey 吃灰怎么办?

存 PGP 私钥、给网络帐号添加 2FA 之类的,这些玩法早就腻了。

那,给手里的 Linux 配置双因子验证把自己锁在外面,如何?

如果你也和我一样是 paranoid, 担心别人偷看到你的登录密码,然后趁你不在时解开你的电脑,不妨试试这招。

P.S.

咱目前在用 Arch Linux, 以 KDE 为桌面环境,其他发行版 / DE 需要执行的操作可能有所不同。

安装依赖

pam_u2f 模块 由 Yubico 开发 ,为 pam 提供基于 FIDO2 标准的 U2F 支持,现已加入 Arch Linux Community 仓库

在 Arch Linux 中,安装 pam-u2f 即可。

$ sudo pacman -S pam-u2f

就一个包(

添加设备

登记钥匙信息的文件默认存储在 ~/.config/Yubico .

当然也可以改,要在 pam 配置中指定 authfile 路径。

$ mkdir ~/.config/Yubico 

$HOSTNAME 换成实际的 hostname. 切记!

可以执行如下命令查看

cat /proc/sys/kernel/hostname

随后插上 key, 调用 pamu2fcfg 添加钥匙:

$ pamu2fcfg -o pam://$HOSTNAME -i pam://$HOSTNAME > ~/.config/Yubico/u2f_keys

此时钥匙的指示灯会闪烁,触摸一下即可完成添加。

如果您想为同一用户添加更多钥匙,则需要添加 -n 参数,并写入同一文件的末尾。

$ pamu2fcfg -o pam://$HOSTNAME -i pam://$HOSTNAME -n >> ~/.config/Yubico/u2f_keys

至此,钥匙添加完毕。

防意外措施

设置好 root 密码,或单独配置一个高权限用户。同时,由于 pam 涉及到这些没有配置钥匙的用户,需要注意使用 nouserok 放行这些用户。

我给能在 KDE 登录的用户都配置了钥匙,故图形界面不设置 nouserok.

配好以后也不妨备份一下配置,免得哪天一个误操作全没了。

$ cp u2f_keys u2f_keys.bak

安全策略

我的配置均基于以下的个人认知:

  • 登录和解锁时需要用 2FA 把自己锁在外面,确保安全。

    故 U2F 因子为 required.

  • 解锁以后的 sudo 速冻提权需要免密,减少输入密码的次数。

    故 U2F 因子为 sufficient. 如果未提供 U2F 则回落到原有的密码鉴权。

  • 离开电脑前,应该及时 lock/logout/shutdown, 以免出现未授权访问。

    如果使用命令行 session, 那可以使用 vlock 来锁定 session. Reference

免密

originappid 两个参数可以不写

如果要写,以下的 $HOSTNAME 必须换成实际的 hostname. 切记!

要查看当前系统的 hostname, 不妨执行如下指令:

$ cat /proc/sys/kernel/hostname

sudo

/etc/pam.d/sudo 第一行添加如下内容

auth            sufficient      pam_u2f.so cue origin=pam://$HOSTNAME appid=pam://$HOSTNAME

并且,在 sudoer 中删除有关用户 NOPASSWD 的权限。

KDE Policy Kit

/etc/pam.d/polkit-1 第一行添加如下内容

auth            sufficient      pam_u2f.so cue origin=pam://$HOSTNAME appid=pam://$HOSTNAME

双因子验证

originappid 两个参数可以不写

如果要写,以下的 $HOSTNAME 必须换成实际的 hostname. 切记!

要查看当前系统的 hostname, 不妨执行如下指令:

$ cat /proc/sys/kernel/hostname

su

/etc/pam.d/su 末尾添加

auth       required     pam_u2f.so cue nouserok origin=pam://$HOSTNAME appid=pam://$HOSTNAME

注意有 nouserok, 否则未配置 key 的用户可能无法从命令行登录。

login

/etc/pam.d/login 末尾添加

auth       required     pam_u2f.so cue nouserok origin=pam://$HOSTNAME appid=pam://$HOSTNAME

注意有 nouserok, 否则未配置 key 的用户可能无法从命令行登录。

vlock

/etc/pam.d/vlock 末尾添加

auth       required     pam_u2f.so cue nouserok origin=pam://$HOSTNAME appid=pam://$HOSTNAME

注意有 nouserok, 否则未配置 key 的用户可能无法从命令行解锁。

KDE login

/etc/pam.d/sddm 末尾添加

auth       required   pam_u2f.so cue origin=pam://$HOSTNAME appid=pam://$HOSTNAME

cue 可以不写,因为不会有 prompt. 仅有钥匙的指示灯会闪烁。

KDE lock screen

/etc/pam.d/kde 末尾添加

auth       required   pam_u2f.so cue origin=pam://$HOSTNAME appid=pam://$HOSTNAME

写在最后

尽管有 faillock 提供保护,但还是务必注意提高密码强度,否则仍可能被暴力破解。

只要取得写盘的权限,pam 规则就可以被轻易修改。一般而言,建议同时做好全盘加密。(对于 LUKS, 使用 detached header 可以进一步提升安全性,起到类似 2FA 的作用。)

否则别人拿 archiso 就能 chroot 进去抹掉规则,等于形同虚设。

Reference