OpenSSH 8.2 增加了对 U2F/FIDO 硬件认证设备的支持。这些设备在现有密钥认证之上提供额外安全层:只有硬件令牌在场,才能完成认证。(support for U2F/FIDO hardware authentication devices)
使用和设置都很简单。唯一额外步骤是生成可配合硬件设备使用的新密钥对。可选择 ecdsa-sk 或 ed25519-sk:前者硬件兼容范围更广,后者可能需要较新的设备。
生成后,可以像其他 OpenSSH 密钥一样使用。唯一要求是使用私钥时,U2F 设备必须连接在本机上。
U2F 示例
例如,插入 U2F 设备,并生成配套密钥对:
ssh-keygen -t ecdsa-sk
Generating public/private ecdsa-sk key pair. You may need to touch your authenticator to authorize key generation. <-- touch device Enter file in which to save the key (/home/ubuntu/.ssh/id_ecdsa_sk): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ubuntu/.ssh/id_ecdsa_sk Your public key has been saved in /home/ubuntu/.ssh/id_ecdsa_sk.pub The key fingerprint is: SHA256:V9PQ1MqaU8FODXdHqDiH9Mxb8XK3o5aVYDQLVl9IFRo ubuntu@focal
接下来,把公钥部分复制到服务器的 ~/.ssh/authorized_keys,便可以连接:
ssh -i .ssh/id_ecdsa_sk ubuntu@focal.server
Confirm user presence for key ECDSA-SK SHA256:V9PQ1MqaU8FODXdHqDiH9Mxb8XK3o5aVYDQLVl9IFRo <-- touch device Welcome to Ubuntu Focal Fossa (GNU/Linux 5.4.0-21-generic x86_64) (...) ubuntu@focal.server:~$
FIDO2 驻留密钥
FIDO2 私钥由两部分组成:磁盘私钥文件中存储的密钥句柄,以及每个 FIDO2 令牌独有、无法从硬件导出的设备密钥。认证时硬件将两者结合,派生真实密钥,用于签名认证挑战。
令牌需要在多台计算机间移动时,每次先移动私钥文件可能很麻烦。较新的 FIDO2 标准因此支持驻留密钥,允许从硬件取回密钥句柄部分。
驻留密钥会提高攻击者使用被盗令牌的可能性。因此,令牌通常要求先通过 PIN 认证才能下载密钥;创建驻留密钥前,应使用硬件令牌管理软件设置 PIN。
OpenSSH 支持在生成密钥时添加 ssh-keygen 的 -O resident 参数:
ssh-keygen -t ecdsa-sk -O resident -O application=ssh:mykeyname
Generating public/private ecdsa-sk key pair. You may need to touch your authenticator to authorize key generation. Enter PIN for authenticator: Enter file in which to save the key (/home/ubuntu/.ssh/id_ecdsa_sk): mytoken Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in mytoken (...)
它像平常一样生成公私钥对,但稍后可以从令牌取回私钥部分,也就是密钥句柄。运行:
ssh-keygen -K
Enter PIN for authenticator: You may need to touch your authenticator to authorize key download. Enter passphrase (empty for no passphrase): Enter same passphrase again: Saved ECDSA-SK key ssh:mytoken to id_ecdsa_sk_rk_mytoken
生成文件名时,会使用先前 application 参数中 ssh: 后面的部分:
l id_ecdsa_sk_rk_mytoken*
-rw------- 1 ubuntu ubuntu 598 out 4 18:49 id_ecdsa_sk_rk_mytoken -rw-r--r-- 1 ubuntu ubuntu 228 out 4 18:49 id_ecdsa_sk_rk_mytoken.pub
如果从硬件提取密钥时设置了口令,之后使用它们时,会要求输入文件口令以及硬件 PIN,并触碰令牌:
ssh -i ./id_ecdsa_sk_rk_mytoken ubuntu@focal.server
Enter passphrase for key './id_ecdsa_sk_rk_mytoken': Confirm user presence for key ECDSA-SK SHA256:t+l26IgTXeURY6e36wtrq7wVYJtDVZrO+iuobs1CvVQ User presence confirmed (...)
也可以把驻留密钥直接下载并加入 ssh-agent,运行:
ssh-add -K
此时不会写入文件,可以通过 ssh-add -L 输出公钥。
提示
若生成时使用 -O verify-required,或 SSH 服务器在 /etc/ssh/sshd_config 中设置 PubkeyAuthOptions verify-required,则在 Ubuntu 22.04 LTS 上不能通过 agent 使用。
延伸阅读
- OpenSSH 8.2 发布说明。(OpenSSH 8.2 release notes)
- Yubikey 关于 OpenSSH FIDO/FIDO2 用法的文档。(Yubikey documentation for OpenSSH FIDO/FIDO2 usage)
来源:使用 U2F/FIDO 实现双因素认证。Canonical Ubuntu Server 文档贡献者。本文保留 OpenSSH 8.2 背景及 Ubuntu 22.04 LTS 的特定限制。 本文依据本批次转载授权译为中文,原始代码与示例输出保留。











暂无评论内容