リモート暗号化ストレージと同期

リモート暗号化ストレージと同期

複数のコンピューター間でフォルダー ツリーを同期させようとしています。現在、unison中央のリモート サーバーを備えたスター トポロジを使用しています。サーバー上のデータを暗号化したいので、サーバー上でツリーunison(.unisonフォルダーを含む) はツリー内に保持されますencfs。同期を実行するには、各クライアントで次の操作を実行します。

  • サーバーストレージをマウントするsshfs
  • ストレージをローカルencfsにマウントするsshfs
  • unisonドキュメントのローカル コピーとマウントされたコピーの間で実行します。

この設定には多くの利点があります:

  • オープンソースツール
  • スクリプト可能なコマンドラインソリューション
  • 安全な通信ssh
  • encfsフォルダツリーがサーバー上で復号化されないため、サーバーからプライバシーが保護されます。
  • unisonプレーンテキスト上で実行されるため、同期中に変更を比較する機能

あまりうまく機能しない点の 1 つは、同期の速度です。encfsサーバーのフォルダーはクライアントにマウントされるため、クライアントが行うすべての呼び出しをサーバーにstat()転送する必要があります。ドキュメント ツリーにはすでに何千ものファイルがあり、同期では各ファイルに対して少なくとも 1 回の呼び出しを実行する必要があります (フォルダーに保存されている状態の変更を排除するため)。上記の利点を維持しながら、より高速な代替手段はありますか?sshunisonstat().unison

注: 最後の条件を削除すると、unison暗号テキスト上で実行し、encfsツリーをローカルにマウントするだけで済みます。その後、unisonクライアントとサーバー上でローカルに実行されるため、stat()呼び出しが高速になります。ただし、少なくともどのファイルが同期されているかを確認するオプションがあると便利です。暗号テキストunison上ではencfs、ファイル名が暗号化されます。

この問題を解決するには、同期中にファイル メタデータをサーバーからクライアントに効率的に転送する必要があることは理解しています。たとえば、メタデータを 1 か所に保存して、何千ものブロックを送信するのではなく (転送呼び出しで行われる処理)、1 つ (または数個) のデータ ブロックのみを送信してすべてを転送する方法 (つまり、既存のstat()ツールの組み合わせ) があるかどうか疑問に思っています。

encfsたとえば、サーバー上の大きなファイル内に格納されている 以上ext4のパーティションを に置き換え、経由でクライアントにマウントするとどうなるでしょうか。ファイルシステムはファイルのメタデータをまとめて保持し、数ブロックのみを送信して転送するのでしょうか。更新中に、暗号化されたファイル全体を書き換えるのではなく、数ブロックのみを送信することを認識するのでしょうか。dm-cryptlosetupsshfsext4sshfs

答え1

ext4私は以上luksの方法で成功しましたsshfsunisonこのタイプのマウントで実行すると、 以上encfsの方法よりもはるかに高速であるsshfsことがわかりました。つまり、何千ものstat()構造体が何らかの方法でファイルシステムにまとめられext4、同期中に必要なネットワーク トラフィックが少なくなるはずです。

少し面倒なのは、ext4ファイルシステムがすべてのファイルにユーザーIDを必要とすることです。このユーザーIDは、ファイルシステムext4がクライアントにローカルにマウントされたときにアクセス許可を計算するために使用されます。私の場合は、ローカルユーザーIDを特定の番号に変更することを選択しました。全て同期元のクライアント。別の方法としては、ext4uid 0 のファイルシステムにファイルを保存し、非ルート uid でファイルシステムbindfsをマウントする方法があります。ext4

関連情報