如何将FIDO2 USB密钥与SSH配合使用

2020-06-30 21:23:28

我最近安装了Ubuntu Wacky What,这是最新的版本,我对它与SSH 8.2一起发布感到非常兴奋,这意味着我终于可以使用硬件USB密钥进行安全、易于使用的身份验证了。如果保护您的设备一直是您想要轻松做到的事情,请继续往下读,因为它终于实现了。

最近与安全相关的最令人兴奋的发展之一是WebAuthn和FIDO2的发展,这两个基本上是“好的安全东西”的委婉说法。总而言之,WebAuthn和FIDO2的目标是通过标准化两者相互交谈的方式,并使用比“东西”更好的术语,使安全设备与东西一起使用变得非常容易。

这对我们来说是个好消息,因为现在我们有了非常便宜的USB密钥,可以非常容易地保护我们所有的身份验证,而不需要任何特殊的安全知识。您需要知道的就是完全不受网络钓鱼、密码盗窃和其他一系列丢失比特币的方式的影响,只需插入您的USB密钥,按下小按钮/键入您的PIN/输入您的指纹,您就可以登录了。

这和宋承宪有什么关系?很少,但我喜欢漫无边际,这是众所周知的。

正如您可能从上面两个看似不相关的点和本节的免费标题中所怀疑的那样,如果我们可以使用FIDO2密钥通过SSH进行身份验证,而OpenSSH开发人员实现了这一点,那将是非常巨大的。

在较高级别上,USB设备(FIDO2设备不必是USB的,但它们通常是USB的)将生成一个密钥。然后,该设备可以使用该密钥来证明您拥有该设备,而无需该密钥离开该设备。这意味着,通过扩展,您可以使用该设备向任何询问的服务器证明您就是您所说的那个人。密钥要么存储在设备上(称为“驻留密钥”),这需要设备支持存储,要么不存储,您需要将数据存储在其他地方。

根据我的理解(我不确定这一点,如果我错了,请纠正我)的工作方式如下:每个设备出厂时都内置了一个密钥对/种子,但它可以接受额外的种子,通过将其当前种子与给定的种子相结合来派生更多对。这允许设备在没有任何存储空间的情况下生成密钥,但它确实要求您每次都给它们提供种子。具有“驻留密钥”功能的设备可以将整个种子存储在它们的内存中,并且不需要您做任何其他的事情。这允许设备在没有任何存储空间的情况下生成密钥,但它确实要求您每次都给它们提供种子。具有“常驻密钥”功能的设备可以将整个种子存储在其内存中,并且不需要您执行任何其他操作。

使用此类设备的好处包括消除网络钓鱼、密码窃取、身份验证重播和许多其他攻击。由于设备经过特定领域(服务器地址/URL/等)的身份验证,攻击者不能在另一个站点上重复使用一个站点的身份验证,这使得网络钓鱼成为不可能。也没有人可以窃取您的密码或私钥,因为密码或私钥位于设备本身,无法提取。唯一可能的攻击是设备的物理盗窃,通过让设备请求

将这个内置到SSH的另一个好处是,你不需要特别的Yubikey,也不需要摆弄额外的软件,比如Yubikey代理、PIV模式或其他任何东西。你只需插入任何与FIDO2兼容的密钥,你就可以在SSH上使用它。我在我的Yubikey 5C、Yubikey FIDO2和Yubikey neo上都尝试了以下方法,它们对所有设备都很有效,但“驻留密钥”模式只在5C和更高版本的FIDO2密钥上起作用。

在对设备如何工作进行了所有不必要的详细说明之后,我们已经准备好实际使用一个用于SSH。设置非常简单,基本上只有一两个命令(取决于方法),不需要安装额外的软件,尽管您将需要在客户端和服务器上运行OpenSSH 8.2。

我将把指令分成两部分,一部分用于说明您的密钥是否支持(并且您想要使用)驻留键模式,另一部分用于说明是否不支持驻留键模式。使用这两种方法都没有什么坏处,所以如果您不知道您的设备是否支持驻留键模式,只需尝试第一种方法,如果失败则继续使用第二种方法。

SSH将要求您输入PIN并触摸您的设备,然后将密钥对保存在您告诉它的位置。如果该命令报告ed25519不可用,请尝试此命令:

OpenSSH将保存两个文件,一个名为id_MyKey_sk,另一个名为id_MyKey_sk.pub。您只需要后者,它是您的公钥,现在可以将其添加到运行OpenSSH 8.2和更高版本的任何服务器的授权密钥文件中。

要将私钥添加到SSH代理,您可以将id_MyKey_SK复制到~/.ssh/目录中,或者(如果您在新计算机上并且没有密钥),运行。

插入设备后,这将向SSH代理添加密钥,您将能够立即连接到服务器。

非常驻密钥模式与前面的模式相同,不同之处在于您不能直接从设备使用ssh-add-K加载密钥。与前面一样,运行:

SSH将要求您输入PIN并触摸您的设备,然后将密钥对保存在您告诉它的位置。如果该命令报告ed25519不可用,请尝试此命令:

OpenSSH将保存两个文件,一个名为id_MyKey_sk,另一个名为id_MyKey_sk.pub。您需要这两个文件,将id_MyKey_SK存储在您的~/.ssh/目录(生成它的目录)中,然后将id_MyKey_sk.pub文件添加到您想要登录到的任何服务器。

就是这样,当您尝试登录时,OpenSSH会要求您提供您的PIN并触摸设备。

您可以将no-touch-Required选项传递给ssh-keygen,告诉它您不希望它每次都需要触摸设备,但启用该选项并没有收到很好的效果。如果您尝试使用它,请在注释中让我知道它的工作情况,但是为了安全起见,如果您禁用它可能会更好。

将密钥存储在设备上意味着没有人能够窃取它(希望您的设备设置了PIN或其他身份验证方法),但是在您连接之后,不受信任的计算机仍可以通过SSH会话发送命令。不要从您不信任的计算机进行SSH,在使用SSH转发(-A选项)时要格外小心,因为服务器可能会要求您的计算机代表您向其他服务器进行身份验证。

总的来说,我对FIDO2感到非常兴奋,特别是对于SSH身份验证,因为我们终于有了一种方法来保护身份验证,我的父母可以很容易地使用它,而且攻击面要小得多。我特别感兴趣的是,WebAuthn是如何在没有用户名和密码的情况下在Web上进行身份验证的(参见我的django-webauthin库中的演示),并希望它能得到广泛应用。

如果你有任何反馈,请发推特或对我嘟嘟,或者直接给我发电子邮件。另外,请查看我的YouTube频道(因为最近谁没有YouTube频道?),我经常在那里直播我的深夜Maker会议。