用 FIDO key 来做 SSH key
OpenSSH 8.2 中新增了 FIDO/U2F 支持。
它支持两种密钥对类型: ecdsa-sk
和 ed25519-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 操作。
如果需要增加新的硬件支持, 根据现有的 notify
和 attach
规则照葫芦画瓢即可)。
安装之后,加入了 u2f
用户组的用户就可以在有设备插入时直接使用了。
生成 U2F/FIDO SSH key:
ssh-keygen -t ecdsa-sk
此处需要说明, ssh-keygen
也提供了一些其他的选项,例如只要 FIDO key 插在机器上而无须与其交互即可登录,
将 FIDO 证明信息保存到一个文件中,以及允许导出私钥等等。这些选项基本上都会降低安全性,建议不要使用。
与其他 SSH key 类似,将对应的公钥 .pub
文件内容添加到需要登录的机器的授权 key 中即可。
登录时,ssh 会要求用户碰一下 FIDO key。