メインコンテンツにスキップ ナビゲーションにスキップ フッターにスキップ

プロキシとエグゼキュータ

ブラウザやシンクライアントからのコマンドが、クライアント側でSSHキーやマシンのアドレスを一切保持せずに実行される仕組み

プロキシとエグゼキュータ

通常、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-という接頭辞が付く)でコマンドリクエストに応答します。これにより、マシンやアンロックがなくても、フォーム、ストリーミング、結果のレンダリングを含むコンソール全体を動かして試すことができます。実際の実行には本物のエグゼキュータが必要です。

関連