用 pam_u2f 提供双因子验证和免密鉴权
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
免密
origin
和 appid
两个参数可以不写。
如果要写,以下的 $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
双因子验证
origin
和 appid
两个参数可以不写。
如果要写,以下的 $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 进去抹掉规则,等于形同虚设。