Zum Hauptinhalt springen

Wie erstelle ich ein Backup meines Root (V)Servers?

Nine bietet Ihnen S3 kompatiblen Speicherplatz (Backupspace) an, auf welchen Sie Daten Ihres Root (V)Servers sichern können. Zum erstellen der Backups empfehlen wir das Tool duplicity. Nachfolgend finden Sie eine kurze Einführung in duplicity.

Was ist duplicity?

duplicity hilft dabei, Backups eines Systems zu erstellen und diese auf einem anderen System oder Medium zu speichern. Hierbei können viele unterschiedliche Ziele für das Backup angegeben werden. Mit duplicity ist es ebenfalls möglich, verschlüsselte Backups zu erstellen. Hierbei werden die Daten mit GnuPG ver- und entschlüsselt. Das Backup mit duplicity kann einfach über einen Aufruf mit den passenden Parametern angestossen werden und benötigt keine komplizierte Konfiguration.

Es gibt zudem unterschiedliche Frontends für duplicity. Ein Beispiel dafür ist duply.

duply wird von den gezeigten Commands und Scripts nicht verwendet. Wenn Sie ein Frontend für duplicity benötigen, hilft der folgende Link bei der Installation von duply, ein einfach gehaltenes Frontend für duplicity:

https://www.thomas-krenn.com/de/wiki/Backup_unter_Linux_mit_duply

Wie wird Duplicity installiert?

Ubuntu

duplicity muss in der Version >= 0.7.x vorliegen, damit das Backup in Zusammenarbeit mit unserem S3-kompatiblen Storage funktioniert. Zudem wird ein zusätzliches Python-Modul benötigt. Unter Ubuntu kann nur die Version 0.6x direkt aus dem offiziellen Ubuntu-Repository installiert werden. Deshalb wird für die Installation das Ubuntu-Repository von duplicity verwendet. Dies kann mit folgenden Befehlen bewerkstelligt werden:

apt-get install software-properties-common
apt-get install python-software-properties

Nur bei Ubuntu Xenial (16.04) oder älteren Systemen:

add-apt-repository ppa:duplicity-team/ppa

Danach kann duplicity installiert werden:

apt-get update
apt-get install duplicity

Zusätzlich muss nun noch das Packet python-boto installiert werden, bevor duplicity einsatzbereit ist:

apt-get install python-boto

Debian

Für Debian können die selben Pakete, wie für Ubuntu verwendet werden. Zu beachten ist, dass nach dem Hinzufügen des zusätzlichen Repositories mittels

add-apt-repository ppa:duplicity-team/ppa

in der Datei /etc/apt/sources.list.d/duplicity-team-ppa-trusty.list, die Bezeichnung der Debianversion, durch "trusty" ersetzt werden muss.

Wie verwende ich duplicity?

Bevor ein Backup erstellt werden kann, müssen die Zugangsdaten als Umgebungsvariablen exportiert werden. Dies geschieht folgendermassen:

export AWS_ACCESS_KEY_ID='ERHALTENER_ACCESS_KEY'
export AWS_SECRET_ACCESS_KEY='PASSWORT_ZU_ACCESS_KEY'

Damit diese Daten nicht in der History der Konsole auftauchen, empfiehlt es sich, die beiden Befehle in einer versteckten Datei wie zum Beispiel /root/.backup.cred abzulegen. Danach kann einfach dieses Script mit source $(/root/.backup.cred) aufgerufen werden, um die Variablen zu setzen.

Wie teste ich meine Zugangsdaten?

Der folgende Befehl prüft ob die Credentials sowie Collections existieren und gibt danach aus um welche Zeit und an welchem Datum das letzte (falls gefundene) Backup gemacht wurde.

duplicity collection-status s3://backup-space.nine.ch/${HOSTNAME}

Ausgabe bei erfolgreicher Prüfung:

Last full backup date: none
Collection Status
-----------------
Connecting with backend: BackendWrapper
Archive dir: /root/.cache/duplicity/...

Ausgabe bei nicht erfolgreicher Prüfung:

Traceback (innermost last):
File “/usr/bin/duplicity”, line 1559, in <module>
with_tempdir(main)
File “/usr/bin/duplicity”, line 1545, in with_tempdir
fn()
File “/usr/bin/duplicity”, line 1381, in main
action = commandline.ProcessCommandLine(sys.argv[1:])
File “/usr/lib/python2.7/dist-packages/duplicity/commandline.py”, line 1132, in ProcessCommandLine
globals.backend = backend.get_backend(args[0])
File “/usr/lib/python2.7/dist-packages/duplicity/backend.py”, line 223, in get_backend
obj = get_backend_object(url_string)
File “/usr/lib/python2.7/dist-packages/duplicity/backend.py”, line 209, in get_backend_object

Backup erstellen

