Backup mit GnuPG verschlüsseln

2. Januar 2016

und mit duplicity und horcrux zu Strato HiDrive legen unter OSX

Timing
Voraussetzungen
GPG- & SSH-Schlüssel
Installation Homebrew & Duplicity
Horcrux installieren & einrichten
Erstes Backup
Test des Backups
Aufräumen

Warum der Aufwand?

Lange habe ich gewartet, aber nun gibt’s endlich einen Cloud-Speicher, der meinen Anforderungen genügt:

  • bezahlbar
  • Server stehen in Deutschland
  • Zugriff via SSH und/oder SSL

Bei mir ist es Strato Hidrive geworden (die Anleitung sollte aber mit allen anderen, z.B. Amazon S3 usw. auch klappen). Das kostet prinzipiell nen 10er pro Monat. Gut, als ich es dann gekauft hatte, kamen natürlich noch fünf Euro pro Monat drauf – für exotisches rsync über SSH. Sei’s drum: 180€ für ein Jahr Offsite-Backup ist’s mir wert.

Folgendes soll erreicht werden: Die Daten werden lokal mit gpg verschlüsselt und mit rsync über SSH auf dem Speicher abgelegt. Ganz einfach. Eigentlich wollte ich duply benutzen. Als ich es eingerichtet hatte, fiel mir auf das es nur ein Backup benutzen kann.

Klar, denkt man sich, ich brauch ja auch nur ein Backup wenn alles verbrannt ist. Ganz so simpel ist es leider doch nicht; zum Vergleich:

Duply

Ein Ordner oder Volume wird benutzt, diverse Ordner oder Dateien werden ausgeschlossen, alles übrige wird gesichert. Soweit, sogut. Aber: Hat man mehr als einen Rechner, ein NAS und ein paar Netzwerk-Shares, wird es schnell unübersichtlich. Ich dachte, ich nutze mehrere Instanzen von duply parallel und umgehe damit die Beschränkung – und genau das geht nicht.
Wie immer: erst gelernt, als es eingerichtet war. Geholfen haben mir dabei diese zwei Artikel:
http://privatstrand.dirkschmidtke.de/2013/09/20/verschluesselte-backups-mit-duply-auf-einen-strato-hidrive-oder-anderswohin/
http://www.kuketz-blog.de/automatische-online-backups-mit-duplicity-auf-mac-os-x/

Horcrux

Tut das Gleiche (beides sind nur Shellskripte um duplicity bedienbarer zum machen), allerdings kann Horcrux mehrere Backups (= zu sichernde Ordner) verwalten. Ich habe mehrere Shares, deren Inhalt sich unterschiedlich oft ändert; manche monatlich, andere wöchentlich oder täglich. Diesen Bestand mit einem Skript zu sichern, würde bedeuten, ca. 0,7 TB Daten auf Änderungen zu durchsuchen – und das täglich.

Geht nicht. Horcrux ist leider nicht so ausführlich dokumentiert wie ich mir das gewünscht hätte, ich hab mir die Infos aus drei bis fünf Dokus zusammengesucht. Und weil dass genervt hat dieser Eintrag.

Timing zur Entscheidungshilfe

Egal was man glaubt, der Upload dauert. GPG scheint auch nicht für eine massive Mehrkernunterstützung gemacht zu sein, der erste Kern war immer unter 100% Last, die anderen haben zwischen 15–45% rumgedümpelt.

Mein System

  • 8–9 Mbit/Sekunde Upstream lt. Vodafone-Speedtest
  • einen 4096er GPG-Schlüssel
  • Macbook Pro unter 10.10.5 mit 16 GB RAM und einem 2,8 GHz i/-Intel-Prozessor

Dauer

Der erste Upload, also vollständig, hat gut 17 Minuten je GB gebraucht. Die Folge-Backups ohne Änderungen haben bei 300 GB Datenbestand (meist kleine Files) 233 Minuten, also 0,7 Minuten je GB, gedauert. Das schwankt aber sehr sehr stark. Ich habe mich nicht intensiv um das Eltern-Kind-Schema (also das Verhältnis von Voll- zu Inkrementellbackup)  von Horcrux gekümmert. Aber generell sollte das eher über Nacht laufen.

Vorraussetzungen

  • SSH-Schlüssel
  • funktionierende GPG-Infrastruktur
  • Homebrew für duplicity
  • horcrux
  • Onlinespeicher

Vorbereitungen

