用 pam_u2f 提供双因子验证和免密鉴权
Last updated on 2022-07-28, Thu, 10:12 PM
Canokey 吃灰怎么办?
存 PGP 私钥、给网络帐号添加 2FA 之类的,这些玩法早就腻了。
那,给手里的 Linux 配置双因子验证把自己锁在外面,如何?
如果你也和我一样是 paranoid, 担心别人偷看到你的登录密码,然后趁你不在时解开你的电脑,不妨试试这招。
P.S.
咱目前在用 Arch Linux, 以 KDE 为桌面环境,其他发行版 / DE 需要执行的操作可能有所不同。
安装依赖
pam_u2f
模块 由 Yubico 开发 ,为 pam
提供基于 FIDO2 标准的 U2F 支持,现已加入 Arch Linux Community 仓库 。
在 Arch Linux 中,安装 pam-u2f
即可。
就一个包(
添加设备
登记钥匙信息的文件默认存储在 ~/.config/Yubico
.
当然也可以改,但是要在 pam 配置中指定 authfile
路径。
把 $HOSTNAME
换成实际的 hostname. 切记!
例如,在 session 中执行如下命令:
随后插上 key, 调用 pamu2fcfg
添加钥匙:
此时钥匙的指示灯会闪烁,触摸一下即可完成添加。
如果您想为同一用户添加更多钥匙,则需要添加 -n
参数,并写入同一文件的末尾。
至此,钥匙添加完毕。
防意外措施
设置好 root 密码,或者添加一个有 sudo 权限的用户,以便在配置失败时回滚。
尽管有 faillock 提供保护,但还是务必注意提高密码强度,否则仍可能被暴力破解。
我给能在 KDE 登录的用户都配置了钥匙,故图形界面不设置 nouserok
.
安全策略
我的配置均基于以下的个人认知:
登录和解锁时需要用 2FA
把自己锁在外面,确保安全。故 U2F 因子为
required
.解锁以后的 sudo
速冻之类更需要免密,减少输入密码的次数。故 U2F 因子为
sufficient
. 如果未提供 U2F 则回落到原有的密码鉴权。离开电脑前,应该及时 lock/logout/shutdown, 以免出现未授权访问。
如果使用命令行 session, 那可以使用
vlock
来锁定 session. Reference但个人觉得,如果有什么需要离开时执行的程序,最好跑在
tmux
里面,然后 logout.
免密
origin
和 appid
两个参数可以不写。
如果要写,以下的 $HOSTNAME
必须换成实际的 hostname. 切记!
要查看当前系统的 hostname, 不妨执行如下指令:
sudo
在 /etc/pam.d/sudo
第一行添加如下内容
并且,不要给 sudoer
添加 NOPASSWD
的权限。
KDE Policy Kit
在 /etc/pam.d/polkit-1
第一行添加如下内容
Policy kit 弹出窗口时,
双因子验证
origin
和 appid
两个参数可以不写。
如果要写,以下的 $HOSTNAME
必须换成实际的 hostname. 切记!
要查看当前系统的 hostname, 不妨执行如下指令:
su
在 /etc/pam.d/su
末尾添加
注意有 nouserok
, 否则未配置 key 的用户可能无法从命令行登录。
login
在 /etc/pam.d/login
末尾添加
注意有 nouserok
, 否则未配置 key 的用户可能无法从命令行登录。
vlock
在 /etc/pam.d/vlock
末尾添加
注意有 nouserok
, 否则未配置 key 的用户可能无法从命令行解锁。
KDE login
在 /etc/pam.d/sddm
末尾添加
cue
可以不写,因为不会有 prompt. 仅有钥匙的指示灯会闪烁。
KDE lock screen
在 /etc/pam.d/kde
末尾添加
写在最后
只要取得写盘的权限,pam 规则就可以被轻易修改。一般而言,建议同时做好全盘加密。(对于 LUKS, 使用 detached header 可以进一步提升安全性,起到类似 2FA 的作用。)
否则别人拿 archiso 就能 chroot 进去抹掉规则,等于形同虚设。
Reference
- https://wiki.archlinux.org/title/Universal_2nd_Factor#Authentication_for_Arch_Linux ↩
- https://github.com/Zer0CoolX/Fedora-KDE-Yubikey-U2F-2FA-Logins-Guide ↩
- https://webcache.googleusercontent.com/search?q=cache%3AX6Y0_n-k4WwJ%3Ahttps%3A%2F%2Fwww.reddit.com%2Fr%2Farchlinux%2Fcomments%2Ffoi5ig%2Fenabling_u2f_when_logging_in%2F&hl=en&gl=id&strip=0&vwsrc=0 ↩