暗号化同期

同期はエンドツーエンド暗号化(E2EE)です。暗号化と復号は、同じ同期キーを設定したマシンの上だけで行います。同期キーがストレージやsshcの開発者へ送られることはありません。
sshcは同期用のクラウドストレージを提供せず、同期データを預かりません。利用者が用意したS3互換オブジェクトストレージを同期先として使っています。
| データ | 保存先での状態 |
|---|---|
| 接続設定、Vault内の認証情報、スニペット、同期対象のSSH鍵 | このマシン上で1つのスナップショットとして暗号化してから保存する。ストレージ事業者は内容を平文では取得できない |
| バケット名、S3オブジェクト名、オブジェクトのサイズと更新時刻 | 暗号化されない |
最初のマシンを設定する
- バケット、エンドポイント、アクセスキーを入力する
- 接続テストを完了する
- 保存先が空なら暗号化キーを作成する
- 一度だけ表示される暗号化キーを安全な場所へ保管する
保存すると、ファイルを含まないスナップショットを1つ保存先へ置きます。このマシンがまだ同期していなくても、あとから追加するマシンには同じ暗号化キーの入力を求めます。~/.sshのファイルを送るのは、最初に同期したときです。
別のマシンを追加する
追加するマシンにも、同じS3バケット、オブジェクトのパス、暗号化キーを設定します。リモートに既存のスナップショットがある場合は、正しいキーで復号できたことを確認してから保存できます。データを分ける場合は、別のバケット内パスを指定できます。
設定済みのマシンから設定を渡すこともできます。この方法では、エンドポイント、バケット、アクセスキーを入力し直さずに済みます。
- 設定済みのマシンで、[同期設定を管理]の[設定を書き出す]から[書き出す]を選ぶ。入力するものはない
- 表示されたQRコードを追加するマシンで読み取るか、[ファイルに保存]で保存したファイルを追加するマシンへ渡す
- 追加するマシンのSyncで、[QRコードを読み取る]か[ファイルを選択]を選ぶ
- 暗号化キーを入力して[取り込む]を選ぶ
書き出したファイルとQRコードには、バケットの接続情報とS3の認証情報が、暗号化キーで暗号化された状態で入ります。暗号化キーそのものは入りません。追加するマシンでは、入力した暗号化キーで設定を復号し、保存先のスナップショットも同じキーで復号できることを確認してから保存します。
QRコードの読み取りにはカメラを使います。Androidのアプリは、最初に読み取るときにカメラの権限を求めます。カメラを使えない場合は、ファイルで渡してください。
同期方向は、送受信、送信専用、受信専用から選べます。
- 送受信では、リモートの更新を受け取り、ローカルの変更も送信します
- 送信専用では、送信前にリモートが更新されていないか確認しますが、リモートの内容は適用しません
- 受信専用では、リモートの内容だけを受け取り、このマシンの変更は送信しません
追加したマシンを閲覧用にするなら、受信専用が適しています。履歴が分岐した場合も、現在のリモートを確認してから明示的に受信できます。この操作でバケットへ書き込むことはありません。
接続や受信に失敗した場合は、認証拒否、タイムアウト、DNS、TLS、暗号化キーの不一致、未対応形式、破損したスナップショットを区別して表示します。同じ原因には同じエラーコードを返すため、トラブルシューティングで確認箇所を特定できます。分類できない失敗では、問い合わせに使える診断コードも表示します。
受信時は、リモートスナップショットの内容と権限をそのまま復元します。
- 通常ファイルの
0600と実行可能ファイルの0700を区別するため、内容が同じで権限だけが変わった場合も同期対象です。 - Windowsは実行ビットを持たないため、Windowsのマシンは前回同期したときの権限をそのまま送り、ほかのマシンの
0700を0600に変えません。Windowsで新しく作ったファイルは0600として送ります。 - sshcが解析できないOpenSSH設定や構文上の問題が含まれていても同期そのものは止めず、受信後にConnectionsやDiagnosticsで確認できます。
Gitに似た同期操作
- 変更を確認すると、ローカルとリモートの差分を事前に表示します
- Pushは、差分を確認した後に別のマシンがリモートを更新していない場合だけ送信します
- Pullは、差分確認後にリモートとローカルが変わっていない場合だけ適用します
- Force Pushは、競合した内容をローカル側の内容で置き換えます。確認後に保存先やリモートが変わっていれば上書きしません
- Force Pullは、競合や削除をリモート側の内容に合わせます。確認後にリモートまたはローカルが変わっていれば適用しません
- 履歴では、バケット内の過去のスナップショットを表示します
自動同期を有効にすると、Vaultのロックが解除されている間、1分ごとにリモートの更新を確認します。送受信または送信専用のマシンで設定を変更すると、最後の変更から5秒後に1回だけPushされます。5秒以内に変更を続けた場合は、最後の変更から数え直します。受信専用のマシンからはPushしません。
同期しないファイル


Sync画面の[同期するファイル]では、現在のファイルを検索して同期対象を切り替えられます。詳細設定では、~/.ssh直下の.sshcignoreを編集できます。除外パターンには正規表現ではなく、Gitignoreと同様のglob形式を使います。*、**、?と、先頭/によるルート指定に対応しています。除外したファイルを再び含める場合は、パターンの先頭に!を付けます。
初期状態では、次のOSメタデータ、バックアップ、一時ファイル、ロックファイル、SSHの許可鍵・既知ホスト情報、ログイン時の環境変数・初期化スクリプトを除外します。
# OS metadata files
**/.DS_Store
**/Thumbs.db
**/desktop.ini
# Backup and temporary files
*.bak
*.tmp
# Lock files
*.lock
# ssh config
authorized_keys
authorized_keys2
known_hosts
known_hosts.old
known_hosts2
known_hosts2.old
/environment
/rc/environmentと/rcは.ssh直下だけを対象とし、サブフォルダ内の同名ファイルは除外しません。
この既定値は.sshcignoreが未保存の場合に使われます。保存済みの除外設定はそのまま維持されます。
.sshcignoreを保存すると、その内容自体は同期され、同じ保存先を使うマシンで共通の除外設定になります。除外された既存のローカルファイルは、通常のPullでもForce Pullでも削除・上書きされません。接続設定や鍵を除外すると他のマシンへ同期されなくなるため、画面上でも警告します。
.sshcignore自体と、Vault・スニペットの暗号化転送用データは制御ファイルとして常に同期され、*などの広い規則でも除外されません。S3の認証情報、マシン固有の履歴、実行中の処理を管理するファイル、どのマシンかを見分ける~/.ssh/sshc/machine-idは、sshcが自動的に除外します。マシンごとの設定(使うプリセットとポート)は、マシンごとのファイルとして同期されます。
Sync画面では、普段使う操作と設定を分けています。バケットと暗号化キーは[同期設定を管理]にまとまり、スナップショットの差分とS3上の履歴は[詳細・履歴]から開けます。履歴は最初に最新5件だけを表示し、必要に応じて全件を開けます。
同期の暗号化キー
マスターパスワードはマシンごとに異なって構いません。一方、同じ保存先を使うマシンには、共通の暗号化キーが必要です。暗号化キーを紛失すると、リモートのスナップショットを復号できません。
競合の扱いや履歴については、Push・Pull・履歴で詳しく説明しています。