Bei einer Backup Lösung über duplicity muss man sich gedanken darüber machen, was für eine Art von Backup man für sein System aussuchen will. Wir empfehlen die Nutzung von wöchentlichen Voll-Backups inklusive täglichem Incremental Backups.

Um ein Backup eines Verzeichnisses zu erstellen, genügt der folgende Befehl:

duplicity --log-file /var/log/duplicity.log --verbosity info --archive-dir=/var/tmp/duplicity --no-print-statistics --full-if-older-than 3D --no-encryption ${ZU_SICHERNDES_VERZEICHNIS} s3://backup-space.nine.ch/${HOSTNAME}/${PREFIX}

Wenn der obige Befehl in einem Cronjob, zum Beispiel täglich, ausgeführt wird, wird alle drei Tage ein vollständiges Backup des Verzeichnisses ${ZU_SICHERNDES_VERZEICHNIS} erstellt. Zwischen den drei Tagen werden inkrementelle Backups angelegt. Zu beachten ist, dass so ein neuer "Bucket", mit dem Namen ${HOSTNAME} erstellt wird. Die Variable ${PREFIX} stellt einen beliebigen Präfix, zur Wiedererkennung, der Backups dar. Der Präfix kann frei gewählt werden, der Name des Buckets sollte jedoch dem Hostnamen des Servers entsprechen um Verwechslungen zu vermeiden.

Sollte bei dem Befehl, der Errorcode 403 erscheinen, kann dies einer der beiden folgenden Gründe haben:

  1. Die Zugangsdaten (AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY) wurden nicht/falsch hinterlegt.
  2. Es existiert bereits ein Bucket, mit dem gewählten Namen. Wählen Sie bitte einen anderen Bucketname (im obigen Befehl lautet der Bucketname ${HOSTNAME}).

Backup überprüfen

Mit dem “duplicity verify” Command und dem “--compare-data”-Flag wird das angegebene Verzeichnis mit dem Inhalt auf dem S3-Bucket verglichen.

duplicity verify --compare-data s3://backup-space.nine.ch/${HOSTNAME}/${Prefix} /zu/prüfendes/verzeichnis

Es wurden Unterschiede gefunden:

Local and Remote metadata are synchronized, no sync needed.
Last full backup date: DATUM UHRZEIT
Difference found: File . has mtime DATUM UHRZEIT, expected DATUM UHRZEIT
Difference found: New file TEST.txt
Verify complete: 30 files compared, 2 differences found.

Es wurden keine Unterschiede gefunden:

Local and Remote metadata are synchronized, no sync needed.
Last full backup date: DATUM UHRZEIT
Verify complete: 30 files compared, 0 differences found.

Alte Backups löschen

Um alte Backups, welche nicht mehr benötigt werden zu löschen, kann der folgende Befehl verwendet werden:

duplicity remove-all-but-n-full 3 --archive-dir=/var/tmp/duplicity  --log-file /var/log/duplicity.log --force --verbosity info --no-print-statistics s3://backup-space.nine.ch/${HOSTNAME}/${PREFIX}

So werden immer nur die neusten 3 vollständigen Backups des Servers behalten.

Backup wiederherstellen

Das letzte Backup kann folgendermassen wiederhergestellt werden:

duplicity --archive-dir=/var/tmp/duplicity restore s3://backup-space.nine.ch/${HOSTNAME}/${PREFIX} ${ZIEL}

Wenn verifiziert wurde, dass alle benötigten Daten auf auf dem S3-Backupspace vorhanden sind, muss beim Restore auf nichts mehr speziell geachtet werden.

Backups auflisten

Mit dem folgenden Befehl, können alle aktuell vorhandenen Backups aufgelistet werden:

duplicity collection-status --archive-dir=/var/tmp/duplicity s3://backup-space.nine.ch/${HOSTNAME}/${PREFIX}

Backups mit Verschlüsselung

Es ist durchaus möglich, mit duplicity auch verschlüsselte Backups zu erstellen. Hierbei werden Ihre Daten mittels GPG verschlüsselt.

GPG-Schlüsselpaar erstellen Für die Verschlüsselung werden ein öffentlicher und ein privater Schlüssel benötigt. Diese können folgendermassen erstellt werden:

gpg --gen-key

GPG fragt dann nach, wie der neue Schlüssel erstellt werden soll. Hier sind folgende Angaben zu wählen:

  1. RSA and RSA
  2. = 2048 (4096 empfohlen)

  3. Das gewünschte Ablaufdatum des Schlüssels (0 = immer gültig)
  4. Wenn "0" gewählt wurde, muss dies bestätigt werden.
  5. "Real name" kann z.B. auf den Servername gesetzt werden
  6. "Email address" leer lassen.
  7. "Comment" ebenfalls unausgefüllt lassen.
  8. Mit "O" (wie Okay) bestätigen.
  9. Kein Passwort setzen. (Dieses müsste bei jedem Backup im Klartext angegeben werden.)

