使用 YubiKey 5 进行 WebAuthn Web 身份验证

本文着眼于最近发布的 YubiKey 5 硬件验证器系列,以及使用新的 WebAuthn API 进行 Web 身份验证如何利用 YubiKey 等设备实现轻松的网站注册和强大的用户身份验证。

我在 2016 年 5 月的《Linux Journal》杂志上介绍了 YubiKey 4,此后该杂志发表了许多关于 YubiKey 和其他形式的多因素身份验证的文章。Yubico 最近推出了 YubiKey 5 系列产品。除了 YubiKey 长期以来对多种安全协议的支持之外,最有趣的功能是该产品对 FIDO2 和 WebAuthn 的全新支持。

WebAuthn 是用于 Web 身份验证的应用程序编程接口 (API)。它使用加密“验证器”(例如 YubiKey 5 硬件令牌)来验证用户身份,以补充(甚至替代)典型的用户名/密码组合。WebAuthn 目前是万维网联盟 (W3C) 的候选推荐标准,并且已被 Chrome 和 Firefox 等主要浏览器实现。

本文概述了 YubiKey 5 系列,然后详细介绍了 WebAuthn API 的工作原理。我还研究了 YubiKey 5 系列等硬件令牌如何向用户隐藏 WebAuthn 的复杂性。我的目标是演示使用 YubiKey 注册和验证网站是多么容易,而无需担心底层的 WebAuthn API。

关于 YubiKey 5 系列

YubiKey 5 系列支持广泛的双因素和多因素身份验证协议,包括

  • 质询-响应(HMAC-SHA1 和 Yubico OTP)。
  • 客户端到验证器协议 (CTAP)。
  • FIDO 通用第二因素身份验证 (U2F)。
  • FIDO2。
  • 开放授权,基于 HMAC 的一次性密码 (OATH-HOTP)。
  • 开放授权,基于时间的一次性密码 (OATH-TOTP)。
  • OpenPGP。
  • 个人身份验证 (PIV)。
  • Web 身份验证 (WebAuthn)。
  • Yubico 一次性密码 (OTP)。

此外,整个 YubiKey 5 系列(U2F/FIDO2 专用安全密钥型号除外)现在都支持 OpenPGP 公钥密码术,RSA 密钥大小高达 4096 位。与早期型号支持的密钥大小相比,这是一个显著的提升。Yubico 的 OpenPGP 支持还包括一个额外的插槽,用于 OpenPGP 身份验证密钥,以便在与 SSH 兼容的代理(例如 GnuPG 的 gpg-agent)中使用。

""

图 1. YubiKey 5 系列

您可以在计算机上创建 OpenPGP 密钥,然后将其移动到 YubiKey 中,或者您可以直接在密钥本身上创建它们以获得额外的安全性。在密钥上生成加密密钥可确保密钥永远不会暴露给主机计算机。即使连接到不应信任密钥材料的系统,这也能提供相对安全地签名和解密数据的能力。

YubiKey 5 系列还以其广泛的外形尺寸而著称,包括 USB-A、USB-C 和可无限期留在端口中的低外形“nano”设备。许多外形尺寸还支持近场通信 (NFC),可与平板电脑和手机配合使用。

""

图 2. 带有 NFC 的 YubiKey 5

YubiKey 5 系列还包括一款低成本型号(恰如其分地命名为“安全密钥”),采用 USB-A 外形尺寸。“安全密钥”仅提供 U2F 和 FIDO2 身份验证。该型号目前的价格不到该系列中功能更强大的同类产品的一半。如果您不需要其他功能或外形尺寸,只想使用 WebAuthn Web 身份验证,那么该型号是一个很好的起点。

""

图 3. Yubico 安全密钥

WebAuthn 究竟是什么?

双因素身份验证 (2FA) 是每个人可能越来越熟悉的东西。在安全性方面,身份验证需要以下一项或多项

  1. 您知道的东西,例如密码。
  2. 您拥有的东西,例如加密令牌或正式颁发的身份证。
  3. 您的身份,例如具有特定指纹或视网膜图案的人。

用户名和密码组合是“您知道的东西”类型的身份验证。现在,许多网站和服务通过第二因素为用户提供更好的安全性。这通常是通过短信服务 (SMS) 的一次性密码服务、通过 Google Authenticator 或类似应用程序的单次使用基于时间的一次性密码 (TOTP) 令牌、来自 Duo 或 LastPass 集成的基于推送的 TOTP 令牌,或 U2F 质询/响应身份验证。

