システム設計

出先からQUTRITを操作

QUTRIT スマホ遠隔操作は、外出先のスマホから、起動中のPC版QUTRITを安全に操作するための仕組みです。 会話履歴、ローカルRAG、APIキー、AI処理の入口は、引き続きPC側に保存されます。

全体設計概要

安全性を支える4つの基本設計

PCのポートを開けない

PC版QUTRITからCloudflareへ外向きに接続します。ルーターのポート開放や、PCを直接インターネットへ公開する設定は不要です。

本文は端末間で暗号化

会話内容はPCとペア済みスマホ間でエンドツーエンド(E2E)で暗号化され、通信途中での解読を防ぎます。

サインインだけでは操作できない

Firebaseへのサインインに加えて、PCに表示したQRコードを使ったペアリングと、端末固有の暗号鍵が必要です。

最終判断はPC側

中継サーバーやスマホを無条件に信用せず、PC側がペアリング済み端末と許可コマンドを確認してから処理します。

通信アーキテクチャ概要

Cloudflareは「中身を読めない交換台」です

スマホとPCの間には、Cloudflare WorkersとDurable Objectsを使った中継経路があります。 ただし、中継されるチャット本文は暗号化され、鍵のかかった「封筒」のような状態です。

中継側は、どのPCへ届けるか、データ量が上限内か、といった配送に必要な情報は扱いますが、 封筒の中にある質問や回答を復号する鍵は持ちません。

重要: 「本文を保存しない」だけでなく、「通信経路内では本文を読めない」ことを設計の中心にしています。
スマホ側 暗号化・復号
暗号文 中身は読めない
PC版QUTRIT 暗号化・復号・処理
通信経路

スマホからAIの回答が返るまで

中継サーバーはAI処理を行いません。暗号化された命令をPCへ届け
暗号化された結果をスマホへ戻す役割に限定されています。

Firebase Auth / Firestore

アカウント認証、ペアリング状態、公開鍵、端末名、有効期限などのメタデータを管理します。会話本文や秘密鍵は保存しません。

データの可視性

誰が何を見られるのか

コンポーネント 主な役割 会話内容の復号 会話内容の永続保存
スマホ側 表示、入力、暗号化、復号 可能 しない
Cloudflare Worker / Durable Object 認証済みWebSocketの中継、接続状態、サイズ確認 不可 しない
PC版QUTRIT 復号、権限確認、AI処理、履歴管理 可能 PC内に保存
Firebase Auth / Firestore 認証、端末・ペアリングのメタデータ管理 不可 しない

中継サーバーから見えるのは、ユーザーID、ホストID、端末ID、ジョブID、メッセージ種別、暗号文サイズ、時刻など、配送と運用に必要なメタデータです。

技術詳細

多層防御の仕組み

1. 外向きWebSocket

PC版QUTRITがCloudflare RelayへWSS接続を開始します。PC側で待受ポートを公開しないため、 インターネットから自宅・社内PCへ直接接続する経路を作りません。

  • PCから中継サーバーへの外向き接続のみ
  • 90秒間隔の低頻度liveness確認
  • 最終応答から180秒でオフライン判定
  • 暗号化エンベロープは最大512 KiBに制限
  • Durable ObjectsのWebSocket Hibernation APIを使用

2. WebSocket接続認証

PCとスマホはFirebase ID Tokenを、WebSocket接続後の最初の認証メッセージとして送信します。 トークンをURLのクエリ文字列へ載せないため、URLログやブラウザ履歴へ残る範囲を減らします。

  • 署名、発行元、対象プロジェクト、有効期限を中継サーバーで検証
  • Firestoreで対象PCの所有UIDと有効状態を確認
  • スマホはペアリング済み端末・期限・Revoke状態も確認
  • 認証前の接続は未承認状態
  • 一定時間内に認証できない接続は切断
  • WebSocketのURLにはホストIDのみを使用

3. QRペアリングと公開鍵確認

PCが表示するQRコードには、PC公開鍵、その指紋、5分で期限切れになるペアリングトークンが含まれます。 スマホはQR内の公開鍵から指紋を再計算し、一致しなければペアリングを拒否します。

  • ペアリングトークンは同一Firebaseユーザーか確認
  • 5分の有効期限と使用済み状態を確認
  • 端末登録とトークン消費はFirestore上で原子的に実行
  • スマホごとに固有の鍵ペアと端末IDを作成
  • ペアリングは一定期間未使用の場合に期限切れ
  • PC設定からペアリング済み端末を解除可能

4. エンドツーエンド暗号化

暗号鍵はスマホとPCで保持し、中継サーバーへ渡しません。コマンド本文と結果本文は、 正規化したJSONを暗号化してからWebSocketへ送ります。

鍵共有ECDH P-256
鍵導出HKDF-SHA-256
本文暗号AES-256-GCM
Nonceランダム 12 bytes
認証タグ128 bit
追加認証データID・種別・シーケンス等

5. 鍵の保管

スマホの秘密鍵はWeb Crypto APIで非抽出可能なCryptoKeyとして生成し、ブラウザのIndexedDBへ保存します。 PCの秘密鍵は、利用可能な環境ではElectronのOS連携暗号化機能で保護します。

  • Firestoreへ保存するのはスマホ公開鍵のみ
  • 秘密鍵、共有秘密、APIキーはFirestoreへ保存しない
  • Firestore Security Rulesで許可フィールドを限定
  • 端末内PINはPBKDF2-SHA-256で導出し、サーバーへ送信しない
  • 一定数の失敗で段階的ロックアウト、一定期間の無操作またはバックグラウンド移行で再ロック

6. PC側のコマンド制限

未知のコマンドや危険な操作は、復号後にPC側で拒否します。

  • 許可: 会話一覧・表示、新規チャット、送信、モデル設定、ホワイトボード参照
  • 拒否: 資格情報の読み書き、設定変更、ファイル添付・パス読取
  • 拒否: 会話の削除・改名、ホワイトボード編集、横断検索
  • ジョブIDで同じ処理の重複実行を抑止
  • Revoke時は対象WebSocketを即時切断し、失効状態を巻き戻せないルールで以後の認証も拒否
ローカルファースト設計

スマホを使っても
PC中心の設計は変わりません

PCに残るもの

  • 会話履歴と生成結果
  • ローカルRAGのインデックスと参照元
  • セルフサービスモードのAPIキー
  • Notionなど外部連携の資格情報
  • AI実行とツール実行の最終判断

クラウド側で扱うもの

  • Firebaseのアカウント認証情報
  • ホストID、端末ID、公開鍵、端末名
  • ペアリングの期限・使用済み状態
  • 暗号化された通信とそのサイズ
  • 接続状態、時刻、本文を含まないエラー情報
適用範囲と限界

E2E暗号化が守るのは、スマホとPCの間です

PCがメッセージを復号した後は、通常のQUTRITと同様に、選択したAIサービスへ必要なデータを送信します。 セルフサービスモードではPCからAIサービスへ直接接続し、おまかせモードではQUTRITのクラウド中継を経由します。 各AIサービスでのデータ取扱いは、契約・プラン・設定にも依存します。

  • PC自体がマルウェア等に侵害された場合、PC上で復号された情報まで守るものではありません。
  • ペアリング済みスマホのOSロック、ブラウザ更新、端末管理も重要です。
  • 端末内PINは追加の画面ロックであり、スマホ本体の生体認証や強固なパスコードの代わりではありません。
  • 可用性、通信事業者、Cloudflare、Firebase、AIサービスの障害を完全に排除するものではありません。