Automatische Online-Backups mit duplicity auf Mac OS X

1. duplicity: Online-Backups – aber sicher!duplicity

duplicity ist ein Tool welches ursprünglich für Linux geschrieben wurde. Es kann durchaus mit Time Machine mithalten. Im Gegensatz zu Time Machine ist dies allerdings keine »Plug&Play Lösung«. Etwas Konsolen-Kenntnisse solltet ihr durchaus mitbringen.
Backups von Daten sind nicht nur sinnvoll, sondern heutzutage ein MUSS! Meistens werden diese auf externen USB-Festplatten gespeichert – jedenfalls im Privatbereich. Aber duplicity kann mehr. Backups in der Amazon S3 Cloud oder per WebDAV, SSH oder einem anderen Protokoll auf dem privaten Server / Firmenserver. Das Backup verläuft dabei vollkommen autonom und wird bereits vor der Übertragung verschlüsselt. Was kann duplicity jetzt genau? Eine kurze Zusammenfassung:

  • Vollständige / inkrementelle Backups
  • Arbeitet automatisch im Hintergrund
  • Archivierung im tar-Format
  • gzip-Komprimierung
  • GPG-Verschlüsselung der Daten (und zwar vor der Übertragung!)
  • rsync-Algorithmus
  • Bandbreiteneffizient – es stehen noch genug Upload-Ressourcen zur Verfügung
  • Serverupload zu verschiedenen Diensten (local, rsync, SCP/SSH, FTP, WebDAV, IMAP, Amazon S3 Cloud, etc.)

Update

12.08.2014: Das Tutorial eignet sich ebenfalls für Mac OS X Mountain Lion, Mavericks und Yosemite.

2. Ok überzeugt – was benötige ich dafür?

  • Mac OS X Lion (oder eine neuere Version). Eventuell funktioniert die beschriebene Variante auch auf älteren Versionen.
  • xCode
  • Homebrew
  • duplicity

Nach Abschluss des Tutorials seid ihr in der Lage wichtige Daten von eurem Mac-Rechner auf einem Server zu sichern. Die Übertragung wird verschlüsselt mittels SSH stattfinden. Mit kleinen Anpassungen ist ein Backup in die Amazon S3 Cloud ebenfalls möglich. Hier sind die Highlights von duplicity nochmals zusammengefasst:

  • Das Backup wird vollkommen automatisch im Hintergrund stattfinden
  • Eure Daten werden vor der Übertragung verschlüsselt
  • Euer Upload wird bei der Übertragung res­sour­cen­scho­nend genutzt

3. Installation der benötigen Software

  • Zunächst wird xCode aus dem AppStore geladen und installiert. xCode ist eine Vorraussetzung für Homebrew.
  • Als nächstes wird Homebrew heruntergeladen und ebenfalls installiert.
  • Der letzte Schritt ist die eigentliche Installation von duplicity. Dazu wird ein Terminal gestartet und folgendes eingegeben:
brew install duply

Damit sind alle Vorraussetzungen für eine Konfiguration erfüllt. Homebrew installiert die notwendigen Paketabhängigkeiten für duplicity automatisch. Im der folgenden Beschreibung verwende ich das Wort duply. Duply ist ein Frontend für duplicity und erleichtert dessen Handhabung.

4. GPG-Schlüssel erstellen

Damit das Backup später verschlüsselt gespeichert wird, ist die Erstellung von GPG-Schlüsseln notwendig. Wir erstellen ein Schlüsselpaar (privater und öffentlicher Schlüssel). Über das Terminal werden neue Schlüssel generiert:

gpg --gen-key

Das sieht dann so aus:
Duply

Hinweis

  • Bitte wählt ein sicheres Passwort, dass mindestens aus 12 Zeichen mit Sonderzeichen, Zahlen und Groß-Kleinschreibung besteht.
  • Bei der Schlüssel-Generierung habe ich gewählt, dass der Schlüssel nie verfällt.
  • Die Schlüsselpaare selbst sollten gut aufbewahrt werden (USB-Stick und in den Schrank damit). Verliert ihr den privaten Schlüssel ist ein Zugriff auf das Backup nicht mehr möglich.
  • Die Schlüssellänge sollte ausreichend groß gewählt sein. Ohne jetzt in die Theorie abschweifen zu wollen empfehle ich im Zusammenhang dem RSA-Verfahren mindestens 2048 Bit (besser 4096 Bit) als Schlüssellänge. Pauschal lässt sich sagen: Je kürzer der Schlüssel, desto leichter kann er erraten werden.

