ハードウェアセキュリティキー (FIDO2/Yubikey) による SSH セキュリティ向上ガイド:秘密鍵が「致命的な弱点」ではなくなる時

Security tutorial - IT technology blog
Security tutorial - IT technology blog

開発者やシステム管理者にとって、SSHキーは毎日の業務に欠かせないツールです。従来は ssh-keygen -t ed25519 でキーを生成し、パスフレーズを設定すればサーバーのセキュリティは万全だと思われてきました。

しかし現実はどうでしょうか。GitHubにうっかり id_ed25519 ファイルをコミットしてしまったり、PCがマルウェアに感染したりすれば、状況は一変します。GitGuardianのレポートによると、毎年数百万もの「シークレット」が公開リポジトリで漏洩しています。そうなれば、パスフレーズがいかに長くても、ハッカーはオフラインで高速にブルートフォース攻撃を仕掛けることができます。最近実施した10以上のシステムの監査では、脆弱性の80%が秘密鍵ファイルの管理の甘さに起因していることが分かりました。

この問題を根本的に解決する最も効果的な方法は、ハードウェアセキュリティキー(YubikeyやFIDO2準拠のデバイス)を使用することです。この方法では、秘密鍵はセキュリティチップ内に「固定」されます。たとえPC上のキーファイルが盗まれたとしても、物理デバイスでのタッチによる確認がなければ、ハッカーは何もできません。

クイックスタート:5分で完了するYubikeyのSSH設定

すでに手元にキーがある方向けのガイドです。UbuntuやmacOSを使用し、キーがFIDO2プロトコルをサポートしていることを前提としています。

ステップ1:OpenSSHのバージョンを確認する

FIDO2サポート(sk – Security Keyと呼ばれます)には、OpenSSH バージョン8.2以上が必要です。以下のコマンドで確認してください:

ssh -V

バージョンが8.2未満の場合は、OSをアップグレードするか、最新のOpenSSHをインストールして進めてください。

ステップ2:キーをデバイス上で直接生成する

YubikeyをUSBポートに差し込み、以下のコマンドを実行します:

ssh-keygen -t ed25519-sk -C "[email protected]"

実行するとキーのライトが点滅します。金属部分を軽くタッチして「ユーザーの存在(User Presence)」を確認してください。その後、通常通りファイルハンドル用のパスフレーズを設定します。

ステップ3:公開鍵をサーバーに登録する

おなじみのコマンドを使用して、対象のサーバーにキーを送信します:

ssh-copy-id -i ~/.ssh/id_ed25519_sk user@your_server_ip

これで準備完了です!次回のログインからは、サーバーがキーへのタッチを要求するようになります。タッチしなければログインできません。非常に安心感があります。

なぜハードウェアキーは従来のSSHキーより「圧倒的」に優れているのか?

「PC上に id_ed25519_sk ファイルが生成されるなら、それが盗まれたらどうなるの?」という疑問を持つ方もいるでしょう。

ここが FIDO2/U2F の大きな違いです。PC上のファイルは実際には Key Handle(識別子)に過ぎず、本物の秘密鍵ではありません。本物の鍵はセキュリティチップの深部にあり、ファイルとして取り出すことは不可能です。

  • 通常のSSHキー: HDD上のファイルがすべてです。ファイルの紛失 + パスフレーズの漏洩 = サーバー制御権の喪失。
  • SSH FIDO2 (sk): 鍵 = ファイルハンドル + 物理キー。ハッカーがファイルを入手しても、手元にあなたのYubikeyがなければ無意味です。

これはSSHプロトコルレイヤーにおける多要素認証(MFA)です。Google Authenticatorの導入や、サーバー側での複雑なスクリプト設定はもう不要です。

高度な設定:レジデントキー (Resident Keys)

新しいYubikey(Series 5など)では、レジデントキー機能により利便性が大幅に向上しています。

通常、別のPCで作業する場合はファイルハンドルをコピーする必要がありますが、レジデントキーを使えば、このハンドル自体がYubikeyのメモリ内に保存されます。生成時に -O resident オプションを追加します:

ssh-keygen -t ed25519-sk -O resident -O verify-required

(注:verify-required を指定すると、タッチの前にキーのPIN入力が必須となり、「持っているもの」「知っていること」「行うこと」の3層セキュリティになります)

PCを移動した際は、キーを差し込んで以下を入力するだけです:

ssh-add -K

このコマンドにより、Yubikeyから現在のマシンのSSHエージェントにキーが自動的に「ロード」されます。手動でファイルをコピーする手間はもうありません。

ハードニング:サーバー側でハードウェアキーのみを許可する設定

キーを作成するだけでなく、サーバー側の設定を強化して安全性を完璧にしましょう。従来の通常のキーをすべて拒否するように設定します。

サーバーのSSH設定ファイルを開きます:

sudo nano /etc/ssh/sshd_config

-sk 接尾辞を持つアルゴリズムのみを許可する以下の行を追加します:

PubkeyAcceptedAlgorithms [email protected],[email protected]

保存してサービスを再起動します:

sudo systemctl restart ssh

これで、ハッカーが数百万の従来の秘密鍵を持っていたとしても、門前払いにすることができます。

導入における実務的なアドバイス

セキュリティには常にトレードオフが伴います。スムーズな導入のための4つの「教訓」を以下にまとめました:

  1. 常にバックアップを用意する: 決して1つだけのキーに頼らないでください。紛失や故障(確率は極めて低いですが)の際、締め出されてしまいます。最低2つ購入し(例:Yubikey 5 NFCなど)、両方を設定して1つはバックアップとして保管しておきましょう。
  2. FIDO2 PINを設定する: キーを「未設定」のままにしないでください。PINを設定すれば、万が一デスクの上で誰かにキーを拾われても、悪用を防ぐことができます。
  3. WSL2利用時の注意: Windowsでは、USBをLinuxにマッピングするのが少し面倒です。WSLがYubikeyを認識できるように usbipd をインストールする必要があります。
  4. OSの互換性: CentOS 7のような古いOSでは ed25519-sk がサポートされていない場合があります。その場合は、互換性の高い ecdsa-sk を検討してください。

サーバーが24時間365日狙われている現代において、セキュリティキーへの投資は非常に価値のある決断です。秘密鍵の漏洩という不安から解放され、ぐっすり眠れるようになります。もし sign_and_send_pubkey: signing failed というエラーが出た場合は、ローカルマシンに libfido2 ライブラリがインストールされているか確認してみてください。

Share: