設定ストレージ
設定ストレージは、デバイス間でCLI設定のゼロ知識暗号化同期を提供します。設定はコンテンツ暗号化キー(CEK)を使ってクライアントサイドで暗号化され、サーバーが平文データを見ることは一切ありません。
アンロック方法(キースロット)
ストアごとに1つのCEKがあり、LUKSのキースロットと同様に、アンロック方法ごとに個別にラップされます。どのスロットからでも同じキーを開くことができ、データを再暗号化することなくスロットの追加・削除が可能です:
| 方法 | 内容 | 備考 |
|---|---|---|
| パスキー | PRF拡張機能を備えたWebAuthnパスキー | 最も強力な選択肢。ハードウェアに紐づく |
| マスターパスワード | 任意に選ぶパスワードをPBKDF2-SHA256(60万回のイテレーション)でストレッチング | PRF対応ハードウェアなしでも利用可能。ヘッドレスCLIエンロールメントも可能にする |
| リカバリーコード | 生成されるRC1-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX形式のコード | 作成時に一度だけ表示される。安全な場所に保管すること |
どの方法も同じパイプラインに合流します。スロットから得られるシークレットとサーバー側が保持するシークレットを組み合わせてCEKをアンラップします。どちらか一方だけでは不十分なため、3つの方法すべてでゼロ知識の性質が保たれます。スロットのシークレットがサーバーに届くことは一切ありません。
スロットはポータルの設定ストレージページで管理します。ハードウェアのみでのアンロックを望む組織は、パスキー必須ポリシーを有効にできます。このポリシーはストア全体でパスキー以外のスロットを拒否し、失効させます。
アンロックはデバイスごとに行われます。新しいデバイスでは一度アンロックすれば、以降の日常的なCLI操作(push/pull)はパスキーに触れることもパスワードを入力することもなく動作します。
前提条件
- 二要素認証がアカウントで有効になっていること
- パスキー方式の場合: FIDO2セキュリティキー(例: YubiKey)、iCloud Keychain、Google Password Manager、1Password、DashlaneなどPRFサポート付きのパスキープロバイダー
- ブラウザ: Chrome 133+、Edge 133+、Firefox 130+、またはSafari 17+
PRFの要件はパスキースロットにのみ適用されます。マスターパスワードとリカバリーコードの方式は、サポートされているブラウザであればどれでも動作します。
セットアップ
- サイドバーの設定ストレージに移動し、設定ストレージをセットアップをクリックします
- 要件チェックリストがブラウザ、2FA、セッションのステータスを確認します
- セットアップ開始をクリックします。パスキースロットの場合、セキュリティキーを2回タッチする必要があります:
- 1回目のタッチ: パスキーを登録
- 2回目のタッチ: PRFを介して暗号化キーを派生
- セットアップ完了, パスキーシークレットはOSのキーリングに保存されます
セットアップ後は、認証器を紛失したり非対応だったりした場合にロックアウトされないよう、設定ストレージページからマスターパスワードまたはリカバリーコードのスロットを追加しておいてください。
PRFプロバイダー互換性
| プロバイダー | PRFサポート | プラットフォーム |
|---|---|---|
| YubiKey / FIDO2セキュリティキー | ✅ | Windows 11、macOS、Linux |
| iCloud Keychain | ✅ | macOS 15+、iOS 18+ |
| Google Password Manager | ✅ | Android |
| 1Password | ✅ | Android、iOS |
| Dashlane | ✅ | クロスプラットフォーム |
| Bitwarden拡張機能 | ❌ | 開発中 |
| Windows Hello | ❌ | 非対応 |
ヘッドレスCLIエンロールメント
ブラウザを持たないマシン(サーバー、CIランナー、エグゼキュータデーモンなど)は、マスターパスワード方式で既存のストアにエンロールできます:
rdc config remote enable --password
要件:
- ポータル経由で既にプロビジョニングされたマスターパスワードスロット(プロビジョニング中はブラウザがキーを保持するため、このステップ自体はヘッドレスにはできません)
- 呼び出しを認証するための、
config:enrollスコープ付きのAPIトークン
エンロールメントは読み取り操作です。CLIはスロットの公開KDFパラメータとラップされたキーを取得し、パスワードのシークレットをローカルで導出して、デバイス上でCEKをアンラップします。これによりデバイスは設定を復号・同期できるようになりますが、ストア自体は変更されません。
有効化とオフライン読み取り
rdc config remote enable はアクティブな設定をストアに接続します。ストアが空の場合、有効化によって現在のローカル設定からストアが初期化されます: ローカルのリソースがストアの最初のバージョンとしてプッシュされ、その後プルバックしてラウンドトリップが正しく行われたことを確認します。ストアに既に内容がある場合、有効化は上書きするのではなく既存の内容と整合を取ります(本当の乖離がある場合は--forceを渡さない限り中断します)。
有効化されると、設定は完全な読み取りキャッシュを保持します。ローカル設定と同じ仕組みで保存時暗号化されるため、アカウントサーバーに到達できない場合でもストアを使い続けられます:
- 読み取りはオフラインでも機能します。 キャッシュされた内容は、キャッシュされたバージョンとタイムスタンプ(
cachedVersion/cachedAt)を付与した、古さに関する警告付きでstderrに表示されます。 - 書き込みにはサーバーが必要で、到達できない場合はフェイルクローズします。 オフライン書き込みキューはありません: サーバーに到達できない書き込みはエラーになり、対象のサーバー名を示します。書き込みコマンドが成功していれば、その変更は必ずサーバー上にあります。
- 2台のマシンからの同時編集は、リソースバケット単位でのプル・リプレイ・リプッシュによって解決されるため、他所での同時編集が自分の変更を上書きすることはありません。
キーローテーション
ストアのCEKをローテーションすると、新しい世代の下で再ラップされます:
- ローテーションによりリカバリーコードは常に無効化されるため、ローテーション後に新しいコードを生成して保存してください
- マスターパスワードスロットは、ローテーションウィザード中にパスワードを再入力した場合にのみ維持されます
- 古い世代に取り残されたスロットは、わかりにくい復号エラーで失敗するのではなく、失効(stale)として報告されます
メンバー管理
設定ストレージは組織ごとにスコープされます。メンバーはWebポータルで管理されます:
- メンバーの表示: 設定ストレージ → メンバー
- メンバーの追加: 現在はCLIのみ(Web UIは計画中)
- メンバーの削除: メンバーページの削除ボタンをクリック(2FA + 再認証が必要)
安全ガードにより、最後のアクティブメンバーの削除や自分自身の削除が防止されます。
ストア内の設定はさらにチームごとにスコープされますが、このスコープはサーバー側のアクセス制御であり、暗号的な分離ではありません: 組織全体で1つのCEKがすべてのチームの設定を暗号化しており、どのチームをメンバーが読み取れるかはサーバーが強制します。
セキュリティ
- ゼロ知識: サーバーは復号できない三重暗号化データを保存します
- 分割キー: 復号にはスロットシークレット(クライアント)とサーバーシークレット(サーバー)の両方が必要です
- ローテーショントークン: 各API呼び出しは新しいトークンを使用し、古いトークンは自動破棄されます
- IPバインディング: トークンは初回使用時にIPにバインドされます
- 即時失効: 削除されたメンバーは30秒以内にアクセスを失います
トラブルシューティング
| エラー | 原因 | 修正方法 |
|---|---|---|
| PRF not supported | 認証器にPRF拡張機能がない | YubiKey、iCloud Keychain、1Password、Dashlaneを使用するか、マスターパスワードスロットを追加してください |
| X25519 not supported | ブラウザバージョンが古すぎる | Chrome 133+、Edge 133+、Firefox 130+、またはSafari 17+に更新してください |
| Already configured | 組織のストアが既に存在する | /account/config-storageにアクセスして管理してください |
| Config storage not configured | サーバーにblobストレージがない | 管理者に連絡してR2/RustFSを設定してください |
| Token expired | 24時間アクティビティがない | 任意の設定ストレージコマンドを実行してリフレッシュしてください |
| Cannot remove last member | ストアが永久にロックされる | 先に別のメンバーを追加してください |
| Stale slot | スロットが直近のキーローテーションより古い | スロットを再登録してください(リカバリーコードはローテーションのたびに再生成が必要です) |
関連
- Webコンソール、ブラウザでストアをアンロックしてコマンドを実行する
- プロキシとエグゼキュータ、アンロックされたキーがエグゼキュータに付与される仕組み