macOS 上用触控 ID 安全登录 SSH

需求

  1. 使用文件存 SSH 私钥,其实安全性挺堪忧的:如果私钥没有密码,任何程序都可以直接读取,被流氓软件偷偷上传怎么办?为了安全,给私钥加密,这就要输入密码,麻烦。而且输入密码时,又可能被偷。

  2. 有没有一种木马专门针对 ssh-agent 呢?您把密钥的密码交给 ssh-agent​,真放心吗?

  3. 稣特地买了一台 MBA 13 M1 乞丐版装 Asahi Linux,结果触控板在 Linux 下表现不如 macOS 下好用,Touch ID 还不能用,又回 macOS 了。既然回 macOS,就需要开发 Touch ID 更多功能,不然怎么对得起吃灰的 Asahi Linux?

总之,稣需要一种更安全的 SSH 登录方式,那就是——用 Touch ID 登录。

原理

安全隔区(Secure Enclave)是集成到 Apple 片上系统 (SoC) 的专用安全子系统。安全隔区独立于主处理器,因此私钥不会被操作系统(OS)读取。验证时,是安全芯片参与运算,全程私钥都不会交给 OS。

简单来说,它更像一台微型服务器,有自主的算力,而不是一个静态文件,不会被不良应用程序偷走。

实现

使用开源软件 sekey,替换默认的 ssh-agent。

它的详细介绍请参考其 GitHub 仓库

1. 安装 sekey

1
brew install sekey

安装后,可用以下命令检查 sekey 是否在运行:

1
ls ~/.sekey/ssh-agent.ssh

2. 创建基于 Secure Enclave 的密钥对

创建一个名为 SSH 的密钥对:

1
sekey -c SSH

sekey -l 查看其 ID,然后用 sekey -e <ID> 查看公钥。这个公钥是 ecdsa-sha2-nistp256 格式的,把公钥配置到 SSH 服务器即可。

3. 配置 ssh 使用 sekey

1
vim ~/.ssh/config

添加以下一行:

1
IdentityAgent ~/.sekey/ssh-agent.ssh

疑难杂症

当服务器为 OpenWRT 系统时,有可能无法正常工作。因为 OpenWRT 默认的 SSH 服务端是 dropbear,它不支持 ecdsa-sha2-nistp256。装个 OpenSSH 即可:

1
2
opkg update
opkg install openssh-server

最后提醒:业界对 ecdsa-sha2-nistp256 有一些质疑的声音,它的安全性应该不如 ed25519。