5. duply konfigurieren

Zunächst erstellen wir eine Konfigurationsdatei:

duply my_backup create

my_backup ersetzt ihr mit dem gewünschten Namen: zb. macbook
Die Konfiguration ist jetzt unter dem Home-Verzeichnis ~/.duply/my_backup/conf abgelegt.

Für den weiteren Verlauf benutze ich für das Home-Verzeichnis die Bezeichnung »Rechner« und als duply Konfigurationsnamen »macbook«. Wenn ihr die unten dargestellten Befehle ausführen wollt, dann ersetzt die beiden Platzhalter immer mit eurem Home-Verzeichnis und dem gewählten Konfigurationsnamen für duply.

Das Verzeichnis ist versteckt. Wir können die Datei dennoch über das Terminal anschauen:

cat /Users/Rechner/.duply/macbook/conf

Nicht erschrecken. Hier existieren viele Einstellungsmöglichkeiten. Auf die wirklich benötigten werde ich näher eingehen. In den folgenden Schritte benutze ich den Shell-Editor nano.

Öffnen der Konfigurationsdatei mit nano:

sudo nano /Users/Rechner/.duply/macbook/conf

5.1 Schlüssel Konfiguration

Damit die Verschlüsselung funktioniert muss der Fingerprint des zuvor erstellten Schlüssels und das Passwort hinterlegt werden.
Wichtig sind folgende Einstellungen:

GPG_KEY='_KEY_ID_'
GPG_PW='_GPG_PASSWORD_'
#GPG_KEYS_ENC='<pubkey1>,<pubkey2>,...'
#GPG_KEY_SIGN='<prvkey>'

Damit wir die benötigten Informationen erhalten öffnen wir ein zweites Terminal und geben dort folgendes ein:

gpg --list-keys

Der Output sollte dann folgendermaßen aussehen:
Key

Den Fingerprint (Hier: 1EE9A69D) tragt ihr nun in die duply Konfiguration ein:

GPG_KEY=’1EE9A69D′
#GPG_KEYS_ENC=’1EE9A69D′
#GPG_KEY_SIGN=’1EE9A69D′

Die Rauten bitte entfernen, ansonsten wird der Befehl nicht ausgeführt. Jetzt noch das Passwort eintragen mit dem die Schlüssel erzeugt wurden:

GPG_PW='_GPG_PASSWORD_'

5.2 Ziel – Wo wird das Backup abgelegt?

In meinem Beispiel werde ich das Backup auf einen Linux-Server beschreiben. Dieser Server wird mittels SSH angesprochen.

Dazu müssen wir folgende Zeilen in der Konfiguration anpassen:

TARGET='scheme://user[:password]@host[:port]/[/]path'

Die Zeile wird folgendermaßen angepasst:

TARGET='ssh://user:password@127.0.0.1:22'

Ihr könnt euch auch auf euren Amazon S3 Account einloggen und die Daten dort ablegen. Auszug aus der Konfiguration:

for the s3 user/password are AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY
s3://[user:password]@host/bucket_name[/prefix]
s3+http://[user:password]@bucket_name[/prefix]

5.3 Quelle – Was soll gesichert werden?

Ihr wollt sicherlich nicht all eure Daten von der Festplatte sichern. Immerhin handelt es sich hier um ein Online-Backup auf einem Server oder der Amazon S3 Cloud. Die Bandbreite bzw. der Upload wird nicht ausreichen, um hunderte von Gigabyte zu übertragen. Daher sollten nur die »wichtigsten« Daten gesichert werden.

Dazu müssen wir folgende Zeilen in der Konfiguration anpassen:

SOURCE='/path/of/source'

Die Zeile wird folgendermaßen angepasst:

SOURCE='/Users/Rechner'

