我身边有一台 Raspberry PI Pico,我正在考虑创建一个设备,当我需要在 Linux 上验证自己的身份时,我只需单击焊接到 Pico 上的按钮,它就会向计算机发送一条消息来验证自己的身份。
该设备将连接到安全的计算机,所以没有问题。
问题是,我该怎么做?我没有 Linux 编程经验,所以不知道有没有现成的服务或库可以实现这个功能。我知道 YubiKey 有带按钮的设备可以实现类似的功能,但我也看到过它们需要网络连接才能工作,这显然不行。
我身边有一台 Raspberry PI Pico,我正在考虑创建一个设备,当我需要在 Linux 上验证自己的身份时,我只需单击焊接到 Pico 上的按钮,它就会向计算机发送一条消息来验证自己的身份。
该设备将连接到安全的计算机,所以没有问题。
问题是,我该怎么做?我没有 Linux 编程经验,所以不知道有没有现成的服务或库可以实现这个功能。我知道 YubiKey 有带按钮的设备可以实现类似的功能,但我也看到过它们需要网络连接才能工作,这显然不行。
不,不需要。这是错的。
据我所知,目前还没有这样的东西,所以你必须自己编写程序。
理论上,您可以使用 HID 小工具驱动程序在 Linux 上实现比 Yubikeys 等安全性低得多的 FIDO 令牌设备 - 甚至有一些为调试目的编写的基本实现,例如由 solokeys 社区编写的 - 但即使让它运行(并且还不能让您登录任何东西)也需要“编程 Linux 系统软件”工具箱中的多种技能。
我说“不太安全”是因为与 RPi 零不同,这些令牌通常具有真正安全的、不可读的内存。
如果不这样做,您可以省去运行存根 FIDO 实现的麻烦,只需编写一个 PAM 模块,打开一个 USB 批量设备,等待特定端点返回表示“用户按下按钮”的数据即可。但这至少需要花费不少编程时间。
所以,恐怕你不会编程,暂时无法创建自己的登录令牌。我强烈建议你投资一个合适的安全令牌——Yubikey、Nitrokey、Solokey、Onleykey,或者它们的竞争对手(谷歌和其他大公司也提供令牌)。它们最终的功能都是一样的,而且与你的树莓派 Zero 解决方案不同,已经有其他人为它们编写了软件。而且:它们实际上能够存储机密信息,你可以用这些信息直接在其他电脑上证明你就是你所声称的那个人,甚至可以解密你的硬盘。
该设备无需互联网连接即可工作。计算机需要互联网连接来验证出厂预设的 OTP,其密钥只有 Yubico 知道。计算机无需互联网连接即可验证自定义编程的 OTP(其密钥只有您知道)、验证自定义编程的静态密码,或使用 Yubikey 的各种非 OTP 功能(FIDO2、PIV、OpenPGP)。
对于 OTP 功能(即触摸按键后会像键盘一样输入一些乱码),所有 Yubikey 都配备了两个 OTP 插槽(短按和长按),其中一个插槽出厂时已预置 Yubico 已知的密钥,另一个插槽则为空。这两个插槽都可以使用 Yubico Authenticator 应用、旧版 Yubikey Manager Qt(ykman-gui)、命令行界面的 yubikey-manager(ykman)或旧版 yubikey-personalization(ykpersonalize)进行重新编程。
每个插槽都可以在 Yubikey 风格的 OTP(使用自定义密钥)或 OATH HOTP 六位令牌(类似 TOTP 双因素身份验证令牌,但不基于时间)或静态密码(Yubikey 输入的任意字符串)之间切换。我不记得有什么软件可以本地验证 YubiOTP 风格的 OTP(Fedora 很久以前曾将其作为 FAS 的一部分实现),但 OATH HOTP 或纯密码在大多数情况下都可以使用。
对于 FIDO2 功能,程序可以请求密钥创建签名(需要触摸确认),然后根据本地存储的公钥进行验证。无需特别要求将签名发送到某个地方,也无需浏览器参与(例如,OpenSSH 既支持使用 FIDO 密钥进行 SSH 身份验证,也支持使用 FIDO 密钥通过 ssh-keygen 对本地数据进行签名)。
对于 PIV 功能,类似地,程序可以请求密钥来创建签名(在较新的型号中——我认为是 Yubikey 5 或更高版本——可以设置为要求某些槽位进行触摸确认),然后根据本地存储的公钥进行验证。可以使用 pam_pkcs11 之类的程序进行集成。
事实证明,我并不是第一个想到使用 Raspberry Pi Pico 作为安全设备的人: