|SSH使用FIDO2 USB进行身份验证


在OpenSSH 8.2中 , 提供了对FIDO2的支持 。 这样用户就可以硬件USB密钥证书进行用户认证 。 这样可以实现简单、有效和安全的SSH认证了 。 本文我们就尝试一下基于FIDO2的SSH认证 , 前提是需要一个USB key设备 。
|SSH使用FIDO2 USB进行身份验证
本文插图

FIDO2
在硬件认证安全领域WebAuthn和FIDO2的发展 , 他给我们带来了更便捷安全的方法 。 WebAuthn和FIDO2旨在通过标准化二者之间的通信方式使用安全设备的变得真正容易 。
对每一个人来说这都是一个好消息 , 现在大家可以使用便捷的USB密钥 , 无需额外的安全知识 , 即可非常轻松地保护所有身份验证 , 完全避免网络钓鱼 , 密码盗窃以及其他恶意攻击的干扰 , 只需要插入USB密钥 , 按小按钮/输PIN或者刷指纹 , 然后重新登录 。
虽然之前很多人可能都用过银行的网银 , 但是由于那是不标准通用的方式 , 不光要安装各种各样的驱动而且还要必须要特定版本的IE才行 。 而如果支持了FIDO2则可以被所有OS和任何浏览器所支持 , 当然包括今天要说的SSH 。
截止目前根据有人统计国内也有很多企业加入了FIDO联盟 , 包括阿里等大企业 。
|SSH使用FIDO2 USB进行身份验证
本文插图

FIDO2分为WebAuthn和CTAP协议 , 最佳使用场景包括:
在设备上通过浏览器使用设备配置的指纹等生物识别能力进行身份认证;
在设备上通过浏览器使用外置Security key进行身份认证;
在设备上通过另一台设备作为认证器完成身份认证 。
|SSH使用FIDO2 USB进行身份验证
本文插图

结合使用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的密钥 , 即可将其与SSH一起使用 。 有''驻留键''模式仅在Yubikey 5C和更高版本的FIDO2上有效 。
使用方法
在了解了有关设备如何工作的所有不必要的细节之后 , 准备好将其中一个用于SSH 。 设置非常简单 , 基本上只需一两个命令(取决于方法) , 在客户端和服务器上都运行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使用FIDO2 USB进行身份验证
本文插图

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登陆了 。
当然使用该代理软件有个缺点 , 启动代理认证 , 完成一次认证后 , 支持该证书登陆服务器都可以直接登陆 , 这可会存在一定安全问题 。 可以通过定期关闭代理以保证安全 。
|SSH使用FIDO2 USB进行身份验证
本文插图

总结
【|SSH使用FIDO2 USB进行身份验证】总的来说 , OpenSSH对FIDO的支持给我们带来了一种更便捷而且安全的身份认证方式 。 当然由于这是一个开始 , 可能还会存在着一些问题和bug , 希望各种SSH客户端软件也能及时跟进 , 内置支持该协议 , 让大家安全水平都提高一个档次 。


    推荐阅读