在 8.2(最新为 8.3)版本中,OpenSSH 提供了对 FIDO 和 UAF 的支持。从此用户就可以用硬件 USBKEY 证书进行 SSH 原生认证。这样可以实现简捷、有效和安全的 SSH 认证。本文我们就就少一下 FIDO2 以及 OpenSSH 对其的支持,并尝试一下基于 FIDO2 的 SSH 认证,前提需要一个 USB key 设备(推荐 Yubikey 5C)。
FIDO2
在硬件认证安全领域 WebAuthn 和 FIDO2 近年来获得长足发展,它给我们带来了更便捷安全的个人认证方法。WebAuthn 和 FIDO2 旨在通过标准化二者之间的通信方式使用安全设备的变得真正容易。对每一个人来说这都是一个好消息,现在大家可以使用便捷的 USBKEY,无需额外的安全知识,就能非常便捷安全低进行个人身份验证,完全避免网络钓鱼,密码盗窃以及其他恶意攻击的行为,只需要插入 USBKEY,按下按钮,输 USBKey PIN 码(设备密码)或者刷指纹,然后安全登录。
之前很多人可能都用过银行的网银,但是由于那是不标准通用的方式,不光要安装各种各样的驱动而且还必须要特定版本的 IE 才行。而如果支持了 FIDO2 则可以被所有 OS 和任何浏览器所支持,当然包括今天要说的 SSH。截止目前根据有人统计国内也有很多企业加入了 FIDO 联盟,包括阿里、联想等大企业和飞天诚信等专门的 USBKET 设备厂商。
FIDO2 分为 WebAuthn 和 CTAP 协议,最佳使用场景包括:
在设备上通过浏览器使用设备配置的指纹等生物识别能力进行身份认证;
在设备上通过浏览器使用外置 Security key 进行身份认证;
在设备上通过另一台设备作为认证器完成身份认证。
结合使用 FIDO2 和 SSH
对广大使用 Linux 和 Mac 的技术人员来说,除了浏览器使用最多的要数 SSH 了。如果可以使用 FIDO2 密钥对 SSH 进行身份验证,那将带来极大的方便和安全。为此 OpenSSH 也放弃一贯对硬件密钥体系的傲慢态度,在新版本中支持了 FIDO(U2F)和 FIDO2 进行身份验证了,而带有驻留键的 FIDO2 具有更好的便捷和安全性。其认证流程是 USB 设备(FIDO2 设备不一定是 USB,但通常是 USB 设备)生成一个密钥。密钥要么存储在设备上(称为驻留密钥),要么需要设备不支持存储,需要将数据存储在其他位置。
使用 USB key 设备的好处包括消除网络钓鱼,密码盗窃,身份验证重放以及许多其他攻击。由于设备通过特定领域(服务器地址/URL/等)进行身份验证,因此攻击者无法在另一个站点上重复使用一个站点的身份验证,这使得网络钓鱼无法进行。密码或私钥存储在设备上并且无法复制提取,所以任何人都不能窃取密码或私钥。唯一可能的攻击是你的 USB Key 丢了,但是由于设备有 PIN 密码,并且有错误次数限制,尝试几次错误有,该设备将会锁定实效。
可能有用过 Yubikey 的同学,使用 SSH 内置功能好处是不需要特别使用 Yubikey,也不需要弄乱 Yubikey 代理,PIV 模式或其他任何其他软件。只需插入兼容 FIDO2 的 USBKEY,即可将其与 SSH 一起使用。注意:驻留键模式仅在 Yubikey 5C 和更高版本的 FIDO2 上有效。
使用方法
在了解了有关设备如何工作的细节之后,我们在说说如何实践使用。其实配置非常简单,基本上只需一两个命令行即可,除了需要客户端和服务器上都运行 OpenSSH 8.2,无需安装其他软件。下面我们分常驻密钥模式和非常驻模式的两种方法。
常驻密钥模式
在支持 FIDO 2 设备的下,使用以下命令生成密钥并将其存储在设备上,支持的密钥类型有”ed25519-sk”和”ecdsa-sk”两种证书类型。
ssh-keygen -t ed25519-sk -O resident -f ~/.ssh/id_ ed25519-sk ssh-keygen -t ed25519-sk -O resident -f ~/.ssh/id_ ecdsa-sk
SSH 会要求输入 PIN 码并触摸的设备,然后将密钥对保存在设置目录。
ssh-keygen 将生成两个文件,一个为 id_ecdsa _sk 为私钥,一个为 id_ecdsa _sk.pub 公钥。只需要将该公钥添加到服务器上的 authorized_keys 即可中。
要将私钥添加到 SSH 代理,需要将其复制到~/.ssh/目录中,或者(如果在新计算机上并且没有密钥),可以运行
ssh-add -K
插入设备。就会将密钥添加到 SSH 代理,然后就将能够连接到服务器。
非常驻密钥模式
非驻留密钥模式与前面模式基本相同,区别之处在于无法用 ssh-add -K 直接从设备加载密钥。和前面一样,运行:
ssh-keygen -t ed25519-sk -f ~/.ssh/id_ ed25519-sk ssh-keygen -t ed25519-sk -f ~/.ssh/id_ ecdsa-sk
SSH 会要求输入 PIN 并触摸设备,然后将密钥对保存在设置的目录。需要手动将密钥对存储在~/.ssh/目录中,并将公钥文件添加到要登录的任何服务器上的 authorized_keys 既可。
当尝试登录时,OpenSSH 会要求提供 PIN 并触摸设备。
可以在生成密钥时候设置 no-touch-required 选项来设置不需要每次都触摸设备,但是这样的设置不是很安全。
将密钥存储在设备上意味着没有人可以窃取它(设备设置了 PIN 或其他身份验证方法),但是在连接后,不受信任的计算机仍可以通过 SSH 会话发送命令。不要从不信任的计算机上用 SSH 服务器,尤其是在使用 SSH 转发(-A 选项)时要格外小心,因为服务器随后可能会当做跳板或者代理而访问其他服务器。
非 FIDO2 设备和非 openSSH 8.2 客户端
对于不支持 FIDO2 的其他设备(买不起 Yubikey,比如几十块的国产飞天 USBkey),在使用其他 ssh 客户端,而且 ssh 版本不是 8.2 的其实也有一种方法,只是需要下载一个第三方的代理软件 WinCryptSSHAgent(github:/ /buptczq/WinCryptSSHAgent)。
WinCryptSSHAgent 基于 Windows 证书管理系统, 不需要安装任何驱动就能够访问智能卡上的证书. 这个项目实现了 Windows 上各种各样 SSH 客户端的私有 Agent 协议, 在发生 SSH 认证时, 客户端将信息发给这个 Agent, 这个 Agent 会通过 Windows 提供的 API 对信息进行签名, 完成认证。目前兼容的 SSH 客户端有: Git for Windows、Windows Subsystem for Linux、Windows OpenSSH、Putty、Jetbrains、SecureCRT、Xshell、Cygwin、MINGW 等。
启动该代理软件,然后就可以实现用 USBKey 登陆了。
当然使用该代理软件有个缺点,启动代理认证,完成一次认证后,支持该证书登陆服务器都可以直接登陆,这可会存在一定安全问题。可以通过定期关闭代理以保证安全。
总结
总的来说,OpenSSH 对 FIDO 的支持给我们带来了一种更便捷而且安全的身份认证方式。当然由于这是一个开始,可能还会存在着一些问题和 bug,希望各种 SSH 客户端软件也能及时跟进,内置支持该协议,让大家安全水平都提高一个档次。
来源:freebuf.com 2020-08-19 16:22:00 by: ijzmesec
请登录后发表评论
注册