複製不可能なSSH鍵運用のススメ

2K Views

March 27, 26

スライド概要

2026/03/27に行われたTerminal Night #2の発表資料です。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

複製不可能なSSH鍵運用のススメ Terminal Night #2 matsuu

2.

アジェンダ 1. 自己紹介 2. 背景と課題 3. 複製不可能な鍵運用とは 4. 代表的な方式と選び方 5. 導入デモ手順 6. まとめ 2 / 51

3.

自己紹介 • • • • • • matsuuです ◦ X @matsuu ◦ Bluesky @matsuu.bsky.social ◦ Mastodon @[email protected] ◦ mixi2 @tmatsuu ◦ はてな @tmatsuu 主に技術ネタをはてブ→SNSに共有する驚き屋 好きなTerminal ◦ Ghostty ◦ Windows Terminal ◦ foot Terminalは白地に黒文字派。ThemeはDimidium推し 気になっているCLI/TUIツール ◦ SecretSpec https://secretspec.dev/ ◦ Gonzo https://github.com/control-theory/gonzo ◦ DuckDB https://duckdb.org/ ◦ TUIOS https://github.com/Gaurav-Gosain/tuios このプレゼンはMacbookNeo+Kitty+presentermで構成されています 3 / 51

4.

背景: いま起きていること • • SSHを使うシーンが増えている(かも) ◦ CLI/TUIベースの生成AIサービスの利用 ◦ GitHub/GitLab/PaaSへのアクセス ◦ クラウドVM、コンテナホスト、検証環境への日常的な接続 開発スタイルが分散し、接続元が多様化している ◦ ノートPC、スマートフォン、タブレット、リモート端末からの作業 4 / 51

5.

課題: 従来運用の典型的なリスク • • • • ~/.ssh/id_rsa や ~/.ssh/id_ed25519 などに秘密鍵が保存されている ◦ 総当たりやキーロガー、復号後のメモリ窃取は防げない ◦ 利便性優先で空パスフレーズ運用になることも? パスワードマネージャに保存している場合も、Vault自体の漏えいや乗っ取りのリスクがある ◦ 秘密鍵がエクスポート可能な状況だと複製リスクは残る バックアップや同期が裏目に出ることがある ◦ Time Machine、クラウド同期、ホームディレクトリ移行などで複製される ◦ 「消したつもりでも別の場所に残る」が起こりやすい ソフトウェア実装の鍵は漏えい検知が難しい ◦ ブラウザ拡張、サプライチェーン攻撃、情報窃取マルウェア(Infostealer)など侵入経路が多い ◦ いったん端末が侵害されると、ローカル保存された秘密鍵は狙われやすい 5 / 51

6.

端末は侵害される前提で考える時代 6 / 51

7.

複製不可能な運用とは • • • • • 秘密鍵をプラットフォームの鍵保護機構内で生成し、外部エクスポート不可で運用 ◦ 生成時からエクスポート不可属性を持たせる ◦ OSやアプリが秘密鍵のバイト列を直接読み取ることができない 外部に出るのは基本的に「公開鍵」と「署名結果」だけ ◦ クライアントは公開鍵をサーバーに登録する ◦ 認証時はチャレンジに対する署名結果のみを返す 署名実行には追加条件を課せる ◦ PIN入力、生体認証、デバイスへのタッチ、端末のロック解除状態など ◦ これにより「鍵がある」だけでなく「利用者の関与」を要求できる 端末侵害時でも被害を限定しやすい ◦ 秘密鍵ファイルそのものを窃取されない ◦ バックアップ/同期経由での複製拡散を抑止しやすい 「物理ハードウェアに紐づけられたSSH鍵」と考えるとわかりやすい 7 / 51

8.

主な方式の紹介 格納先 │ 製品例 │ 対応クライアント例 ─────────────────┼─────────────────────────────┼──────────────────────────────── ───── Secure Enclave │ macOS, iPhone, iPad │ Secretive, Blink, Termius FIDOデバイス │ YubiKeyなど putty-cac Android Keystore │ Android端末 │ libfido2+openssh, Termius, │ Termius TPM 2.0 │ クライアントPC, サーバ など │ ssh-tpm-agent, tpm2-pkcs11, Termius PIV │ YubiKey, SmartCardなど • • • • │ openssh Secure Enclave: https://support.apple.com/ja-jp/guide/security/sec59b0b31ff/web FIDOデバイス: https://fidoalliance.org/specifications-overview/?lang=ja Android Keystore: https://developer.android.com/privacy-and-security/keystore?hl=ja TPM 2.0: 8 / 51