Hiermit wird das komplette Home-Verzeichnis gespeichert. Da wir das nicht möchten, müssen wir Dateien und Ordner ausschließen. Dazu erstellen wir im duply Konfigurationsordner eine neue Datei:

sudo nano /Users/Rechner/.duply/macbook/exclude

Der Inhalt könnte so aussehen:
Exclude

Hierbei wird folgendermaßen gesichert:
ALLE Dateien aus dem Ordner Computer, außer:

  • /Computer/OSInstall
  • /Computer/VirtualBox

Documents und Pictures werden ohne Ausnahme komplett gesichert. Die letzte Zeile mit – ** schließt ansonsten alle weiteren Daten im Home-Verzeichnis aus. Damit unsere exclude Datei von duply auch gelesen werden kann, werden die Berechtigungen noch korrekt gesetzt:

sudo chown Rechner:staff /Users/Rechner/.duply/macbook/exclude
sudo chmod 600 /Users/Rechner/.duply/macbook/exclude6. Backup starten

Nach der Konfiguration kann das Backup über das Terminal initiiert werden. Das Backup wird vor der Übertragung vollständig verschlüsselt und komprimiert. Backup starten:

duply macbook backup

Nachdem der Backup-Prozess abgeschlossen wurde, könnt ihr euch die Dateien anschauen, die sich im Backup befinden:

duply macbook list

Mit dem Status-Befehl könnt ihr kontrollieren wie viele Volumes angelegt wurden und ob das Backup vollständig durchgeführt wurde:

duply macbook status

Hinweis

Ihr solltet euer Backup in jedem Fall prüfen / verifizieren! Also unbedingt Punkt 7 ausprobieren.

7. Backup wiederherstellen

Hier drei Beispiele zur Wiederherstellung eines Backups.

Komplette Wiederherstellung in den Ordner ~/Restore:

duply macbook restore /Users/Rechner/Restore

Wiederherstellung der Datei example.jpg in den Ordner /tmp:

duply macbook fetch /Users/Rechner/Pictures/example.jpg /tmp/
example.jpg

Wiederherstellung der Datei example.jpg von vor 4 Tagen in den Ordner /tmp:

duply macbook fetch /Users/Rechner/Pictures/example.jpg /tmp/
example.jpg 4D

8. Zeitgesteuerte Backups mit launchd

Falls ihr noch einen Schritt weitergehen wollt, könnt ihr die Backups auch zeitgesteuert durchführen lassen. Hierzu eignet sich launchd, welches seit Mac OS X v10.4 ein fester Bestandteil des Systems darstellt. Das ist ein Framework zum Starten, Verwalten und Beenden von Daemons, Programmen und Shell-Skripten.

8.1 Erstellen des Backup-Skripts

Ihr könnt das Backup-Skript an einem beliebigen Ort in eurem Home-Verzeichnis ablegen.

sudo nano /Users/Rechner/duply.sh
#!/bin/bash
#####################
# duply backup script
# 19-12-2011 by Mike
#####################
# path export
export PATH='/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin'
# check if duplicity is running
if lsof | grep /usr/local/Cellar/duply
then
echo "===>>> duplicity already running <<<==="
else
echo "===>>> duplicity starting <<<==="
ulimit -n 1024
duply macbook backup
duply macbook purge --force
fi

Du kannst den Blog aktiv unterstützen!

Unabhängig. Kritisch. Informativ. Praxisnah. Verständlich.

Die Arbeit von kuketz-blog.de wird vollständig durch Spenden unserer Leserschaft finanziert. Sei Teil unserer Community und unterstütze unsere Arbeit mit einer Spende.

Mitmachen ➡

8.2 Einbinden des Skripts in launchd

Jetzt erstellen wir einen Agent der unser Skript in Intervallen aufruft. Der Wert 10800 steht hierbei für Sekunden. 10800 / 60 = 180 Minuten bzw. 3 Stunden. Der launchd Agent ruft also alle 3 Stunden das Skript auf bzw. immer nach einem Neustart des Systems.

