Verschlüsseltes Backup in der Cloud


Speicherplatz in der Cloud wird immer günstiger und viele Provider bieten außerdem über rsync und andere Werkzeuge komfortable Möglichkeiten zur Verwaltung von größeren Datenmengen an. Damit eignen sich Online-Speicher sehr gut als Ablageort für das Backup von wichtigen Daten und bieten darüber hinaus entscheidende Vorteile gegenüber einer Sicherung auf lokalen Festplatten. Auch wenn mit hohen Sicherheitsstandards geworben wird, das Thema Sicherheit sollte trotzdem nicht gänzlich aus der Hand gegeben werden. Ich sichere nur AES256-verschlüsselte Daten in der Cloud ab und verwende ein Skript, das ich mir hierzu zusammengestrickt habe.

Über die Zeit hinweg haben sich auch bei mir auf verschiedenen Datenträgern mehrere Gigabytes an Daten gesammelt, die für mich einen hohen immateriellen Wert haben. So habe ich auch irgendwann angefangen, diese Daten mehr oder weniger regelmäßig zu sichern. Da ich mich auch vor Datenverlust durch einen Elementarschaden oder Einbruch schützen wollte, habe ich meine Daten auf mehreren Backup-Festplatten gesichert, um diese jeweils an verschiedenen Orten aufzubewahren.

Diese Vorgehensweise hat sich aber nicht wirklich bewährt, da ich nicht diszipliniert genug meine Daten zyklisch auf verschiedene Festplatten gesichert habe. Im Ergebnis sind fast alle Backups auf einer Platte gelandet, da die anderen Platten eben immer woanders lagen, als ich mal wieder Zeit hatte, um eine Sicherung durchzuführen.

Eher zufällig bin ich dann auf ein relativ günstiges Angebot eines Providers für Online-Speicher gestoßen. So war bei mir auch schnell die Idee da, dass ich meine Daten doch in der schönen tollen Cloud sichern könnte. Damit wäre ich vor Datenverlust durch einen Elementarschaden oder Einbruch geschützt und hätte immer die aktuellste Sicherung parat. Da mittlerweile das Internet immer und überall verfügbar ist, war für mich der Zugang über das Netz auch kein echter Nachteil.

Da ich aber von Natur aus paranoid bin, haben mir die Versprechungen des Anbieters hinsichtlich Sicherheit nicht ausgereicht. So habe ich mir dann Gedanken gemacht, wie ich meine Daten verschlüsselt in der Cloud sichern könnte. Das Ergebnis ist das bash-Skript unten.

Haftungsausschluss: Ich übernehme keinerlei Gewähr für die Aktualität, Korrektheit, Vollständigkeit oder Qualität des Skripts und der bereitgestellten Informationen.

#!/bin/bash

DATADIR=/media/user/data
CLOUDDIR=/media/user/clouddir/offline

p=$(gpg -d backup.dat)
[ $? -ne 0 ] && exit

find "$DATADIR" -type f -printf "%p %Tx %TT %s\n" > files

sort -o files files
join -t $'\t' -v 2 index files > delta

d=$(date +%y%m%d)
n=2
while read line
do
	i=$((1000000*d+n))
	t="$CLOUDDIR/$i"
	s=$(echo "$line" | sed 's/ [^ ]* [^ ]* [^ ]*$//')

	echo "$s"
	printf $p | gpg -v --symmetric --cipher-algo AES256 --compress-algo none --batch -o "$t" --passphrase-fd 0 "$s"
	[ $? -ne 0 ] && exit
	echo -e "$line\t$i" >> index
	((n++))
done < delta &> backup.log

sort -o index index
printf $p | gpg --symmetric --cipher-algo AES256 --compress-algo none --batch -o "$CLOUDDIR/$d"000000 --passphrase-fd 0 index
printf $p | gpg --symmetric --cipher-algo AES256 --compress-algo none --batch -o "$CLOUDDIR/$d"000001 --passphrase-fd 0 files