9.

Secretiveの紹介 9 / 51

10.

Secretiveの紹介 • • • • • • https://secretive.dev/ Secure Enclave内でSSH秘密鍵を生成できるmacOS用アプリ Secretiveのエージェントがバックグラウンドで稼働、アプリと橋渡し 扱える鍵の種類は ecdsa-256 / mldsa-65 / mldsa-87 SSH Agent Forwardingにも対応している オープンソース実装 https://github.com/maxgoedjen/secretive RSAやED25519には対応していません。 10 / 51

11.

mldsa-65, mldsa-87 について • • • ML-DSAと呼ばれる耐量子暗号アルゴリズム サポートしているSSH実装はおそらくほぼ存在しない OpenSSHも公式には未サポート(2026年3月時点) ◦ Open Quantum Safe プロジェクトが提供するフォーク実装はある ◦ https://github.com/open-quantum-safe/openssh 11 / 51

12.

Secretiveセットアップ ▓▓▓ homebrewを使ってインストールする場合 brew install secretive ▓▓▓ SSH設定 ~/.ssh/config に以下を追記 Host * IdentityAgent /Users/YOURNAME/Library/Containers/com.maxgoedjen.Secretive.Se cretAgent/Data/socket.ssh もしくは ~/.zshrc に以下を追記 12 / 51 export

13.

Secretive メイン 13 / 51

14.

Secretive SSH鍵生成/接続時 14 / 51

15.

FIDOデバイス(FIDO/U2Fセキュリティキー) 15 / 51

16.

FIDOデバイス(FIDO/U2Fセキュリティキー) • • • • • OpenSSH 8.2 で、FIDO/U2F セキュリティキーを使う -sk 鍵種(ecdsa-sk / ed25519-sk)が追加された FIDOデバイス固有の秘密鍵と鍵ハンドル (Key Handle) を組み合わせて個別の秘密鍵を導出 id_ecdsa_sk / id_ed25519_sk が生成されるが、従来の秘密鍵ファイルとは役割が異なる ◦ 実体は「FIDOデバイス内の鍵を参照するためのハンドル情報」であり、秘密鍵そのものは含まれない ◦ 端末侵害時にこれらのファイルを盗まれても、認証器本体とPIN/タッチ確認がなければ悪用できない この仕組みは「複製されにくい運用」と「利用時の本人関与(タッチ/PIN)」を同時に実現できる 鍵ハンドルを導出できる resident 機能というものがある ◦ resident を有効にすると鍵ハンドルを導出するためのcredentials情報をFIDOデバイスに格納することが可能 ◦ resident 有効時の鍵ハンドル生成はPIN入力が必須 16 / 51

17.

OpenSSH+FIDOの鍵生成フロー 17 / 51

18.

OpenSSH+FIDOの鍵生成フロー(residentの場合) 18 / 51

19.

鍵作成手順 FIDOデバイスを接続した状態で以下を実行する ssh-keygen -t <ed25519-sk|ecdsa-sk> [-O verify-required] [-O resident] -C "my-fido-key" # 生成物の例 # ~/.ssh/id_ed25519_sk # ~/.ssh/id_ed25519_sk.pub • • • • (鍵ハンドル) (公開鍵) -t ed25519-sk: [email protected] の鍵を生成 -t ecdsa-sk: [email protected] の鍵を生成 -O verify-required: PIN/生体確認を要求 -O resident: FIDOデバイス側にcredentials情報を保持 19 / 51

20.

よくあるつまずき • • • • • ecdsa-sk / ed25519-sk 鍵が使えるのはOpenSSH 8.2以降 macOS標準のopensshはFIDOに対応していない(2026年3月時点) ◦ Homebrewなどで別途opensshのインストールが必要 FIDOデバイスによってサポート範囲にばらつきがある ◦ ecdsa-sk は対応しているが ed25519-sk には対応していないなど FIDOデバイスを紛失すると復旧できない 鍵ハンドルを紛失すると復旧できない(residentであれば導出可能) 20 / 51

21.

SSHクライアントのFIDO対応状況 クライアント │ FIDO対応 │ 備考 ──────────────────────┼──────────┼────────────────────────────────────────────── ───────── OpenSSH 8.2以降 │ ✅ │ sk-ssh鍵をネイティブサポート macOS標準 OpenSSH │ ⚠ │ Homebrew等でopensshの別途インストールが必要 Win32-OpenSSH │ ✅ │ V8.9.0.0からサポート PuTTY │ ⚠ │ 代替として PuTTY CAC が利用可能 WSL2 │ ⚠ │ usbipd-winかWindows側SSHエージェントへのブリッジが必要 Termius (Android/iOS) │ ✅ │ FIDO/Android Keystore/Secure Enclaveに対応 TeraTerm • • │ ❌ │ issueは立っている PuTTY CAC: https://github.com/NoMoreFood/putty-cac Termius: https://termius.com/ 21 / 51

