用 pam_u2f 提供双因子验证和免密鉴权

Last updated on 2022-07-28, Thu, 10:12 PM

View English Version

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. 切记!

例如,在 session 中执行如下命令:

$ export 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 密码,或者添加一个有 sudo 权限的用户,以便在配置失败时回滚。

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

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

安全策略

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

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

    故 U2F 因子为 required.

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

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

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

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

    但个人觉得,如果有什么需要离开时执行的程序,最好跑在 tmux 里面,然后 logout.

免密

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

Policy kit 弹出窗口时,

双因子验证

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

写在最后

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

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

Reference


用 pam_u2f 提供双因子验证和免密鉴权
https://blog.h3a.moe/src/d07680/
Author
H3arn
Posted on
2022-07-25, Mon, 10:42 PM
Updated on
2022-07-28, Thu, 10:12 PM
Licensed under