sudo nano /Users/Rechner/Library/LaunchAgents/de.localhost.duply.
run.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "
http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist 
version="1.0">
<dict>
<key>Label</key>
<string>de.localhost.duply.run.plist</string>
<key>Program</key>
<string>/Users/Rechner/duply.sh</string>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>10800</integer>
</dict>
</plist>

9. duply Befehle

Duply bietet noch weitere Einstellungsmöglichkeiten. Drei davon möchte ich näher erläutern.

Default Einstellungen:

  • MAX_FULL_BACKUPS=1 – Ingesamt wird 1 komplettes Backup vorgehalten
  • MAX_FULLBKP_AGE=1M – Das Full Backup wird monatlich erneuert. Dazwischen werden lediglich inkrementelle Backups angelegt.
  • VOLSIZE=25 – Jede Archivdatei hat 25MB. Nach einem Abbruch bei beispielsweise 18MB für ein Archiv muss nicht das komplette Backup neu angestoßen werden, sondern lediglich der nicht übertragenen Chunk neu hochgeladen werden.

10. Komische Fehlermeldung / Bug

Solltet ihr beim Start des Backups auf folgende Fehlermeldung stoßen…

Max open files of 256 is too low, should be >= 1024.
Use ‚ulimit -n 1024‘ or higher to correct.

… könnt ihr das mit der Eingabe von:

ulimit -n 1024

korrigieren. Der Befehl ist bereits Teil des Backup-Skripts.

Über den Autor | Kuketz

Mike Kuketz

In meiner freiberuflichen Tätigkeit als Pentester / Sicherheitsforscher (Kuketz IT-Security) schlüpfe ich in die Rolle eines »Hackers« und suche nach Schwachstellen in IT-Systemen, Webanwendungen und Apps (Android, iOS). Des Weiteren bin ich Lehrbeauftragter für IT-Sicherheit an der Dualen Hochschule Karlsruhe, sensibilisiere Menschen in Workshops und Schulungen für Sicherheit und Datenschutz und bin unter anderem auch als Autor für die Computerzeitschrift c’t tätig.

Der Kuketz-Blog bzw. meine Person ist regelmäßig in den Medien (heise online, Spiegel Online, Süddeutsche Zeitung etc.) präsent.

Mehr Erfahren ➡

SpendeUnterstützen

Die Arbeit von kuketz-blog.de wird zu 100% durch Spenden unserer Leserinnen und Leser finanziert. Werde Teil dieser Community und unterstütze auch du unsere Arbeit mit deiner Spende.

Folge dem Blog

Wenn du über aktuelle Beiträge informiert werden möchtest, hast du verschiedene Möglichkeiten, dem Blog zu folgen:

Bleib aktuell ➡


Diskussion