22.

Win32-OpenSSHとPuTTY CACの補足 • • Win32-OpenSSHとPuTTY CACの保存先はFIDOデバイス(セキュリティキー)だけではない WebAuthn API経由でパスキーの扱いになり、以下の中から選べる ◦ このWindowsデバイス(おそらくTPM2.0) ◦ iPhone、iPad、または Android デバイス ◦ セキュリティキー 22 / 51

23.

FAQ 23 / 51

24.

Q: どれを採用するとよさそう? 24 / 51

25.

Q: どれを採用するとよさそう? ▓▓▓ macOS • • Secretive(Secure Enclave) OpenSSH(homebrew) + FIDOセキュリティキー ▓▓▓ Linux • • OpenSSH + FIDO セキュリティキー 今回紹介しなかったが TPM2.0 も選択肢としてあり ▓▓▓ Windows • • Win32-OpenSSH + FIDOデバイス PuTTY CAC + FIDOデバイス 再掲: WindowsにおいてはFIDOデバイスとしてセキュリティキーだけでなくWindows自身やAndroid/iOS端末も利用可能 25 / 51

26.

Q: スマートフォンの対応状況 26 / 51

27.

Q: スマートフォンの対応状況 ▓▓▓ Android向け • Termius (Android Keystore, FIDOデバイスに対応) ▓▓▓ iOS向け • • • Blink (Secure Enclaveに対応) Termius (FIDOデバイス, Secure Enclaveに対応) Secure Terminal (Secure Enclaveに対応) 27 / 51

28.

Q: おすすめのFIDOデバイスは? 28 / 51

29.

Q: おすすめのFIDOデバイスは? • • • • • Yubico社のSecurity Keyシリーズ ◦ FIDO対応で安価 ◦ 公式サイトで$29+送料 ◦ 国内正規代理店(softgiken)で6,600円+送料 ◦ Amazonでも販売あり Yubico社のYubikey 5シリーズ ◦ FIDOだけでなくSmartCard, OTP, OpenPGP3 などマルチプロトコル対応 Google Titan Security Keyは制約あり ◦ ecdsa-sk は対応 ◦ resident と ed25519-sk に対応していない GoTrustID Idem Keyは制約あり ◦ ecdsa-sk は対応 ◦ resident と ed25519-sk に対応していない Yubico社製品の中古の購入はオススメしない ◦ 古いFirmwareだと対応していない可能性がある ◦ ecdsa-sk はFIDO2サポートを謳うYubikeyであれば対応 ◦ verify-required と resident は firmware 5.1.2以降で対応 ◦ ed25519-sk は firmware 5.2.3以降で対応 29 / 51

30.

Q: 生成できるSSH公開鍵形式 30 / 51

31.

Q: 生成できるSSH公開鍵形式 格納先 │ RSA │ ED25519 │ ECDSA │ ED25519-SK │ ECDSA-SK │ ML-DSA ─────────────────┼─────┼─────────┼───────┼────────────┼──────────┼─────── Secure Enclave │ ❌ │ ❌ │ ✅ │ ❌ │ ❌ │ ✅ FIDOデバイス │ ❌ │ ❌ │ ❌ │ ⚠ │ ⚠ │ ❌ Android Keystore │ ❌ │ ❌ │ ✅ │ ❌ │ ❌ │ ❌ TPM 2.0 │ ✅ │ ❌ │ ✅ │ ❌ │ ❌ │ ❌ PIV │ ✅ │ ❌ │ ✅ │ ❌ │ ❌ │ ❌ • FIDOデバイス: デバイスによってはサポートしていない場合がある 31 / 51

32.

Q: 主要サービスのSSH公開鍵形式サポート状況 32 / 51

33.

