オープンソース · WireGuard® 互換
VPN の鍵を、コピーできないものに。
Latchwire は WireGuard の秘密鍵を YubiKey の中に保ちます。鍵はカード上で生成され、カードの外には出ません。プロトコルもサーバーも変わりません。カードがなければトンネルもありません。
プレリリース版:macOS と Linux 向けのコマンドライン
仕組み
YubiKey 上で鍵を生成
ファームウェア 5.7 以降の YubiKey で keygen を実行します。鍵はカード上の PIV 予備スロット(82–95)に生成され、他のスロットは変わりません。工場出荷時設定のカードは、先に PIN と PUK を変更します。
公開鍵をサーバーに追加
サーバーからは通常の WireGuard ピアに見えるため、プラグインも更新も不要です。Latchwire は OPNsense、pfSense、Linux、MikroTik などの標準的なサーバー向けに作られています。現時点でエンドツーエンドのテストは、Linux コンテナ内のテストサーバーとの間でのみ行っています。
PIN を入力して接続
PIN はカードに渡され、保存されません。通常は一度の入力で済みますが、スリープ後や別のプログラムがカードをリセットしたときは再度求められます。カードを抜くとトンネルは閉じます。目標は 2 秒で、模擬カードでのテストでは約 1 秒でした。
従来の WireGuard と Latchwire の比較
| 質問 | 従来の WireGuard | Latchwire |
|---|---|---|
| 秘密鍵はどこにある? | コンピュータ上のファイル | YubiKey の中 |
| コピーできる? | はい、痕跡を残さずに | いいえ。鍵をカードから取り出すことはできません |
| カードなしでノート PC が盗まれたら? | すべてのサーバーで鍵の交換が必要 | ディスク上のものではハンドシェイクを完了できません |
| コンピュータにマルウェアがいたら? | 鍵を盗み、後で使える | カードが挿さっている間はトンネルを使えますが、鍵を持ち去ることはできません |
| バックアップ | ファイルのコピー | 2 本目の YubiKey を、サーバーに 2 つ目のピアとして追加 |
| サーバー側 | 標準の WireGuard | 同じ:標準の WireGuard |
| 成熟度 | 実績があり、公式クライアントあり | プレリリース版 |
ハードウェア
現在コードに存在するのは、下の最初のカードだけです。各ラベルがそれぞれの状態を示します。
YubiKey 5
v1X25519 対応の 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)はまだ検証しません
プロジェクトの現状
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 のパッケージを予定していますが、どれもまだ存在しません。
ロードマップ
コア実装済み
macOS と Linux 向けのコマンドラインクライアント
ネットワーク機能一式実装済み
フルトンネル、DNS、キルスイッチ、オンデマンド、許可ユーザー。Linux でテスト済み、macOS は確認待ち
実機での確認未完了
公開チェックリストによる実際の YubiKey と macOS ネットワークの確認
Windows進行中
サービス、ネットワーク層、キルスイッチ
デスクトップアプリと翻訳進行中
macOS、Windows、Linux 向けのデスクトップアプリ
署名付きリリース予定
Homebrew、直接ダウンロード、.deb、.rpm、Microsoft Store