Wichtig: Ich hab das auf mehreren Rechnern mit verschiedenen Versionen von OS X probiert: 10.4 (Duplicity geht erst ab 10.6), 10.6.8 (hab Duplicity nicht kompiliert bekommen), 10.7 (Drama bis Duplicity lief) und 10.10 (ging reibungslos). Hilfreich ist es, wenn man das Terminal (liegt unter Programme/Dienstprogramme) schon mal auf hatte. Und Kompilieren wollen wir später auch. Um spätere Problem mit der Pinentry-Socket zu vermeiden, zuerst GPG installieren. Hat natürlich jeder schon lang erledigt, hat uns Herr Snowden ja bereits letztes Jahr empfohlen.

Falls nicht: hier herunterladen und einfach installieren. Als Bonus kann (und sollte!) man damit auch seine Mails verschlüsseln. Dann generieren wir die Schlüssel. Ich hab einen neuen gemacht, man kann natürlich auch einen bereits vorhandenen nehmen. Und: ich hab das ziemlich ausführlich geschrieben damit auch Terminal-N00bs zurechtkommen. Keine Angst – wenn ihr von oben nach unten durchgeht, klappts bestimmt.

GPG

Schlüssel generieren: Terminal öffnen, Nachstehendes einkopieren & Enter drücken:

gpg –gen-key [ENTER]

Empfehlung: 4096-Bit, kein Ablaufdatum, wahnsinnig lange Passphrase

Kleine Warnung: Wenn ihr den Schlüssel verliert, die Passphrase vergesst oder der Schlüssel abläuft, habt ihr defacto keine Backup mehr, weil ihr es nicht entschlüsseln könnt. Also noch Abschluss der ganzen Aktion alles (SSH-Schlüssel, GPG-Schlüssel, Horcrux-Config & Strato-Zugangsdaten) auf 2 USB-Sticks und diese irgendwo ausserhalb der Wohnung hinterlegen. Vorzugsweise mit einem ANDEREN Schlüssel verschlüsselt.

Die Schlüssel liegen dann im Ordner .gnupg im Userordner, der Punkt vorne sorgt für Unsichtbarkeit!

Also im Terminal:

cd $HOME/.gnupg [ENTER]
ls -al [ENTER]

Da liegen jetzt unsere 2 Schlüsseldateien. Wenn man besonders paranoid ist, kann man die auf nem USB-Stick parken und via Symlink mit dem .gnupg-Ordner verlinken. Dann sind sie nur auf dem Rechner vorhanden wenn der USB-Stick drinsteckt. Und alles ist unentschlüsselbar wenn man ihn verliert oder kaputtmacht.

Jetzt noch die Config für den GPG-Agent basteln. Der speichert im Hintergrund unsere Passphrase und gibts sie weiter wenn sie gebraucht wird.

Also Terminal auf:

cd $HOME/.gnupg [ENTER]
vi gpg-agent.conf [ENTER]

i auf der Tastatur drücken und das einkopieren:

pinentry-program /usr/local/MacGPG2/libexec/pinentry-mac.app/Contents/MacOS/pinentry-mac
default-cache-ttl 259200
max-cache-ttl 259200

Das 259200 ist wirklich wirklich böse: es bedeutet, dass 72 Stunden nach Eingabe der Passphrase, jeder am Rechner mit eurem Schlüssel tun und lassen kann was er will. Ohne die Passphrase erneut einzugeben! Am besten nach Einrichten oder Abschluss des Backups wieder auf einen moderaten Wert (z.B. 300) ändern. Leider wäre die Alternative in 5 Minuten-Abständen das Passphrase einzutippen. Und bei mir braucht das Backup ca. 20 Min pro Gigabyte und der Ordner hatte 200 GB. Wer einen besseren Vorschlag dafür hat: bitte bitte ab in die Kommentare damit.

Jetzt brauchen wir noch die

ID

des Schlüssels:

Terminal:

gpg –list-keys [ENTER]

Das wird dann sowas angezeigt:
pub 4096/7F9106F4 2011-02-06

Das bedeutet öffentlicher Schlüssel/ID Ablaufdatum
Die ID brauchen wir später. So. Damit hätten wir schon das erste Schlüsselpaar.

SSH Keys

Terminal:

ssh-keygen [ENTER]

Dann einfach mit [ENTER] durchdrücken, wir wollen kein Passwort für die Schlüssel. Wenns fertig ist, liegt – ähnlich zu GPG – im Userordner ein unsichtbarer Ordner .ssh mit den Schlüsseln. Dahin gehen und den Pub-Key auf den Schreibtisch kopieren:

Terminal:

cd $HOME/.ssh [ENTER]
cp *.pub $HOME/Desktop/ [ENTER]

Je nachdem ob ihr DSA- oder RSA-Schlüssel gemacht habt, liegt nun auf eurem Desktop eine Datei id_dsa.pub oder id_rsa.pub. Die laden wir gleich mal bei HiDrive hoch.

Dort anmelden, auf Einstellungen oben links klicken, dann Kontenverwaltung und auf OpenSSH-Schlüssel. Dort dann die pub-Datei auf dem Schreibtisch hochladen. Bei der Gelegenheit dann gleich unter Einstellungen > Kontenverwaltung > Admin- und Protokollrechte alles abhaken. Ausser »rsync über ssh« und »Nur verschlüsselte Verbindungen«. Unten rechts Speichern nicht vergessen.

Zeit zum Testen

Terminal

rsync –delete -avze ssh /OrdnerZumHochladen username@rsync.hidrive.strato.com:/users/username/Ordner [ENTER]

Dann kommt noch eine Abfrage ob der Fingerabdruck des Servers recht ist (sollte man immer vergleichen vor dem Annehmen) und dann startet der Upload. Fein, die erste Hürde ist erledigt: wir haben 2 Paar Schlüssel und können mit rsync über SSH aufs Hidrive.

Installation

Vorneweg: bei euch klappts bestimmt ganz einfach, auf Anhieb und ohne Umwege. Falls nicht, einfach in den Comments posten oder Tante Google fragen.

Kompilierspass einrichten:

Z.B. Xcode installieren, gibt es im Appstore für umme. Wenn es euch so geht wie mir, dann ärgert euch der 4,4 GB-Download wahnsinnig. Wir wollen nur den Compiler und der ist 14,2 Kb groß! Deswegen besser hier die fertige Version installieren: https://github.com/kennethreitz/osx-gcc-installer
Oder X-Code installieren, öffen, AGBs akzeptieren. Dann:

Homebrew installieren

Terminal:

ruby -e „$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)“ [ENTER]

Wenn das geklappt hat, direkt duplicity hinterher:

brew install duply [ENTER]

Falls es Probleme gibt: bei mir hat es geholfen erst duply (brew install duply) bis zur ersten Fehlermeldung, dann duplicity zu installieren. Wenn irgendwas angemault wird, installiert man’s halt. Aber das ist der einzig nervige Teil der ganzen Aktion, versprochen! Duply benutzen wir später nicht, aber das installiert duplicity mit allem was so dazu gehört.

Wenn duply dann läuft, am besten kurz testen im Terminal.
Wenn so aussieht, sind wir glücklich.

So sieht die Backup-Lösung duply aus wenn alles geklappt hat.

Horcrux installieren & einrichten

Zuerst runterladen: http://chrispoole.com/project/general/horcrux/

Dann in den Userordner packen:

Terminal:

cp $HOME/Downloads/horcrux $HOME/horcrux.sh [ENTER]

Ausführbar machen

cd $HOME [ENTER]
chmod 755 horcrux.sh [ENTER]

Das erste Mal aufrufen (wir bleiben jetzt erstmal im Terminal)

./horcrux.sh [ENTER]

Jetzt ist eine leere, neue Backup-Config UND die generelle Horcrux-Config geschrieben.

horcrux.conf

Liegt im Ordner Username/.horcrux/horcrux.conf. Wir bearbeiten sie mit vi.

Terminal:

vi $HOME/.horcrux/horcrux.conf [ENTER]

Sie sieht bei mir so aus:

source=“/Volumes/“ # Die Basis des Quellordners die sich nicht mer verändert (!)
encrypt_key=31A6FCE8 #Die ID des GPG-Keys von ganz oben
sign_key=‘-‚ # Sollen die Pakete zusätzlich unterschreiben werden?
use_agent=true # Den Passphrae-Agent zur Weitergabe des Kennworts nutzen
remove_n=1 # Ein vollständiges Vollbackup vorhalten
verbosity=9 # Logs all the file changes (see duplicity man page)
vol_size=250 # die Größe der Päckchen die hochgeladen werden in MB
full_if_old=30 # Alle 30 Tage ein Vollbackup machen, dazwischen inkrementell
# backup if older than 360 days
backup_basename=’/backup‘ # Directory name for local backups (i.e., destination
# /Volumes/my_drive/backup/ or /media/my_drive/backup/)
dup_params=“ # Parameters to pass to Duplicity

Jedes Backup besteht aus 2 Dateien: Backupname-config und Backupname-exclude

In der Config sind die Zugangsdaten zum Ablageordner in Hidrive und die Zugangsdaten, die -exclude regelt welche Daten gesichert werden.

Beispiele von mir:

Ich habe einen Share »Musik«, der liegt extern. Wenn er gemountet ist, liegt er im System unter dem Pfad
/Volumes/Musik

Kleiner Exkurs: Wenn ein anderer User den gleichen Share mountet, obwohl er schon da ist, wird er unter /Volumes/Sharename-1 eingehängt. Und weil horcrux absolute Pfade nutzt, wird dann nichts mehr gefunden. Also im Zweifel mit dem Befehl mount nachschauen ob alles passt.

Aber zurück zum Thema: meine Config-Dateien sehen also so aus:

Musik-config:
destination_path=“rsync://domain-XXXX@rsync.hidrive.strato.com/users/domain-XXXX/Backup/Musik/“

Also landete bei Hidrive alles im Ordner /Backup/Musik (die muss man vorher anlegen)

Musik-exclude:
+ /Volumes/Musik/
**/*

D.h. alles im Ordner /Volumes/Musik/ wird gesichert alles andere ausgeschlossen.
+ bedeutet sichern, kein Vorzeichen meint nicht sichern

Das erste Backup

Terminal:

cd $HOME [ENTER]
./horcrux.sh auto Backupname (in meinen Beispiel von oben ./horcrux.sh auto Musik) [ENTER]

Jetzt wird die Passphrase des GPG-Schlüssels abgefragt und man kann sich sehr (sehr sehr) lange zurücklehnen, während das Backup läuft. Prinzipiell kann man das jetzt noch über den launchd automatisieren so dass das Backup regelmäßig zu festen Zeiten läuft, aber für meinen Anwendungsfall brauche ich das nicht. Ich mach das »zu Fuß» wenn sich der Bestand signifikant geändert hat.

Wiederherstellen des Backups

Genauso wichtig wie das Sichern der Daten ist die Testung ob sie sich tatsächlich aus dem Backup wiederherstellen lassen.

Leeren Ordner anlegen:

Terminal:

mkdir $HOME/Desktop/Wiederherstellung [ENTER]
./horcrux.sh restore Backupname (in meinen Beispiel von oben Musik) $HOME/Desktop/Wiederherstellung [ENTER]

Das spielt das gesamte Backup in den Ordner Wiederherstellung auf dem Schreibtisch. Man kann auch noch gezielt Zeiträume mit dem Parametern -t auswählen:

./horcrux.sh -t 2W restore Backupname $HOME/Desktop/Wiederherstellung [ENTER]

Das wäre z.B. die Wiederherstellung des Datenbestandes vor 2 Wochen.

Ähnlich lassen sich einzelne Dateien zurückholen, allerdings muss hier der Dateiname relativ zum Quellordner in der horcrux.conf (bei mir /Volumes) und der Dateiname in den geschrieben werden soll angegeben werden. Um bei meinem Beispiel zu bleiben:

./horcrux.sh -f Musik/test.txt restore Musik$HOME/Desktop/Wiederherstellung/test-return.txt [ENTER]

stellt die Datei test.txt im Ordner Musik wieder her und packt sie in den Ordner Wiederherstellung unter dem Namen test-return.txt

Dann gibts noch diverse Parameter zum Aufräumen & Checken das Backups, aber das guck man am besten in der Doku bei Chris nach. Und damit sind wir fertig. Nur noch ein bisschen

Aufräumen

Wie oben angesprochen, kommt man an die Daten nicht mehr ran, wenn die Schlüssel fehlen. Also werden die noch auf nem USB-Stick gesichert. Zusammen mit den Horcrux-Files. Ich gehe im Beispiel davon aus das der USBstick auch unter diesem Namen eingehängt wird.

Terminal:

cp -r $HOME/.ssh /Volumes/USBStick [ENTER]
cp -r $HOME/.gnupg /Volumes/USBStick [ENTER]
cp -r $HOME/.horcrux /Volumes/USBStick [ENTER]

Die Strato-Zugangsdaten noch dazu packen, überlegen obs mans mit einem ANDEREN Schlüssel verschlüsseln will und fertig. Dann den USBstick sicher verwahren 😉

Das war’s. Danke fürs Durchhalten und viel Erfolg. Gerne nehme ich Ergänzungen, Verbesserungen oder Fragen in den Kommentaren entgegen.