U2F 最显著地被 Google 服务使用,并且直到最近,它一直仅限于使用最新 Chrome 浏览器的用户。从安全角度来看,U2F 和其他 2FA 技术是提高 Web 应用程序安全性的有用工具。但是,越来越需要更无缝的用户体验,并且越来越需要更强大的身份验证协议。作为不断发展的 W3C 草案标准的一部分,WebAuthn 在使用兼容的验证器(例如 YubiKey 令牌)时,提供了更好的用户体验(并且可以说是更强大的身份识别和授权方法)。

WebAuthn 旨在向后兼容为早期 FIDO U2F 标准构建的设备。这包括 YubiKey 4、Google 的 Titan 密钥和各种仅 U2F 设备等硬件令牌。但是,与 YubiKey 5 系列不同,许多 U2F 设备仅限于提供基于硬件的第二因素,并且并非设计用于 WebAuthn 提供的全套多因素功能。

作为 API,WebAuthn 从根本上来说是一组协议,它与支持 CTAP 的设备(如 YubiKey 5)交互,以提供一套全面的身份验证服务,这些服务依赖于公钥密码术。根据服务器和用户设备的功能,WebAuthn 支持以下各项

  • 单因素身份验证:无密码登录,硬件令牌的存在就足够了。这在某种程度上类似于无密码 SSH 密钥,只是更加安全。物理 YubiKey 令牌即使在插入时也不会将密钥材料暴露给本地或远程主机系统,并且在物理移除后根本无法使用。
  • 双因素身份验证 (2FA):这通常是用户名和密码组合(您知道的东西),然后是硬件令牌的检测(您拥有的东西)。由于需要物理令牌,因此这种类型的 2FA 通常被认为比第二因素身份验证系统(如 SMS、TOTP 或 HOTP 生成器)更安全。
  • 多因素身份验证 (MFA):真正的 MFA 通常涉及 PIN 或生物特征签名,这些签名不会通过网络传输。此第三因素通常在本地用于解锁硬件令牌的功能,并且它为成功身份验证添加了另一层“您知道的东西”或“您的身份”。
Google Authenticator 及其替代方案

尽管 RSA 的 SecurID 解决方案等专有系统已经存在很长时间,但过去十年中,第二因素身份验证的许多替代方案应运而生。今天的用户可能熟悉向其手机发送六位代码的 SMS 解决方案,但自 2003 年以来,其他类型的客户端软件和硬件令牌也日益兴起。

Google Authenticator 最初于 2010 年发布,可以说是最著名的面向典型 Web 用户的软件令牌解决方案。Google Authenticator 利用了许多开放(如果不是完全开源)协议,包括广泛使用的 QR 条形码符号体系。扫描 QR 码会将软件令牌导入用户的智能手机,从而在设备上填充客户端代码生成器。

Google Authenticator 的常见替代方案包括

  • FreeOTP(因 Red Hat 开源并在 GitHub 上以 Apache 2.0 许可证提供而闻名)。
  • Authy(因提供多设备功能而闻名)。
  • LastPass Authenticator。
  • Microsoft Authenticator。
  • Duo Mobile。

当然还有很多其他替代方案,每种方案都有其自身的优点、缺点和专门的用例。这相对较少的几种方案代表了典型用户的大部分心智份额,但您绝对可以根据成本、开放标准支持和安全记录等问题考虑其他替代方案。

WebAuthn,过度简化

WebAuthn 规范的当前工作草案超过 100 页,因此用简单的术语描述它会冒着过度简化的风险。考虑到这一点,本节不是对整个 WebAuthn API 的全面指南。它旨在成为一个有用的抽象,突出显示 WebAuthn 在幕后如何工作,突出显示 YubiKey 在简化 Web 注册和身份验证过程中的价值。

WebAuthn 的核心是在“依赖方服务器”(又名远程服务,例如网站)和用户拥有的令牌之间发生的质询/响应。服务器发出一个质询,最终由您的浏览器接收,然后浏览器与 YubiKey 或另一个兼容 U2F 或 FIDO2 的令牌交互。此令牌称为“验证器”。

使用像 YubiKey 这样的硬件令牌,验证器可以创建对服务器质询的签名响应,而无需暴露存储在令牌内的凭据的密钥部分。然后,服务器验证来自验证器的响应,以完成注册或身份验证过程。

即使使用软件令牌(与像 YubiKey 这样的硬件令牌相反),API 也旨在限制在令牌注册或身份验证期间暴露给服务器的数据量。尽管硬件令牌被认为更安全,但 WebAuthn API 也允许使用其他类型的验证器。

使用 WebAuthn,用户体验仅涉及几个简单的步骤

  1. 从浏览器接收身份验证提示。
  2. 使用您的 YubiKey 提供响应。
  3. 等待几毫秒,让 WebAuthn 框架验证您的 YubiKey 的响应。
  4. 以经过身份验证的用户身份进行有趣的操作!

但在幕后,WebAuthn 和 YubiKey 正在做更多的工作。让我们仔细看看。

并非如此简单的 WebAuthn API

尽管用户体验很简单,但实现细节却绝非如此。WebAuthn API 涵盖了两个密切相关的密钥管理活动,用于处理注册和身份验证,并且它将这些活动称为“仪式”。

这两个仪式都需要依赖方服务器、依赖方 JavaScript 应用程序、受支持的 Web 浏览器和具有某些属性的验证器。

目前,受支持的 Web 浏览器包括

  • Mozilla Firefox 60+。
  • Google Chrome 67+。
  • 适用于 Android Beta 70+ 的 Google Chrome。

Microsoft Edge 的支持于 2018 年 7 月引入到开发版本中。与此同时,Apple 是 WebAuthn 工作组的参与者,但没有迹象表明 Safari 浏览器是否(或何时)会支持 WebAuthn API。

验证器属性包括密钥管理功能和生成加密签名的能力。FIDO2 验证器还必须能够将凭据映射到与给定依赖方关联的每个 64 字节用户句柄,尽管底层实现细节可能会有所不同。由于 YubiKey 5 文档声明它支持“无限”凭据,因此我假设映射是从 WebAuthn 仪式的输入中派生的,而不是使用 YubiKey 令牌内的固定存储空间。

与验证器证明全局唯一标识符 (AAGUID) 如何与各个令牌关联而不引起隐私问题,以及验证器出处证明如何由 X.509 证书处理相关的协议和实现细节,对于 WebAuthn 系统的安全性当然非常重要。但是,尽管规范中解决了这些问题,但普通用户实际上不需要这种程度的技术细节即可安全地使用 YubiKey 5 设备。WebAuthn/YubiKey 解决方案的优点在于 API 为您处理了这些细节。

使用 WebAuthn API 进行注册

在您可以使用 YubiKey 对 Web 服务进行身份验证之前,支持 U2F 或 FIDO2 的设备必须通过注册仪式向依赖方服务器注册。在某些潜在的用例中,注册是可选的,或者首次注册与新注册的身份验证相结合。但是,典型的网站可能希望将给定的凭据与用户句柄关联,用户句柄是用户帐户的 64 字节标识符。

在撰写本文时,API 定义的注册仪式遵循七个步骤(图 4)

  1. 注册请求:服务器端应用程序发起注册请求。WebAuthn API 未指定如何完成此操作。这目前是特定于应用程序的实现细节。
  2. 服务器将输入传递到客户端 JavaScript:服务器将质询以及用户信息和依赖方数据发送到客户端浏览器中运行的 JavaScript 应用程序。
  3. 浏览器从验证器请求凭据:用户的浏览器向验证器提供足够的信息,以便设备可以生成唯一的凭据。YubiKey 5 在生成新凭据时包含服务器生成的用户句柄,而较旧的 YubiKey 或其他仅 U2F 设备将创建一个 userHandle 设置为 null 的凭据,以实现向后兼容性。
  4. 验证器创建证明:YubiKey 为凭据创建加密密钥对,并将公钥捆绑在一个名为“证明声明”的特殊消息中。
  5. 验证器将证明对象发送到浏览器:YubiKey 使用可验证的数字签名对证明声明进行签名,并将该声明与其他数据一起作为“attestationObject”传递回浏览器。
  6. 凭据传递给依赖方:JavaScript 应用程序打包 attestationObject 以及一些 JSON 和编码数据,并将其作为“AuthenticatorAttestationResponse”发送回依赖方服务器。
  7. 服务器验证响应:然后服务器验证响应和凭据的数字签名。如果所有验证都成功,则服务器通过将证明中的公钥与用户的帐户关联来完成注册过程。然后,此公钥可用于立即或将来的身份验证。
""