Wenn der Server neu aufgesetzt wurde, besteht die Möglichkeit, dass beim Erstellen des Schlüssel folgende Meldung erscheint: “Not enough random bytes available. Please do some other work to give the OS a chance to collect more”

Diese Random Bytes werden automatisch durch laufende Programme und Tasks generiert. Dies kann jedoch mittels "rng-tools" beschleunigt werden.

sudo apt-get install rng-tools
rngd -f -r /dev/urandom

Dies muss nur ein paar Minuten laufen gelassen werden. Danach kann der GPG-Schlüssel erstellt werden.

Nach dem Erstellen des Schlüsselpaares, empfehlen wir, den privaten Schlüssel auch noch auf einem anderen Gerät aufzubewahren, da die Daten später nur mit diesem wieder entschlüsselt werden können.

Die Schlüssel können wie folgt exportiert werden:

gpg --output mygpgkey_pub.gpg --armor --export MYGPGKEY01
gpg --output mygpgkey_sec.gpg --armor --export-secret-key MYGPGKEY01

Diese beiden Dateien können anschliessen wie folgt auf ein anderes Gerät transferiert werden:

scp MYGPGKEY01_pub.gpg MYGPGKEY01_sec.gpg user@remotehost:~/

Sobald die beiden Dateien transferiert wurden, sollten diese auf dem Server wieder gelöscht werden:

rm ~/MYGPGKEY01_sec.gpg ~/MYGPGKEY01_pub.gpg

Verschlüsseltes Backup erstellen Um ein verschlüsseltes Backup zu erstellen, muss nur der oben erwähnte Backupbefehl wie folgt ergänzt werden:

  1. Vor den Befehl, muss env PASSPHRASE='' gesetzt werden
  2. Den Befehl um die Parameter --encrypt-key '${REALNAME/KEYID}' und --gpg-options '--trust-model=always' ergänzen. ${REALNAME/KEYID} stheht hierbei für den Namen oder die ID des GPG Keys.
  3. Den Parameter --no-encryption entfernen.

Der neue Befehl sieht dann etwa so aus:

env PASSPHRASE='' duplicity --log-file /var/log/duplicity.log --verbosity info --archive-dir=/var/tmp/duplicity --no-print-statistics --full-if-older-than 3D  --encrypt-key '${REALNAME/KEYID}' --gpg-options '--trust-model=always' ${ZU_SICHERNDES_VERZEICHNIS} s3://backup-space.nine.ch/${HOSTNAME}/${PREFIX}

Verschlüsseltes Backup wiederherstellen Das wiederherstellen eines verschlüsselten Backups benötigt nur das zusätzliche Voranstellen von env PASSPHRASE='':

env PASSPHRASE='' duplicity --archive-dir=/var/tmp/duplicity --encrypt-key '${REALNAME/KEYID}' restore s3://backup-space.nine.ch/${HOSTNAME}/${PREFIX} ${ZIEL}

Weitere Informationen zu duplicity

Script Empfehlung

Um das Erstellen der Backups zu automatisieren, empfiehlt es sich, die Befehle für das Erstellen und das Löschen alter Backups in einem Script zusammen zu fassen. Das Script, um zum Beispiel ein unverschlüsseltes Backup von /home zu erstellen, sieht folgendermassen aus:

#!/bin/bash

source $(/root/.backup.cred)
if [ $? -ne 0 ]; then
echo 'Could not source in credentials file' >&2
exit 1
fi
duplicity --log-file /var/log/duplicity.log --verbosity info --archive-dir=/var/tmp/duplicity --no-print-statistics --full-if-older-than 3D --no-encryption /home s3://backup-space.nine.ch/${HOSTNAME}/home
duplicity remove-all-but-n-full 3 --archive-dir=/var/tmp/duplicity --log-file /var/log/duplicity.log --force --verbosity info --no-print-statistics s3://backup-space.nine.ch/${HOSTNAME}/home

Dieses kann nun entweder direkt im Verzeichnis /etc/cron.daily/ abgelegt oder einfach als Cronjob eingetragen werden.

Die Cronjob-Datei muss noch mit folgendem Befehl ausführbar gemacht werden:

chmod +x /etc/cron.daily/${CRONJOB}

Man sollte natürlich im Anschluss bzw. in den kommenden Tagen nachprüfen, ob das Script die Daten korrekt und in den richtigen Abständen sichert.

Datenbank-Backups

Da Datenbanken in den meisten Fällen nicht einfach mittels Kopieren der Daten gesichert werden können, empfiehlt es sich hier, einen Dump der Datenbanken zu erstellen. Der Dump kann dann wie die restlichen Daten mit duplicity gesichert werden. Für die Dumps der Datenbanken empfehlen wir folgende Tools: