关注了就能看到更多这么棒的文章哦~
Passwordless authentication with FIDO2—beyond just the web
February 21, 2023
This article was contributed by Koen Vervloesem
FOSDEM
ChatGPT assisted translation
https://lwn.net/Articles/923656/
FIDO2 是一种无需密码就可以对用户进行认证的标准。虽然该技术主要用于保护网站上的账户,但它也适用于其他用途,例如登录 Linux 系统。同样的技术甚至可以用于身份验证以外的领域,例如对文件或者 Git commit 进行签名。布鲁塞尔 2023 年自由和开源软件开发者欧洲会议(FOSDEM)上的几次演讲就介绍了 Linux 用户的可能用法。
FIDO2 标准是 FIDO 联盟(FIDO 代表 Fast Identity Online)和万维网联盟(W3C, World Wide Web Consortium)之间的合作成果,旨在开发强认证(strong authentication)的标准。用户可以使用 FIDO2 安全密钥(硬件令牌)安全地进行身份验证,这比传统的基于密码的身份验证更方便、更快速、更安全。安全密钥可以要求用户触摸按钮或输入 PIN 进行身份验证;也可以使用指纹读取器或其他生物识别身份验证手段。FIDO2 可以作为传统密码的额外验证选项,作为多重身份验证的一部分,也可以作为唯一的身份验证手段。在后一种情况下,这被称为无需密码的身份验证(passwordless authentication)。请注意,先前的 FIDO 标准 FIDO U2F 主要是为两步(two-factor)验证而设计的。
FIDO2 标准由两部分组成。Web 身份验证(WebAuthn)是一项 W3C 建议,在众多浏览器中都有支持,描述了允许网站在其登录页面中添加 FIDO2 身份验证的 API。FIDO 的客户端到认证器协议(CTAP, Client to Authenticator Protocol)通过启用外部认证器(如安全密钥或手机)来配合浏览器一起使用,这是对 WebAuthn 的补充。简而言之:浏览器向服务器发出 WebAuthn 请求,向认证器设备发送 CTAP 请求。
这两个标准都是开放的标准,任何人都可以制造 FIDO2 安全密钥。各种制造商已经建造了这样的硬件令牌(token)。Yubico 有一些支持 FIDO2 的 YubiKey 产品,以及专用的 FIDO2 安全密钥。Feitian、Nitrokey、SoloKeys 和 OnlyKey 也提供 FIDO2 令牌。
How FIDO2 works
FIDO2 是一种使用非对称加密的挑战-响应(challenge-response)身份验证系统。当用户在网站上注册时,WebAuthn 和 CTAP 配合来让认证器(通常是安全密钥)创建一对新的密钥。这只有在用户证明他拥有认证器的情况下才会完成,例如通过在设备上按下一个按钮、扫描指纹或输入 PIN 码。私钥永远不会离开设备本身,而公钥会被发送到网站,并与用户在该网站的账户关联起来。
在登录网站时,该网站会使用 WebAuthn API 向 Web 浏览器发送 challenge 及其来源(例如其域名)。然后,Web 浏览器使用 CTAP 将 challenge 发送到认证器。用户要再次证明一下他拥有认证器,并且设备使用其私钥对这个 challenge 进行签名生成 response。这个 response 会被返回到 Web 浏览器(使用 CTAP),然后返回到网站(使用 WebAuthn)。网站会用之前注册账户的公钥来验证 response 与原始 challenge 是否相符。
FIDO2 令牌可以存储多个凭据(credentials),每个凭据由凭据 ID、私钥、用户 ID 和对应于网站域名的依赖方 ID 组成。网站存储了同样的用户 ID 和凭据 ID,以及公钥。FIDO2 的工作方式可以保护用户免受网络钓鱼攻击。Web 浏览器只接受来自网站域名允许的依赖方 ID 的 WebAuthn 调用,且只允许 HTTPS 连接。因此,当认证器对 challenge 进行签名时,浏览器已知它是在与正确的网站交流,因为它已经使用了该网站的 TLS 证书进行验证。因此,用户不必手动检查域名。
Using FIDO2 beyond the web
大多数有关 FIDO2 的文档都是关于其在网站上的使用场景的,看起来好像是唯一可能的用途一样。例如,Duo Security 制作的非官方但有帮助的 WebAuthn 指南就是一个例子。但是,其实这个规范是可以在 Web 之外场景使用的。这是 Yubico 的开发者倡导者 Joost van Dijk 在一次演讲中的主题。
Yubico 开发了 libfido2,这是一个用于与 FIDO 设备(不仅仅是 Yubico 制造的设备)进行 USB 或 NFC 通信的 C 库以及相应的命令行工具。它支持 FIDO U2F 和 FIDO2 协议。该项目采用 BSD 2-clause 许可证,并支持 Linux、macOS、Windows、OpenBSD 和 FreeBSD。有一些外部项目基于 libfido2 创建了.NET、Go、Perl 和 Rust 的 binding 版本。Yubico 还维护了一个 Python 库 python-fido2,可在 Linux、macOS 和 Windows 上进行测试。
使用 libfido2 的项目之一就是 pam-u2f,也由 Yubico 开发,并包含在许多 Linux 发行版的软件库中。它将 FIDO2 安全密钥集成到可插拔认证模块(PAM, Pluggable Authentication Modules)中,PAM 是 Linux 系统的一个灵活且可扩展的认证框架,允许使用很多种认证方法。针对某个特定目的在 FIDO2 设备上来请求凭据很简单,直接注册一个新凭据,将其保存在配置文件中,然后在 PAM 配置中添加对 pam_u2f.so 的引用,来指向保存凭据的文件。例如,Van Dijk 就展示了如何使用 FIDO2 令牌作为第二认证步骤来给 sudo 启用双因素认证。pam-u2f 文档中还列出了一些其他示例。
New types of SSH keys
Van Dijk 描述的另一个用例是由 FIDO2 验证器支持的 SSH 密钥。OpenSSH 8.2(于 2020 年 2 月发布)引入了对 FIDO2 安全密钥的支持,底层使用 libfido2 库。challenge-response 的工作方式与 Web 上的工作方式类似,但这次认证器使用 CTAP 与 ssh 客户端通信,ssh 客户端使用普通的 SSH 协议与 sshd 服务器通信。
为了能让这一切正常工作,OpenSSH 引入了新的公钥类型“ecdsa-sk”和“ed25519-sk”,以及相应的证书类型。如果用户使用 ssh-keygen 生成其中一种类型的新 SSH 密钥对,则私钥与依赖方 ID“ssh:”以及可选的密钥句柄一起被生成并存储在硬件令牌内。认证器将公钥和密钥句柄返回给 ssh-keygen。程序像往常一样将公钥保存在文件中,而通常存储私钥的文件现在就包含了密钥句柄。
使用这种类型的密钥来向 SSH 服务器进行身份验证,就需要 challenge-response 机制。SSH 服务器向客户端发送一个 challenge,客户端将其发送到 FIDO2 认证器。后者使用私钥签署服务器的 challenge 以创建数字签名,该数字签名发送到客户端,然后发送到服务器。SSH 服务器能够通过已知与 FIDO2 认证器关联的公钥验证此签名。在此过程中,私钥从未离开认证器,即使 SSH 客户端也无法访问它。只要在使用密钥时附加硬件令牌,硬件支持的 SSH 密钥就可以像 OpenSSH 支持的任何其他密钥类型一样使用。
Van Dijk 展示了使用硬件支持的 SSH 密钥可以实现的一些示例:在通过 SSH 克隆 Git 存储库时进行 GitHub 身份验证,签署 Git 提交和标签并验证其签名,以及签署和验证文件。
Unlocking LUKS2 volumes with a hardware token
CTAP 还提供了 hmac-secret 扩展,大多数 FIDO2 令牌都支持此扩展。这用于从认证器中检索密钥以加密或解密数据。用来阻止 offline 攻击,密钥的一部分(salt)是由客户端保存,而另一部分存储在认证器中。客户端将其 salt 交给认证器,认证器使用基于哈希的消息认证(hash-based message authentication)HMAC-SHA-256 将其自己的密钥部分与 salt 组合,然后返回最终密钥。Van Dijk 展示了如何使用此密钥来加密数据,之后就可以安全地删除该密钥了。要在以后解密数据的话,客户端将 salt 交还给认证器,后者从 salt 和自己的密钥部分来重新生成密钥。
Van Dijk 演示了 hmac-secret 扩展的一个应用,用于 Linux 统一密钥设置(LUKS, Linux Unified Key Setup)磁盘加密。Systemd 248 引入了对使用 FIDO2 安全密钥来解锁 LUKS2 存储卷的支持。在将 FIDO2 认证器注册到 LUKS2 加密卷后,systemd-cryptsetup 组件会在启动时等待插入 FIDO2 令牌,将其提供的 salt 传递给它,获取密钥并使用密钥解锁存储卷。
FIDO2 security keys instead of smart cards
看了 FIDO2 安全密钥具有的所有这些功能之后,人们不禁要问,传统智能卡或实现 OpenPGP 的硬件密钥是否就已经足够了。长期以来,这些技术已被用于离线存储用于加密、认证、签名和验证的私钥。Van Dijk 认为,FIDO2 安全密钥的最大优势是它们更便宜、对用户更加友好。
在许多领域中,开源支持也得到了很大改善。例如,在 FOSDEM 上,Red Hat 的 Alexander Bokovoy 就他在 FreeIPA 中集成 FIDO2 以进行中央管理用户的无密码身份验证(passwordless authentication for centrally managed users)方面的工作做了两次演讲。其中其实也使用了 libfido2 库。他的同事 Iker Pedrosa 在他的博客上提供了一些说明。
随着微软、苹果和谷歌在过去几年中加入 FIDO2 阵营,无疑会有越来越多价格合理的 FIDO2 设备面世。随着软件支持的不断改善,用户很快就会开始用便宜的 FIDO2 安全密钥来替换密码了。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~