用 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。