图 4. WebAuthn 注册流程(“Web 身份验证:访问公钥凭据级别 1 的 API。” W3C 候选推荐标准,2018 年 8 月 7 日。https://www.w3.org/TR/webauthn/#web-authentication-api)

坦率地说,即使是这种对注册过程的“深入研究”也掩盖了大量的密码学和消息传递。但是,WebAuthn 的美妙之处,尤其是在与 YubiKey 配对使用时,在于所有这些加密工作和进程间通信对于最终用户来说基本上是不可见的。在实际使用中,基本注册仅涉及插入 YubiKey 以响应浏览器提示并点击 YubiKey 的触摸感应部分(因型号而异)以激活它。

一旦验证器注册,您只完成了一半。您已使用 YubiKey 注册了 WebAuthn 凭据,但您仍然必须将新注册的凭据呈现给网站,然后才能真正获得授权。在实践中,网站可以将注册和身份验证从用户的角度呈现为看似统一的过程,但它们实际上是 WebAuthn API 中的不同仪式。

使用 WebAuthn API 进行身份验证

身份验证过程实际上在其轮廓上与注册过程非常相似。尽管协议和消息可能有所不同,但关键区别在于依赖方服务器和验证器正在验证在上述注册过程中创建的现有凭据。

""

图 5. WebAuthn 身份验证流程(“Web 身份验证:访问公钥凭据级别 1 的 API。” W3C 候选推荐标准,2018 年 8 月 7 日。https://www.w3.org/TR/webauthn/#web-authentication-api)

与注册一样,用户的角度只是插入 YubiKey 并通过触摸触发它。还有什么比这更简单的呢?

无密码登录示例

如果您有支持 U2F 或 FIDO2 的 YubiKey 设备,您可以使用许多公开可用的测试服务来测试注册和身份验证。对于这组示例,让我们使用 Duo Security 提供的站点进行 YubiKey 测试。

启动您的浏览器,并导航到 https://webauthn.io。接下来,输入唯一的用户名来注册您的 YubiKey。由于许多其他用户也可能正在测试他们的密钥,我建议使用 UUID 作为您的用户名。运行 uuidgen 命令(在大多数 Linux 和 macOS 系统上可用)将打印一个对此目的而言足够随机的值。

对于本练习,请将其他值(例如证明类型和验证器类型)保留为默认值。

""

图 6. 注册凭据

输入用户名后,单击“注册用户/凭据”。然后,系统将提示您点击 YubiKey 以完成注册过程。

""

图 7. 点击 YubiKey

请注意,此特定应用程序显示两个不同的对话框。其他 WebAuthn 站点仅显示顶部模态对话框;第二个(且公认更漂亮的)对话框似乎是 Duo 网站独有的。

在任何情况下,一旦您点击了 YubiKey,您将立即注册并登录。您将看到类似于图 8 所示的屏幕。

""

图 8. 已注册并已登录

如果您返回主页,您将再次看到登录屏幕。要测试您的 YubiKey 是否正常工作,请输入您的用户名,然后单击“使用凭据登录”。无需密码!

尽管此示例看起来很简单,但它突出了用户使用 YubiKey 注册或身份验证是多么容易。即使底层实现很复杂,用户体验也很流畅和简单。

隐私注意事项

如果实施得当,WebAuthn 和 YubiKey 等兼容令牌可以在提供强大的用户身份验证功能的同时,有力地保护用户隐私。该标准的章节阐述了防止数据关联、去匿名化以及在未经用户同意的情况下使用凭据的方法。

对 WebAuthn 隐私问题的全面检查超出了本文的范围,但该标准的第 14 节标题为“隐私注意事项”。如果您是 IT 审计员、安全管理员、安全工程师或应用程序程序员,第 14 节将对您有用。

密码学弱点

在 2018 年 8 月下旬,Paragon Initiative Enterprises 的安全研究人员对 WebAuthn API 使用某些算法(特别是椭圆曲线直接匿名证明 (ECDAA) 和带有 PKCS1v1.5 填充的 RSA)提出了担忧。《ZDNet》报道了此事,并添加了一些额外的澄清。

对于非密码学家来说,简短版本是,标准中的某些算法代表着潜在的弱点。这些弱点目前在实践中不易被利用,但它们可能会在未来带来问题。研究人员的警告更多地是针对 API 实现者,而不是用户,目的是在 WebAuthn 标准最终确定之前对其进行改进。研究人员自己说

WebAuthn 和 ECDAA 并非注定失败。不要扔掉您的硬件令牌,不要将您的代码库恢复为使用 SMS 或 TOTP,或任何其他此类极端措施。

资源

Todd A. Jacobs 是 Flow Capital Group 的首席执行官,该公司收购和管理专门从事 IT 自动化、DevOps 和敏捷转型、安全和合规性、兼职 CIO/CTO 服务以及网络风险和其他热门技术问题的董事会咨询服务的公司。Todd 一生都在等待 Matt Smith 在《神秘博士》中饰演的角色再次让领结变得酷炫。他与妻子和儿子住在马里兰州巴尔的摩附近,他希望将自己对 Linux 和技术的热爱传递给他们,但也许不会传递他的时尚品味。

加载 Disqus 评论