Q: 主要サービスのSSH公開鍵形式サポート状況 サービス │ RSA │ ED25519 │ ECDSA │ ED25519-SK │ ECDSA-SK │ ML-DSA ────────────────┼─────┼─────────┼───────┼────────────┼──────────┼─────── GitHub │ ✅ │ ✅ │ ✅ │ ✅ │ ✅ │ ❌ GitLab │ ✅ │ ✅ │ ✅ │ ✅ │ ✅ │ ❌ AWS │ ✅ │ ✅ │ ⚠ │ ❌ │ ❌ │ ❌ Google Cloud │ ⚠ │ ⚠ │ ⚠ │ ⚠ │ ⚠ │ ⚠ Microsoft Azure │ ✅ │ ✅ │ ❌ │ ❌ │ ❌ │ ❌ OpenSSH │ ✅ │ ✅ │ ✅ │ ✅ │ ✅ │ ❌ • • AWS: EC2 KeypairはECDSA未対応、AWS Transfer FamilyはECDSA対応 Google Cloud: SSH公開鍵のフォーマットを厳密に検証していない模様。架空の形式でもUI上は受け付ける場合がある 33 / 51

34.

Q: 秘密鍵は取り出せるのか? 34 / 51

35.

Q: 秘密鍵は取り出せるのか? • 取り出せません ◦ 取り出せるのであればそれは異なる仕組みになっている ◦ 実装によっては、意図的にエクスポート可能な鍵を生成するモードもあるため注意が必要 ▪ Android KeystoreやTPM 2.0など 35 / 51

36.

Q: バックアップは可能か? 36 / 51

37.

Q: バックアップは可能か? • • 取り出せない=バックアップ不可能 予備デバイスなどで冗長性を担保する 37 / 51

38.

Q: OSをアップグレードしても使えるのか? 38 / 51

39.

Q: OSをアップグレードしても使えるのか? • • 利用可能 ◦ Secure Enclave(Secretive)で確認 ◦ FIDOデバイス(YubiKeyなど)はアップデートの概念がなさそう 念のため、複数の認証手段や代替デバイスを持っておくのが安全 39 / 51

40.

Q: OSを再インストールしても使えるのか? 40 / 51

41.

Q: OSを再インストールしても使えるのか? • • FIDO2セキュリティキー ◦ リセット機能はある Secure Enclave ◦ OSを再インストールすると鍵情報は削除される 41 / 51

42.

Q: 複数端末から1つの鍵で接続したい 42 / 51

43.

考え方を変えろ 43 / 51

44.

Q: 複数端末から1つの鍵で接続したい • • • • • 「鍵を共有」するのではなく「端末ごとに鍵を発行して公開鍵を登録」するのを推奨 サーバー側の authorized_keys などに端末分の公開鍵を並べる 端末を廃棄・紛失した際は、その端末に紐づく公開鍵だけをサーバー側から削除すれば足りる 1つの秘密鍵を複数端末に持ち回すのは、複製不可能設計の意味を損なう 端末間での可搬性を確保したいならFIDOデバイスがオススメ ◦ resident機能を使えばauthorized_keysのエントリーを1つにすることも可能 44 / 51

45.

Q: デバイスを紛失したらどうなるのか? 45 / 51

46.

Q: デバイスを紛失したらどうなるのか? • • • • 秘密鍵を取り出すことはできないため、デジタル的なコピーはできない 「知らないうちに鍵が複製されていた」「バックアップから漏洩していた」といったことがない FIDOデバイスの場合 ◦ non-residentはKeyHandleがFIDOデバイス上にないため単体ではログインできない ◦ residentはKeyHandleを生成できるが、PIN入力が必須となる ◦ 認証のたびにPIN入力を強制することも可 Secure Enclaveの場合 ◦ OSへのログインができなければ利用できない ◦ 鍵の利用にTouch ID / Apple Watch / パスワードによる認証を必須とする設定も可能 ◦ OS再インストールすると消える ██ 紛失した場合の対処 • • 紛失したデバイスの公開鍵をサーバーの authorized_keys や各種サービスから削除する Secure Enclaveの場合、Macの「探す」でデバイスを消去する 46 / 51

47.

Q: クラウド上ではどう扱うのか? 47 / 51

48.

Q: クラウド上ではどう扱うのか? • • SSH Agent Forwardingを利用して、認証処理をローカルデバイスへリレーすることは技術的に可能 サーバーでTPMが提供されていれば、サーバー上のTPMを利用して鍵を保護するのも一つの選択肢 ◦ Amazon EC2は NitroTPM の提供あり ◦ Azureは vTPM の提供あり ◦ Google Cloudは vTPM の提供あり ◦ さくらのクラウドは vTPM の提供あり(機密コンピューティング) 48 / 51

49.

ご清聴ありがとうございました 49 / 51

50.

参考 FIDOデバイス鍵生成の流れ 50 / 51

51.

参考 FIDOデバイス認証の流れ 51 / 51