Zunächst werden in den Zeilen 3 und 4 die Verzeichnisse festlegen, in der sich die zu sichernden Daten befinden und in die die Sicherung erfolgen soll. Das Skript legt die Sicherungen nicht direkt in der Cloud ab, sondern in einem Verzeichnis. Die verschlüsselten Dateien können dann z.B. über ftp oder rsync irgendwo abgelegt werden. Dadurch liegt das Backup nicht nur in der Cloud, sondern auch in einer Offline-Version auf einer lokalen Version. Quasi eine Sicherung der Sicherung.

Anschließend wird in den Zeilen 6 und 7 der AES-Schlüssel aus einer wiederum verschlüsselten Datei ausgelesen. Der AES-Schlüssel wird einmalig festgelegt und in einer Datei abgelegt. Der Schlüssel kann später nicht mehr geändert werden und sollte daher möglichst sicher sein, also im Fall von AES256 auch tatsächlich 256 bit haben (entspricht einer Länge von mindestens 43 Zeichen bei Verwendung von Buchstaben in Groß- und Kleinschreibung und Zahlen).

In Zeile 9 wird werden durch einen find-Befehl die zu sichernden Dateien in der Datei files aufgelistet. Eine Datei wird immer dann gesichert, wenn sie neu ist oder Dateiname, Zeitpunkt der letzten Änderung oder die Dateigröße sich geändert haben. Daher werden diese Attribute ebenfalls mit dem find-Befehl ausgelesen.

In der Zeile 12 erfolgt dann der tatsächlich Abgleich, ob eine Datei bereits gesichert worden ist oder nicht. Die grundlegende Idee dahinter ist, dass die Datei files mit der Datei index über den join-Befehl zusammengeführt werden. index umfasst hierbei alle Dateien, die bisher gesichert worden sind und listet zeilenweise für diese Dateien die jeweiligen Dateinamen in der Sicherung auf. Die Zusammenführung dieser beiden Dateien geschieht genau über ein Feld, das sich zusammensetzt aus Dateiname, Änderungszeitpunkt und Dateigröße. Wenn also eine Zeile in files nicht mit einer Zeile in index zusammenführen lässt, dann deutet das auf eine Datei hin, die gesichert werden muss.

Die Variablen d und n, die in den Zeilen 14 und 15 initialisiert werden, werden weiter unten im Skript bei der Erzeugung von Dateinamen benötigt. Die gesicherten Dateien bekommen einen numerischen Dateinamen, die sich aus dem Datum der Sicherung und einer fortlaufenden Zahl zusammensetzt. Ziel hierbei ist, dass im Backup weder die Dateinamen noch die Verzeichnisstruktur ableitbar sein.

Die eigentlich Verschlüsselung wird in den Zeilen 16 bis 27 durchgeführt. Hier wird zunächst der Dateiname der verschlüsselten Sicherung festgelegt (Zeilen 18-20) und die eigentliche Verschlüsselung über gpg durchgeführt (Zeile 23). In Zeile 25 wird zum Schluss noch die Datei index aktualisiert, da sich nun eine weitere Datei in der Sicherung befindet.

Zum Schluss werden in den Zeilen 30 und 31 die Dateien index und files gesichert, da ohne diese Dateien eine Zuordnung zwischen Originaldatei und Sicherung nicht möglich ist. Im Sicherungsverzeichnis können die beiden Dateien aber schnell identifiziert werden, da sie immer die laufende Nummer 000000 und 000001 haben.

Wie ihr sicherlich bemerkt habt, werden keine Dateien in der Sicherung gelöscht, auch wenn die Originaldatei geändert oder gelöscht wurde. Somit befindet sich auch ältere Versionsstände einer Datei im Backup, was auch bewusst so gewollt war. Wenn ihr Dateien manuell im Sicherungsverzeichnis löschen solltet, müsst auch auch immer darauf achten, dass ihr das auch in der Datei index nachziehen müsst.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.