- macOSのTahoeバージョンで、Secure Enclaveを利用したSSHキーの生成と使用機能が標準サポートされた
/usr/lib/ssh-keychain.dylib ライブラリが、従来のスマートカード用PKCS11Providerに加えて SecurityKeyProvider インターフェースを実装し、FIDO2デバイスの代わりにSecure Enclaveと直接通信できる
sc_auth コマンドで Touch IDベースの生体認証キーを生成し、ssh-keygen または ssh-add を通じて セキュア領域から直接キーを読み込んで使用できる
.zprofile に SSH_SK_PROVIDER 環境変数を設定すると、SSH、ssh-agent、ssh-keygen のすべてで自動認識される
- 外部ツールなしで、macOSの標準機能だけで 安全性と利便性を両立したSSH認証構成 を実現できる
Secure EnclaveベースのSSHキーサポート概要
- macOS Tahoeは Secure EnclaveベースのSSHキー生成と利用 をサポート
- これまでは
secretive のような外部プロジェクトが必要だったが、今はmacOSの標準機能で置き換え可能
/usr/lib/ssh-keychain.dylib が SecurityKeyProvider を実装し、FIDO2デバイスと似た方式でSecure Enclaveへアクセスできる
- この機能により、YubiKeyなどの外部ハードウェアなしで macOS内蔵のセキュリティチップによるSSH認証を実行できる
キー生成と管理
sc_auth create-ctk-identity -l ssh -k p-256-ne -t bio コマンドで、Touch ID認証が必要なSecure Enclaveキーを生成
list-ctk-identities コマンドで、生成されたキーの一覧とハッシュを確認できる
delete-ctk-identity コマンドでキーを削除できる
list-ctk-identities -t ssh オプションで SSHキーのフィンガープリント を確認できる
SSHでの利用
ssh-keygen -w /usr/lib/ssh-keychain.dylib -K -N "" コマンドで Secure Enclaveから鍵ペアを読み込む
- PIN入力は不要で、Touch IDで認証する
- 生成された “private key” は実際の秘密鍵ではなく、FIDO資格情報への参照値
ssh-copy-id で公開鍵をサーバーにコピーした後、
ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib localhost コマンドで接続できる
ssh-agent連携
ssh-add -K -S /usr/lib/ssh-keychain.dylib コマンドで Secure Enclaveキーをssh-agentに直接登録 できる
- 登録済みのキーは
ssh-add -L で確認
- その後
ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib コマンドで認証を行う
デフォルトのSecurityKeyProvider設定
.ssh/config に直接指定するか、.zprofile に
export SSH_SK_PROVIDER=/usr/lib/ssh-keychain.dylib を追加すると自動認識される
- 以後は単に
ssh-add -K または ssh my-server コマンドで セキュリティキー対応のSSH接続 が可能
エクスポート可能なキー (Exportable Keys)
sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio コマンドで Secure Enclaveで暗号化されたエクスポート用キー を生成できる
export-ctk-identity でPEMファイルとしてエクスポートし、
import-ctk-identities で別のデバイスに再登録できる
- この方式は 安全性はやや低いが、バックアップには有利
開発者の議論とコード拡張
- コメントでは
.biometryCurrentSet フラグを使えるかどうかが議論されている
- 現状では 「生体認証を使うかどうか(on/off)」のみをサポート し、細かな制御はできない
- 作者は
ssh-keychain.dylib を リバースエンジニアリング して、sk_enroll() 関数に biometryCurrentSet機能を追加できる可能性 を検討している
- 提案されたコード例は、Apple Developer Programアカウントでコード署名 (
codesign) しないとSecure Enclaveへアクセスできない
- コードには キー生成、署名、登録 (
sk_enroll, sk_sign など) のロジックが含まれており、
ECDSA P-256キー をSecure Enclaveで生成して署名する過程が実装されている
まとめ
- macOSは今や Secure Enclaveを直接活用するSSH認証 をネイティブサポートしている
- Touch IDベースの生体認証とFIDO2互換の構成により、安全性と利便性が向上
- 外部ハードウェアや追加ソフトウェアなしで、システム内蔵機能だけでSSHキーを管理可能
- 開発者たちは
ssh-keychain.dylib を拡張し、より細かな生体認証制御 を試している
1件のコメント
Hacker Newsのコメント
私の理解が正しければ、これは 秘密鍵をバックアップできないという意味
Secure Enclave 内に保存されるので、ノートPCを失えば鍵も一緒に失われる
エクスポートできるのは公開鍵だけのようだ。もちろん別のアプローチや管理者リセットは可能かもしれないが、それでも少し不安が残る
後で OP が返信を付けて、Web ページを更新するとのこと
man sc_authを参照すればよい。Secure Enclave で直接生成する代わりに、暗号化されたエクスポート用キーを作成できる例として
sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bioなどを実行し、その後export-ctk-identityで.pemファイルを作成できる別のデバイスでは
import-ctk-identitiesで再インポートできる。この内容をガイドに追加する予定だPKI の核心は公開鍵だけを移動し、秘密鍵は一か所にのみ存在すべきだという点にある
そうすれば、いかなる場合でも鍵が漏えいしない
YubiKey で生成された秘密鍵もバックアップできない
デバイスを紛失したり盗難に遭ったりしても問題ないよう、デバイスごとに 1 つずつ持つのが理想的だ
私は PIN で保護された YubiKey を金庫に保管している。もしノートPC、スマホ、普段使いの YubiKey がすべて失われても備えになる
さらに進めると ECDSA ベースの GPG 署名も可能だ
ただしバグのため、パッチ済みの GPG と SSH agent が必要になる
macOS 向けには UI 付きのパッケージ版があり(KeetaNetwork/agent)、
同じバックエンドが Linux でも PKCS#11 経由の TPM として動作する
GPG と SSH の違いは鍵と署名を包む方法だけで、根本的にはどちらも ECDSA だ
Secretive のほうが設定は簡単だが、この方式に切り替えて アプリを 1 つ減らすつもり
Windows 11 で TPM ベースの SSH 鍵を設定する方法を 私のブログ にまとめてある
なかなか良い機能だ
私は Secretive を長いこと使ってきたが、物理キーやカードよりずっと便利だった
SSH 鍵が使われるたびにボタンを押すか指紋認証をしなければならないので、いつ使われているのかが明確に分かる
ssh-agent トンネルを維持して、リモートサーバー上でも安全に git 署名ができる
ただ、Tahoe バージョンはバグが多く、よく固まる。デバッグする余裕がないので放置している
スマートカードベースの SSH UX には以前苦労した記憶があるが、安定しているなら試す価値はある
ssh-askpassを通じて、各秘密鍵の使用時に確認できる。ただしローカルかリモートかの区別はできないこの方式は NSA がバックドアを仕込んだ疑いがあるカーブを使うので注意が必要だ
Secure Enclave 内に保存するのに、なぜ秘密鍵ファイルが必要なのか気になる
sk実装も同じだ。「resident key」オプションがあっても 秘密鍵ファイルが必要これは単に FIDO 資格情報への参照であり、実際の秘密鍵データは含まれていない
非 resident の
sk鍵では、ハードウェア認証器が状態を保存しないためファイルが必要になるmacOS の実装が状態保存型なのか非保存型なのかははっきりしない。OS の再インストールで壊れる可能性もある
facebookincubator/sks というプロジェクトがある
さまざまなハードウェアベースの SSH 鍵を抽象化する golang ライブラリで、Linux、Windows、macOS をサポートしている
そのため私は以前、ssh-tpm-agent を自作し始めた
iPhone でも同じ秘密鍵でメールやファイルに署名したい
iCloud がそれを処理してくれるのだろうか
その代わり Passkey は同期される。Passkey API と通信する SecurityKeyProvider を新たに作る必要がある
Passkey は特定のアプリのバンドル ID やドメインにひも付けられている
たとえば Secretive が Passkey をサポートしたとしても、その鍵ペアは他のアプリでは使えないが、
同じアプリを使う複数デバイス間では同期される
KeyMux に新機能を追加する時が来たようだ
このツールは SSH、SSL、PGP 向けの enclave 鍵をサポートしており、
たとえば Secure Enclave ベースの SSL 証明書で Vault サーバーに接続し、エクスポート不可の Vault 秘密鍵で SSH 認証を行える
keymux.com と App Store リンク で確認できる