13 Ergänzungen zu “Automatische Online-Backups mit duplicity auf Mac OS X”

  1. Comment Avatar Daniel Bor sagt:

    Hallo Herr Kuketz,

    auf der Suche nach einem Duplicity Tutorial für OS X Lion habe ich ihre tolle Anleitung gefunden:
    https://www.kuketz-blog.de/automatische-online-backups-mit-duplicity-auf-mac-os-x/

    Nachdem ich mich durch die einzelnen Schritte durchgearbeitet habe läuft das Backup nun wunderbar.
    Vielen Dank für die tolle Hilfestellung.

    Zum ausprobieren habe ich ein Test Backup erstellt und immer wieder neue Dateien hinzugefügt und gelöscht und hier hat Duplicity sehr stabil gearbeitet.
    Dann habe ich größere Testdateien angelegt und zum ausprobieren einige Bilder hinzugefügt. Irgendwann habe ich dann einen Fehler bei meinem Backup erhalten:

    »No orphaned or incomplete backup sets found.«

    Über jeden Tipp wäre ich Ihnen sehr dankbar.

    Vielen Dank im Voraus und Grüße aus Ötigheim
    Daniel

  2. Comment Avatar Mike Kuketz sagt:

    Hall Herr Bor,

    erstmal Danke für Ihr Feedback! :)

    Sie arbeiten auf einem Webdav. Haben sie mal probiert per Hand Dateien mit über 2,3 MB zu kopieren?
    Wenn das geht, haben Sie eventuell die Möglichkeit mittels SSH Protokoll zu sichern?

    Webdav ist immer etwas heikel. Egal ob auf einem Apache, nginx oder lighttpd Webserver. Oder was nutzen Sie?

    Ich persönlich tippe auf ein Problem mit dem Webdav. Serverseitig können Sie da einiges einstellen.

  3. Comment Avatar Daniel Bor sagt:

    Hallo Herr Kuketz,

    vielen Dank für die schnelle Rückmeldung!

    Dateien die größer als 2,3 MB sind kann ich ohne Probleme auf den WebDAV schieben, selbst Daten mit 200 MB und mehr.
    Der WebDAV (Apache) kann ich leider nicht konfigurieren, da dieser von einem Dienstleister zur Verfügung gestellt wird.

    Die Option mit SSH habe ich leider auch nicht :-(

    Zuvor habe ich den Backup-Client „Duplicati.com“ ausprobiert, das ein „Ableger“ von Duplicity ist.
    Damit lief das Backup ohne Probleme nur hat das Tool einige Darstellungsfehler wegen der Kombination aus dem Mono-Framework und dem Font-Rendering.

    Aktuell tippe ich eher auf einen WebDAV Bug in Duplicity, da man im Netz einige User mit dem gleichen Problem findet.
    https://niebegeg.net/post/32010111657/duplicity-backups-wiederherstellen/

    Ich werde mal das Netz durchstöbern, vielleicht finde ich noch einen Workaround,
    da es sonst keine Software für OS X gibt die nur halbwegs funktioniert.

    Trotzdem vielen Dank für ihre Unterstützung.

    Viele Grüße,
    Daniel

  4. Comment Avatar Pekka sagt:

    Vielen Dank für das gute Tutorial! Werde jetzt mit Duplicity spielen und testen, ob es tut, was ich brauche.

    Eine kleine Sache: bei `gpg — gen-key` und `gpg — list-keys` scheint ein Leerzeichen zuviel zu sein, es funktioniert für mich nur, wenn ich `gpg –gen-key` benutze.

  5. Comment Avatar Pekka sagt:

    Dieser Blogpost ist super, braucht aber noch einen EXTREM wichtigen Hinweis: UNBEDINGT nach dem ersten Backup eine Rücksicherung ausprobieren! Hat man nämlich bei der Schlüsselgenerierung etwas falsch gemacht – das scheint mir passiert zu sein – produziert man unbrauchbare Backups. Fällt einem das erst im Ernstfall auf, steht man im Regen.

  6. Comment Avatar Armin Groll sagt:

    Hallo Herr Kuketz,

    erstmal vielen tausend Dank für das Tutorial!
    Ich habe es soweit durchgearbeitet, jedoch kam erstmal eine Fehlermeldung beim Ausführen von duply meinprofil backup:

    — Start running command BKP at 19:48:24.000 —
    Traceback (most recent call last):
    File „/usr/local/bin/duplicity“, line 42, in
    from duplicity import log
    ImportError: No module named duplicity
    19:48:24.000 Task ‚BKP‘ failed with exit code ‚1‘.

    Ich konnte das heilen, indem ich noch folgende Schritte nach
    brew install duply

    ausgeführt habe:

    brew remove duplicity
    brew install python
    brew install duplicity

    die indirekte installation von duplicity durch die installation von duply scheint nicht zu funktionieren…

    Viele Grüße,

    Armin

  7. Comment Avatar Christoph sagt:

    Hallo,

    klasse Artikel! DANKE dafür.

    Haben Sie duply noch im Einsatz? Sind sie noch zu frieden? Ich beginne gerade mich mit dem Thema Offsite-Backup zu beschäftigen.

    Unklar ist mir, ob duplicity auch alle Filesystem Metadaten, die Mac-spezifisch sind speichert. Ich bin hier kein Fachmann, las aber von »Extended Attributes« oder »Ressource Forks«. Können Sie hier aus Erfahrung sprechen?

    Ansonsten habe ich mal das duply.sh Skript etwas getuned: mittels caffeinate wird der Mac während des Backups (hoffentlich) am schlafen gehindert. Ausserdem nutzt es das in Lion hinzugekommene Notfification-Center zum Anzeigen von Statusmeldungen. Da wäre noch Luft nach oben (z.B. Notification über Fehler – gerne auch per Email) – hat dazu noch jemand Ideen?

    ##########
    #!/bin/bash

    export PATH=’/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin‘

    # check if duplicity is running
    if lsof | grep /usr/local/Cellar/duply
    then
    osascript -e ‚display notification „Duply läuft bereits.“ with title „Duply Backup“‚
    else
    osascript -e ‚display notification „Starte Backup.“ with title „Duply Backup“‚
    ulimit -n 1024
    caffeinate duply macmini cleanup+backup+purge –force
    osascript -e ‚display notification „Backup abgeschlossen.“ with title „Duply Backup“‚

    fi
    ###########

  8. Comment Avatar Sebastian sagt:

    Vielen Danke für die tolle Anleitung,
    damit krieg ich mein Backup eindlich offsite.

    2 Fragen dazu: was macht das purge:
    duply macbook purge –force

    Und kann mir mal bitte das „1 Komplett-Backup wird vorgehalten“ »aufdröseln»?
    Beispiel: 100 GB Backup, 1x monatlich full, 1x wöchentlich inkrementell
    Das bedeutet dass auf dem Speicherplatz dafür 400 GB belegt sind, oder?
    Wenn man unterstellt das sich wirklich alles ändert und das inkrementelle Backup datentechnisch einem Fullbackup entspricht.
    Beim nächsten Fullbackup wird dann alles gelöscht und es sind wieder nur 100GB belegt?

    Bzw. anderum:
    Wie ist die datensparsamste Einstellung für obiges Beispiel und für ein Szenario wo nur einmal monatlich ein Fullbackup hochgeladen wird und auch nur dieses auf dem Server liegen soll?

  9. Comment Avatar Marcus sagt:

    Hallo Herr Kuketz,
    vielen Dank für die selbsterklärende Anleitungen!! Jeder einzelne Schritt hat so funktioniert wie beschrieben!!!

    Ich bekomme lediglich beim Ausführungen der Befehle mit „duply“ folgende Fehlermeldung:

    z.B.:
    duply my_backup create
    env: illegal option — u
    usage: env [-i] [name=value …] [utility [argument …]]

    duply my_backup backup
    Start duply v1.11.1, time is 2016-02-09 20:39:20.
    env: illegal option — u
    usage: env [-i] [name=value …] [utility [argument …]]

    Stundenlanges googlen hat mir keine Verbindung zu Duply gebracht.
    Auch wenn ich Duply über brew entferne und wieder installiere, kommt der Fehler wieder.

    Meine Rechnerdetails:
    O SX Yosemite 10.10.5, duplicity 0.7.06, python 2.7.11, gpg 1.4.20

    Haben sie zufälligerweise auch schon Erfahrung mit diesem Fehler gemacht?

    Über ein Feedback würde ich mich freuen.

    Danke im Voraus
    Schönen Abend

    • Comment Avatar Mike Kuketz sagt:

      Das sieht mir nach einem Typo aus. »Illegal option -u«
      Vor dem »u« sollte nur ein Bindestrich stehen.

      Oder die Option u exisitert nicht.
      Mehr kann ich dazu nicht sagen, da ich schon länger kein Mac OS X mit dieser Kombination nutze.

HilfeWenn du konkrete Fragen hast oder Hilfe benötigst, sind das offizielle Forum oder der Chat geeignete Anlaufstellen, um dein Anliegen zu diskutieren. Per E-Mail beantworte ich grundsätzlich keine (Support-)Anfragen – dazu fehlt mir einfach die Zeit. Kuketz-Forum

Abschließender Hinweis

Blog-Beiträge erheben nicht den Anspruch auf ständige Aktualität und Richtigkeit wie Lexikoneinträge (z.B. Wikipedia), sondern beziehen sich wie Zeitungsartikel auf den Informationsstand zum Zeitpunkt des Redaktionsschlusses.

Kritik, Anregungen oder Korrekturvorschläge zu den Beiträgen nehme ich gerne per E-Mail entgegen.