delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

07 May 2022

用 FIDO key 来做 SSH key

OpenSSH 8.2 中新增了 FIDO/U2F 支持。 它支持两种密钥对类型: ecdsa-sked25519-sk。需要注意的是并非所有的 FIDO Security Key 都实现了 ed25519-sk 的硬件支持:例如,截至2022年,Titan Security Key 就不支持 ed25519-sk

使用 FIDO key 的 SSH key 在使用上和之前的 SSH key 类似, 主要的区别在于在登录时系统会确认用户是否在机器旁边(通常是碰一下 FIDO key), 这可以显著地改善安全性:与之前的 SSH key 不同的是, 即使机器上的 U2F/FIDO SSH key 私钥文件被攻击者获得, 在没有硬件 FIDO key 的情况下也无法使用这个私钥。 对于对方同时能获得私钥文件和物理访问的情况, 参见 xkcd/538,就不要跟扳手过不去了。

生成 U2F/FIDO SSH key 的过程实际上是一个 FIDO 注册过程。系统会默认使用 "ssh:" 作为 URL, 配合一个随机生成的 challenge 串。这个注册过程中我们会获得一个公钥,以及用于调用硬件私钥的信息。

FreeBSD 13.2 以及未来版本自带的 OpenSSH 已经集成了这个功能,可以直接使用。 不过,由于 Security Key 是一个 USB 设备,因此非 root 的普通用户在使用时, 必须具备操作该设备的权限。

市面上常见的 USB U2F/FIDO key 设备都可以由 security/u2f-devd 识别并自动配置权限(这个包会安装一个 devd 的 配置文件, 其中列出了常见设备的 USB 厂商和设备 ID,并在遇到这些硬件时自动进行必要的 chgrp 和 chmod 操作。 如果需要增加新的硬件支持, 根据现有的 notifyattach 规则照葫芦画瓢即可)。 安装之后,加入了 u2f 用户组的用户就可以在有设备插入时直接使用了。

生成 U2F/FIDO SSH key:

ssh-keygen -t ecdsa-sk

此处需要说明, ssh-keygen 也提供了一些其他的选项,例如只要 FIDO key 插在机器上而无须与其交互即可登录, 将 FIDO 证明信息保存到一个文件中,以及允许导出私钥等等。这些选项基本上都会降低安全性,建议不要使用。

与其他 SSH key 类似,将对应的公钥 .pub 文件内容添加到需要登录的机器的授权 key 中即可。

登录时,ssh 会要求用户碰一下 FIDO key。