Latchwire
日本語

オープンソース · WireGuard® 互換

VPN の鍵を、​コピーできないものに。

Latchwire は WireGuard の秘密鍵を YubiKey の中に保ちます。鍵はカード上で生成され、カードの外には出ません。プロトコルもサーバーも変わりません。カードがなければトンネルもありません。

プレリリース版:macOS と Linux 向けのコマンドライン

仕組み

  1. YubiKey 上で鍵を生成

    ファームウェア 5.7 以降の YubiKey で keygen を実行します。鍵はカード上の PIV 予備スロット(82–95)に生成され、他のスロットは変わりません。工場出荷時設定のカードは、先に PIN と PUK を変更します。

  2. 公開鍵をサーバーに追加

    サーバーからは通常の WireGuard ピアに見えるため、プラグインも更新も不要です。Latchwire は OPNsense、pfSense、Linux、MikroTik などの標準的なサーバー向けに作られています。現時点でエンドツーエンドのテストは、Linux コンテナ内のテストサーバーとの間でのみ行っています。

  3. PIN を入力して接続

    PIN はカードに渡され、保存されません。通常は一度の入力で済みますが、スリープ後や別のプログラムがカードをリセットしたときは再度求められます。カードを抜くとトンネルは閉じます。目標は 2 秒で、模擬カードでのテストでは約 1 秒でした。

従来の WireGuard と Latchwire の比較

質問従来の WireGuardLatchwire
秘密鍵はどこにある?コンピュータ上のファイルYubiKey の中
コピーできる?はい、痕跡を残さずにいいえ。鍵をカードから取り出すことはできません
カードなしでノート PC が盗まれたら?すべてのサーバーで鍵の交換が必要ディスク上のものではハンドシェイクを完了できません
コンピュータにマルウェアがいたら?鍵を盗み、後で使えるカードが挿さっている間はトンネルを使えますが、鍵を持ち去ることはできません
バックアップファイルのコピー2 本目の YubiKey を、サーバーに 2 つ目のピアとして追加
サーバー側標準の WireGuard同じ:標準の WireGuard
成熟度実績があり、公式クライアントありプレリリース版

ハードウェア

現在コードに存在するのは、下の最初のカードだけです。各ラベルがそれぞれの状態を示します。

YubiKey 5

v1

X25519 対応の PIV、ファームウェア 5.7 以降。鍵はカード上で生成され、カードの外には出ません。これまでのテストは模擬カードを使用しており、実カードでの確認は未完了です。

OpenPGP カード

近日対応

v1 の直後に予定。未実装です。

PKCS#11 と HSM

近日対応

v1 の直後に予定。X25519 対応デバイス向けです。未実装です。

TPM、Secure Enclave、FIDO2

ロードマップ

より弱いクラスで、v1 には含まれません。鍵はハードウェアで暗号化されますが、使用中はメモリ上に現れます。そのため、これらに「鍵をコピーできない」という主張を適用することはありません。

セキュリティ

この主張は、鍵を持ち出せないという話であり、鍵を使えないという話ではありません。対象となる範囲は次のとおりです。

防げること

  • ディスクやバックアップからの鍵のコピー:秘密鍵はそこに書き込まれません
  • カードのないノート PC の盗難やディスクイメージの取得
  • 秘密鍵を含む設定ファイル:Latchwire は拒否します
  • カード上で生成されていない鍵:Latchwire は受け付けません
  • キルスイッチ(kill switch)が有効なときの、トンネル外への通信。制限は脅威モデルを参照

防げないこと

  • カードが挿さり PIN が入力された状態で、あなたの権限で動くマルウェア:カードとトンネルを使えます。タッチは不要です
  • PIN 入力後にカードへアクセスできる他のプログラム。システムによっては他のローカルユーザーも含みます
  • 侵害された root アカウントやカーネル
  • カードと PIN がそろった状態でのノート PC の盗難
  • プロセスメモリの読み取り:セッション鍵とキャッシュされた秘密値がメモリ上にあり、スワップに書き出されることもあります。これらは秘密鍵ではなく、カードなしではハンドシェイクを完了できません
  • 偽造トークン:Latchwire はカードの報告を信頼し、構成証明(attestation)はまだ検証しません

知っておきたいこと

  • PIN は保存されませんが、入力中はメモリを通過します。
  • デフォルトの PIN を試すことはありません。
  • 事前共有鍵を使う場合、ディスクに保存され、ハードウェアでは保護されません。
  • 脅威モデルは各保護の裏付けとなるコードを示します。両者が食い違う場合はコードが正しく、文書の誤りです。

プロジェクトの現状

Latchwire はプレリリース版のソフトウェアです。現時点で存在するものと、確認済みのものは次のとおりです。

  • Linux のコマンドラインとネットワーク

    特権コンテナ内で、ソフトウェア鍵とテストサーバーを使ってエンドツーエンドでテスト済みです。

    テスト済み
  • macOS のコマンドラインとネットワーク

    実装済みです。手動確認は未完了です。

    未検証
  • 実際の YubiKey での動作

    自動テストは模擬カードを使用しています。実カードでの確認は未完了です。

    未検証
  • Windows

    未実装です。Windows 向けビルドはまだコンパイルできません。

    未完成
  • デスクトップアプリ

    開発中です。現在はコマンドラインのみです。

    未完成
  • 署名付きリリースとパッケージ

    リリースはありません。ソースからビルドします。

    まだなし
  • 第三者によるセキュリティレビュー

    第三者によるレビューは行われていません。

    まだなし

インストール

ソースからビルドします。パッケージや署名付きバイナリはまだなく、この手順はテスト用です。

Go 1.25 以降と、ファームウェア 5.7 以降の YubiKey 5 が必要です。Linux ではビルドに C コンパイラと libpcsclite-dev、実行に pcscd も必要です。

ビルド

git clone https://github.com/Kodviva/latchwire
cd latchwire
go build -o latchwire ./cmd/latchwire
sudo install -o root -m 0755 latchwire /usr/local/bin/latchwire

デーモンとエージェントをそれぞれ別のターミナルで起動

sudo latchwire daemon
latchwire agent

鍵を作成して接続

latchwire devices
latchwire keygen --serial <serial> --address <tunnel-ip>
sudo latchwire add office office.conf
latchwire up office

keygen はサーバー用の [Peer] ブロックを出力します。トンネルファイルは通常の WireGuard ファイルで、PrivateKey の代わりに KeyRef と PublicKey を記載します。

Homebrew、.deb、.rpm、Microsoft Store のパッケージを予定していますが、どれもまだ存在しません。

ロードマップ

  1. コア実装済み

    macOS と Linux 向けのコマンドラインクライアント

  2. ネットワーク機能一式実装済み

    フルトンネル、DNS、キルスイッチ、オンデマンド、許可ユーザー。Linux でテスト済み、macOS は確認待ち

  3. 実機での確認未完了

    公開チェックリストによる実際の YubiKey と macOS ネットワークの確認

  4. Windows進行中

    サービス、ネットワーク層、キルスイッチ

  5. デスクトップアプリと翻訳進行中

    macOS、Windows、Linux 向けのデスクトップアプリ

  6. 署名付きリリース予定

    Homebrew、直接ダウンロード、.deb、.rpm、Microsoft Store