Skip to content

暗号化同期 ​

同期方向と自動同期の状態を表示したSync画面

同期はエンドツーエンド暗号化(E2EE)です。暗号化と復号は、同じ同期キーを設定したマシンの上だけで行います。同期キーがストレージやsshcの開発者へ送られることはありません。

sshcは同期用のクラウドストレージを提供せず、同期データを預かりません。利用者が用意したS3互換オブジェクトストレージを同期先として使っています。

データ保存先での状態
接続設定、Vault内の認証情報、スニペット、同期対象のSSH鍵このマシン上で1つのスナップショットとして暗号化してから保存する。ストレージ事業者は内容を平文では取得できない
バケット名、S3オブジェクト名、オブジェクトのサイズと更新時刻暗号化されない

最初のマシンを設定する ​

  1. バケット、エンドポイント、アクセスキーを入力する
  2. 接続テストを完了する
  3. 保存先が空なら暗号化キーを作成する
  4. 一度だけ表示される暗号化キーを安全な場所へ保管する

保存すると、ファイルを含まないスナップショットを1つ保存先へ置きます。このマシンがまだ同期していなくても、あとから追加するマシンには同じ暗号化キーの入力を求めます。~/.sshのファイルを送るのは、最初に同期したときです。

別のマシンを追加する ​

追加するマシンにも、同じS3バケット、オブジェクトのパス、暗号化キーを設定します。リモートに既存のスナップショットがある場合は、正しいキーで復号できたことを確認してから保存できます。データを分ける場合は、別のバケット内パスを指定できます。

設定済みのマシンから設定を渡すこともできます。この方法では、エンドポイント、バケット、アクセスキーを入力し直さずに済みます。

  1. 設定済みのマシンで、[同期設定を管理]の[設定を書き出す]から[書き出す]を選ぶ。入力するものはない
  2. 表示されたQRコードを追加するマシンで読み取るか、[ファイルに保存]で保存したファイルを追加するマシンへ渡す
  3. 追加するマシンのSyncで、[QRコードを読み取る]か[ファイルを選択]を選ぶ
  4. 暗号化キーを入力して[取り込む]を選ぶ

書き出したファイルと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の許可鍵・既知ホスト情報、ログイン時の環境変数・初期化スクリプトを除外します。

text
# 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・履歴で詳しく説明しています。