我删除了所有 SSH 密钥,改用硬件存储
I deleted all my SSH keys
我长期使用 YubiKey 配合 ed25519-sk 密钥,但为了彻底消除硬盘上的未加密密钥材料,我决定删除所有传统 SSH 密钥。本文记录了如何利用 YubiKey、TPM 和 Apple Secure Enclave 等硬件安全模块,将密钥完全锁定在硬件中。虽然使用 Passphrase 加密的磁盘密钥对大多数威胁模型已足够安全,但我更倾向于硬件驻留密钥带来的额外保障。我详细对比了三种方案的实现细节:YubiKey 的无感认证、TPM 的加密解密机制以及 macOS Secure Enclave 的生物识别集成,并探讨了在 LXC 容器或无头模式下使用的注意事项。
使用这种方法生成的密钥,没有任何机制可以泄露或窃取;任何存在于磁盘上的材料,如果没有对应的硬件设备,都是毫无用处的。
HN 评论区
18- stryan
嘿,我也正在做类似的事情,虽然没像楼主(OP)做得那么彻底。我正在逐步弃用旧的 RSA SSH 密钥,转而采用 Yubikey、密码管理器以及替代 SSH 认证方式的组合:
1. 带有触摸功能的 Yubikey 上的 -sk 密钥是我的主密钥,用于签名,并且安装在我接触的每一台主机上。起初我计划使用 Yubikey 的 PIV 插槽来存储 SSH 密钥,而不是内置的 FIDO2 设置,但我非常讨厌管理多个移动部件(比如在所有客户端上运行 pscd)。使用 PIV 插槽的主要好处是可以设置“缓存”触摸策略:Yubikey 会缓存触摸操作长达 15 秒,因此像“在 rebase 期间签署多个提交”这样的操作只需要触摸一次,而不是 num_commits 次。附带的好处是可以跨主用和备用 Yubikey 复用同一个 SSH 密钥。但 FIDO 设置的简单性最终胜出,我决定把“因为要频繁触摸 Yubikey 而感到恼火”视为一个信号,提醒我应该采用某种替代方案,比如专用密钥。最显著的是,我现在已经正确配置了 Ansible,使用作为密钥(secrets)保存的专用部署密钥,而不是复用我的个人密钥。
2. 我使用 1Pass 和 Bitwarden(工作/个人)来存储一个次要 SSH 密钥,该密钥仅用于基本的 Git 认证或其他低风险任务。此 SSH 密钥直接从密码管理器通过 stdin 加载到 ssh-agent 中,因此它从……