1 ポイント 投稿者 GN⁺ 2025-11-24 | 1件のコメント | WhatsAppで共有
  • macOSのTahoeバージョンで、Secure Enclaveを利用したSSHキーの生成と使用機能が標準サポートされた
  • /usr/lib/ssh-keychain.dylib ライブラリが、従来のスマートカード用PKCS11Providerに加えて SecurityKeyProvider インターフェースを実装し、FIDO2デバイスの代わりにSecure Enclaveと直接通信できる
  • sc_auth コマンドで Touch IDベースの生体認証キーを生成し、ssh-keygen または ssh-add を通じて セキュア領域から直接キーを読み込んで使用できる
  • .zprofileSSH_SK_PROVIDER 環境変数を設定すると、SSH、ssh-agent、ssh-keygen のすべてで自動認識される
  • 外部ツールなしで、macOSの標準機能だけで 安全性と利便性を両立したSSH認証構成 を実現できる

Secure EnclaveベースのSSHキーサポート概要

  • macOS Tahoeは Secure EnclaveベースのSSHキー生成と利用 をサポート
    • これまでは secretive のような外部プロジェクトが必要だったが、今はmacOSの標準機能で置き換え可能
  • /usr/lib/ssh-keychain.dylibSecurityKeyProvider を実装し、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件のコメント

 
GN⁺ 2025-11-24
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 と同じ考え方
      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 鍵を設定する方法を 私のブログ にまとめてある

    • Linux でも TPM に ssh-key を保存できるのか気になる
  • なかなか良い機能だ
    私は Secretive を長いこと使ってきたが、物理キーやカードよりずっと便利だった
    SSH 鍵が使われるたびにボタンを押すか指紋認証をしなければならないので、いつ使われているのかが明確に分かる
    ssh-agent トンネルを維持して、リモートサーバー上でも安全に git 署名ができる
    ただ、Tahoe バージョンはバグが多く、よく固まる。デバッグする余裕がないので放置している
    スマートカードベースの SSH UX には以前苦労した記憶があるが、安定しているなら試す価値はある

    • 私も Secretive は好きだが、ssh-agent の確認機能は OpenSSH でもかなり前からサポートされている
      ssh-askpass を通じて、各秘密鍵の使用時に確認できる。ただしローカルかリモートかの区別はできない
  • この方式は NSA がバックドアを仕込んだ疑いがあるカーブを使うので注意が必要だ

  • Secure Enclave 内に保存するのに、なぜ秘密鍵ファイルが必要なのか気になる

    • OpenSSH の sk 実装も同じだ。「resident key」オプションがあっても 秘密鍵ファイルが必要
      これは単に FIDO 資格情報への参照であり、実際の秘密鍵データは含まれていない
      非 resident の sk 鍵では、ハードウェア認証器が状態を保存しないためファイルが必要になる
      macOS の実装が状態保存型なのか非保存型なのかははっきりしない。OS の再インストールで壊れる可能性もある
  • facebookincubator/sks というプロジェクトがある
    さまざまなハードウェアベースの SSH 鍵を抽象化する golang ライブラリで、Linux、Windows、macOS をサポートしている

    • ただし golang ライブラリだけでは ssh-agent は動作しない
      そのため私は以前、ssh-tpm-agent を自作し始めた
  • iPhone でも同じ秘密鍵でメールやファイルに署名したい
    iCloud がそれを処理してくれるのだろうか

    • こうした鍵は iCloud には 同期されない
      その代わり Passkey は同期される。Passkey API と通信する SecurityKeyProvider を新たに作る必要がある
      Passkey は特定のアプリのバンドル ID やドメインにひも付けられている
      たとえば Secretive が Passkey をサポートしたとしても、その鍵ペアは他のアプリでは使えないが、
      同じアプリを使う複数デバイス間では同期される
  • KeyMux に新機能を追加する時が来たようだ
    このツールは SSH、SSL、PGP 向けの enclave 鍵をサポートしており、
    たとえば Secure Enclave ベースの SSL 証明書で Vault サーバーに接続し、エクスポート不可の Vault 秘密鍵で SSH 認証を行える
    keymux.comApp Store リンク で確認できる