Mit verschlüsseltem Remote-Speicher synchronisieren

Mit verschlüsseltem Remote-Speicher synchronisieren

Ich versuche, einen Ordnerbaum zwischen mehreren Computern synchron zu halten. Derzeit verwende ich unisoneine Sterntopologie mit einem zentralen Remote-Server. Ich möchte, dass die Daten auf dem Server verschlüsselt werden, sodass der unisonBaum (einschließlich des .unisonOrdners) auf dem Server in einem Baum gespeichert wird encfs. Um eine Synchronisierung durchzuführen, führt jeder Client Folgendes aus:

  • mountet den Serverspeicher mitsshfs
  • mountet den encfsSpeicher sshfslokal
  • unisonwird zwischen der lokalen Kopie der Dokumente und der gemounteten Kopie durchgeführt .

Das Setup hat viele Vorteile:

  • Open-Source-Werkzeuge
  • skriptfähige Befehlszeilenlösung
  • sichere Kommunikation überssh
  • Privatsphäre auf dem Server, da der encfsOrdnerbaum dort nie entschlüsselt wird
  • Möglichkeit, Änderungen während der Synchronisierung zu vergleichen, da dies unisonüber Klartext läuft

Eine Sache, die nicht so gut funktioniert, ist die Geschwindigkeit der Synchronisierung. Da der encfsOrdner vom Server auf dem Client gemountet ist, stat()muss jeder Aufruf des Clients sshan den Server weitergeleitet werden. Der Dokumentenbaum enthält bereits Tausende von Dateien, und eine unisonSynchronisierung muss mindestens einen stat()Aufruf für jede Datei durchführen (um Änderungen am im Ordner gespeicherten Status auszuschließen .unison). Gibt es eine schnellere Alternative, die die oben aufgeführten Vorteile beibehält?

Hinweis: Wenn ich die letzte Bedingung entfernen würde, könnte ich unisonüber Cyphertext laufen und den encfsBaum nur lokal mounten. Dann unisonwürde es lokal auf dem Client und auf dem Server laufen, sodass stat()die Aufrufe schnell wären. Aber es ist schön, die Option zu haben, zumindest zu sehen, welche Dateien synchronisiert werden; mit unisonüber encfsCyphertext würden die Dateinamen verschlüsselt.

Ich verstehe, dass man zur Lösung dieses Problems während der Synchronisierung Dateimetadaten effizient vom Server zum Client übertragen muss. Ich frage mich, ob es eine Möglichkeit gibt (d. h. eine Kombination vorhandener Tools), um beispielsweise die Metadaten an einem Ort zu speichern, sodass sie alle durch Senden nur eines (oder weniger) Datenblocks übertragen werden, anstatt Tausende von Blöcken zu senden (was bei der Anrufweiterleitung der stat()Fall ist).

encfsWas wäre, wenn ich beispielsweise eine ext4Over- Partition ersetzen würde dm-crypt, die in einer großen Datei auf dem Server gespeichert und über losetupOver auf dem Client gemountet ist sshfs? Würde das ext4Dateisystem die Dateimetadaten zusammenhalten, sodass sie durch Senden von nur wenigen Blöcken übertragen werden? Würde es sshfswissen, dass bei einem Update nur wenige Blöcke gesendet werden müssen, anstatt die gesamte verschlüsselte Datei neu zu schreiben?

Antwort1

Ich hatte Erfolg mit ext4over luksover sshfs. Ich finde, dass das Ausführen unisonauf einem Mount dieses Typs viel, viel schneller ist als over encfsover sshfs. Es muss also sein, dass diese Tausenden von stat()Strukturen irgendwie im ext4FS gebündelt sind, sodass sie während einer Synchronisierung weniger Netzwerkverkehr erfordern.

Etwas nervig ist, dass das ext4Dateisystem für jede Datei eine Benutzer-ID benötigt und diese Benutzer-ID wird für die Berechnung der Zugriffsberechtigungen verwendet, wenn das ext4Dateisystem lokal auf einem Client gemountet ist. In meinem Fall habe ich mich entschieden, meine lokale Benutzer-ID in eine bestimmte Nummer zu ändern.alledie Clients, von denen ich synchronisiere. Die Alternative wäre, die Dateien im ext4FS mit UID 0 zu speichern und dann bindfsdas ext4FS mit einer Nicht-Root-UID zu mounten.

verwandte Informationen