プロキシとエグゼキュータ
通常、rdcは自分のマシン上で自分の設定とSSHキーを使って動作し、サーバーに直接接続します。プロキシモデルはこれを2つに分割します。シークレットを一切持たないシンクライアントと、シークレットを保持して実際の作業を行うエグゼキュータです。WebコンソールのRunボタンとCLIの--proxyフラグはどちらもシンクライアントであり、同じワイヤプロトコルを話します。
コマンドではなく、コマンドの意図を送る
シンクライアントはSSHキーもマシンのアドレスも復号済みの設定も一切保持しません。何かを実行したいときは、コマンドの意図だけを送信します。コマンドの識別子(CLIコントラクト内のパス、例えばrepo up)とパラメータです。エグゼキュータは同じコントラクトの中でそのコマンドを調べ、対応するサーバー側の関数に解決し、復号済みの設定から対象マシンを解決して、自分自身のSSH接続で実行します。出力はストリーミングでクライアントに返ります。
エグゼキュータはCLIそのものであり、rdc serveでサーバーとして起動されます。オペレーターがラップトップで使うのと同じバイナリが、彼らに代わってコマンドを実行するものになります。配置場所は2通りあります。
--mode daemon: 自分で管理するホスト上で動作し、他のCLIと同様にヘッドレスでエンロールされます(設定ストレージ参照)。そのため設定キーを自分で導出でき、セッションごとの付与を必要としません。これが厳格な階層です。SSHがあなたのネットワークから出ることは一切ありません。--mode container: あなたの組織に紐づいてホストされたコンテナ内で動作します。キーを一切持たない状態で起動し、クライアントがセッション用にキーを付与するまで何もできません。これが利便性重視の階層です。
CEKの付与
設定ストレージはゼロ知識です。サーバーは暗号化されたblobしか保存せず、コンテンツ暗号化キー(CEK)が平文で存在するのは、それをアンロックしたクライアント上だけです。したがってコンテナモードのエグゼキュータはキーを付与される必要があり、その付与の過程でサーバーにキーを露出してはなりません。
流れはこうです。アンロック済みのブラウザがエグゼキュータとのセッションを開き、セッションの公開鍵を受け取って、X25519を使ってそのセッション宛にCEKをシールします。シールされたblobはアカウントサーバーを経由しますが、サーバーはそれを開けないため、ゼロ知識性はエンドツーエンドで保たれます。エグゼキュータはCEKをRAM上でのみ復号し、30分のアイドルタイムアウトを設けます。ディスクに書き込まれることは一切ありません。以降のコマンドリクエストはX-Config-Sessionヘッダーで付与済みセッションを参照します。
監査の観点で重要な点が一つあります。同一のユーザーIDが3つの段階すべて(セッションの開始、キーの付与、コマンドの実行)を貫きます。アカウントサーバーは自身の資格情報をエグゼキュータに転送することは決してありません。各段階ごとに実際のユーザーに紐づいた短命トークンを発行し、そのユーザーのメンバーシップを毎回再チェックします。エグゼキュータは提示されたトークンを実行前に必ず検証します。あるユーザーが行った付与を、別のユーザーが使うことはできません。
設定のstate側の半分(ホストローカルなランタイムデータ)は設定blobの中を一切移動しないため、この経路でエグゼキュータに届くこともありません。
プロキシ経由で実行できるもの
すべてのコマンドがリモート実行に適しているわけではありません。コントラクト内の各コマンドはproxyCapableフラグを持ち、エグゼキュータはポリシー設定とは無関係に、これをサーバー側で強制します。
- マシンプレーンの非対話コマンド(deploy、backup、status、logsなど)はプロキシ対応です。
- 設定プレーンのコマンドは対象外です。設定を編集するコマンドであり、この経路ではブラウザの役割です(Webコンソールは代わりに組み込みの設定エディタへルーティングします)。
- 対話型コマンド(ターミナル、VS Codeセッション)は対象外です。この経路にはTTYが存在しません。
- クライアント側の転送コマンド(
rdc repo sync)は対象外です。クライアントのファイルシステムとマシンの間でデータを移動するものであり、エグゼキュータはクライアントのファイルを持っていません。
Webコンソールも同じフラグを見て、コマンドにRunボタンを表示するかどうかを判断しますが、クライアントが何を送ってきても、エグゼキュータは対応不可のコマンドを拒否します。
モックエグゼキュータ
開発環境で実際のエグゼキュータが設定されていない場合、アカウントサーバー自身がモックのストリームと明らかに偽物とわかるデータ(リソース名にmock-という接頭辞が付く)でコマンドリクエストに応答します。これにより、マシンやアンロックがなくても、フォーム、ストリーミング、結果のレンダリングを含むコンソール全体を動かして試すことができます。実際の実行には本物のエグゼキュータが必要です。