Automatisiertes Backup mit Verschlüsselung

Backups sollte man regelmäßig erstellen. Das gilt umso mehr, wenn es um Server geht. Denn die Wiederherstellung des Contents ist sehr aufwändig - je nach Einsatzzweck sogar unmöglich. Ich denke da zum Beispiel an Blogs, die jahrelang treu ihre Dienste verrichtet haben, bis plötzlich die Datenbank defekt ist. Oder Webarchive, die gelöscht werden. Ist alles schon vorgekommen.

Nach dem Umzug auf meinen neuen Server hatte ich mir das Ziel gesteckt, ein automatisiertes Backup einzuführen. Es sollte nicht sonst wie umfangreich sein. Alles in ein Archiv pressen, das ganze verschlüsseln und die aktuellste Kopie noch per FTP auf einen zweiten Backup-Space schieben. Das war's schon. Das es jedoch so einfach und schnell gehen würde, hätte ich nicht gedacht.

Das eigentliche Script ist nur ein paar Zeilen kurz. Die eigentliche Arbeit liegt im Vorbereiten der Verschlüsselung. Da Backupdateien und Backupscript auf einem Server liegen, wollte ich, dass eine asymmetrische Verschlüsselung zum Einsatz kommt. So muss ich nicht erst aufwändig das Verschlüsselungspasswort irgendwo verstecken. Stattdessen sind die Schlüssel für die Verschlüsselung und für die Entschlüsselung einfach getrennt. Jemand, der verschlüsseln kann, kann daher nicht automatisch auch entschlüsseln. 🙂

Das ganze habe ich mit GnuPG realisiert. Das sollte auf den meisten Linux-Servern bereits vorhanden sein. Als allererstes muss man natürlich seine Schlüssel erzeugen. Dies sollte man auf seinem lokalen Rechner machen. Sicher ist sicher. Zudem geht es schneller, da man so viel besser Zufallswerte für die Schlüsselerzeugung generieren kann. Man sollte zudem einen temporären Schlüsselring verwenden (der Speicher, in dem die Schlüssel abgelegt werden).

1
2
3
4
gpg --homedir /tmp --gen-key
gpg --homedir /tmp --armor --export-secret-key > [SECRETFILE]
gpg --homedir /tmp --armor --output [KEYFILE] --export [KEYNAME]
gpg --homedir /tmp --delete-secret-and-public-key [KEYNAME]

Was machen wir hier? Wir generieren ein Schlüsselpaar (privater Schlüssel und öffentlicher Schlüssel) und speichern dieses in einem temporären Schlüsselring. Bei der Erstellung des Schlüssels muss man einen Realnamen und eine E-Mail-Adresse angeben. Diese E-Mail-Adresse wird später euer "KEYNAME" sein.
Anschließend werden der private Schlüssel (in die Datei "SECRETFILE") und der öffentliche Schlüssel (in die Datei "KEYFILE") exportiert. Nach dem Export wird der Schlüssel (mit dem Namen "KEYNAME") aus dem Schlüsselring wieder gelöscht.
Den privaten Schlüssel braucht ihr später, um eure Backups entschlüsseln zu können. JEDER, der diesen privaten Schlüssel hat, kann das tun. Aus diesem Grund solltet ihr ihn zum einen gut aufheben und zum anderen sicher verwahren. Der öffentliche Schlüssel ist der, mit dem später verschlüsselt werden kann - er heißt deshalb so, weil man ihn theoretisch öffentlich verteilen könnte, ohne, dass damit die Verschlüsselung gefährdet wäre.

Diesen öffentlichen Schlüssel müsst ihr nun auf euren Server übertragen und dort in einen Schlüsselring importieren. Ich würde empfehlen, für das Backup-Geraffel einen eigenen Schlüsselring zu erstellen. Zudem müsst ihr diesem Schlüssel euer Vertrauen aussprechen, damit GnuPG später nicht ständig fragt, ob ihr den Schlüssel WIRKLICH verwenden wollt. Würdet ihr das nicht tun, könnte es sein, dass das Automatisierungsskript stehen bleibt und um eine Eingabe bittet. Das wäre blöd.

1
2
sudo gpg --homedir [RINGDIR] --import [KEYFILE]
sudo gpg --homedir [RINGDIR] --edit-key [KEYNAME] trust quit

Wie ihr seht, importiert ihr den öffentlichen Schlüssel (in der Datei "KEYFILE") in einen neuen Schlüsselring (der sich im Ordner "RINGDIR befindet). Danach gebt ihr diesem Schlüssel (mit dem Namen "KEYNAME") euer Vertrauen. Wählt hier am besten die höchste Vertrauensstufe, schließlich habt ihr den Schlüssel selbst erzeugt. Nun seid ihr für's Verschlüsseln gerüstet. 🙂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/bash

# define current date
BACKUPDATE=$(date +%Y%m%d)

# define file names
CLEARFILE=[BACKUPDIR]/backup_$BACKUPDATE.tar.gz
CRYPTFILE=$CLEARFILE.gpg
CHECKFILE=[CHECKFILE]
SOURCEDIR=[SOURCEDIR]

# define GPG options
GPGHOME=[RINGDIR]
GPGUSER=[KEYNAME]

#define FTP options
FTPSERVER=[FTPSERVER]
FTPUSER=[FTPUSER]
FTPPASS=[FTPPASS]
FTPPATH=[FTPPATH]
FTPFILE=[FTPFILE]

# create backup file
tar -czf $CLEARFILE $SOURCEDIR

if [ -f $CLEARFILE ]
then
  # create encrypted file
  gpg --homedir $GPGHOME --recipient $GPGUSER --output $CRYPTFILE --encrypt $CLEARFILE

  # remove backup file
  # do this always
  # we do not want to have
  # unencrypted backups
  # lying around
  rm $CLEARFILE

  if [ -f $CRYPTFILE ]
  then
    # upload encrypted file
    ftp -n $FTPSERVER <<EOF
user $FTPUSER "$FTPPASS"
binary
cd $FTPPATH
put "$CRYPTFILE" "$FTPFILE"
bye
EOF


    # write check file
    # so we can see
    # externally that
    # everything worked
    echo $BACKUPDATE > $CHECKFILE
  fi
fi

Kommen wir nun zum eigentlichen Backup-Script. Dies besteht (mit Kommentaren) aus etwas mehr als 50 Zeilen. Darin enthalten ist das Backup erstellen, das Verschlüsseln, der FTP-Upload und das Schreiben einer Checkdatei.

Aber fangen wir oben an. Als erstes speichern wir uns das aktuelle Datum, damit wir dieses später verwenden können. Anschließend definieren wir ein paar Dateinamen. Den Dateinamen der unverschlüsselten Archivdatei (diese landet im Ordner "BACKUPDIR"), den Namen der verschlüsselten Datei (diese landet auch im Ordner "BACKUPDIR"), den Namen einer Checkdatei ("CHECKFILE") und den Ordner, der gebackupt werden soll ("SOURCEDIR").
Weiterhin werden noch der Ort des Schlüsselrings ("RINGDIR") und der Name des öffentlichen Schlüssels ("KEYNAME") definiert. Diese werden schließlich für die Verschlüsselung gebraucht.
Abschließend erfolgt noch die Konfiguration für den FTP-Upload. Dieser benötigt den Namen des FTP-Servers ("FTPSERVER"), Benutzername und Passwort für den Login ("FTPUSER" und "FTPPASS"), einen Ordner und einen relativen Dateinamen, unter dem die Datei abgelegt werden soll ("FTPPATH" und "FTPFILE").

Damit sind alle benötigten Informationen vorhanden, um den Ordner $SOURCEDIR zu packen und in die Datei $CLEARFILE zu schreiben, mit Hilfe von $GPGHOME und $GPGUSER zu verschlüsseln und das Ergebnis in der Datei $CRYPTFILE abzulegen, die Datei $CLEARFILE zu löschen, sich am Server $FTPSERVER mit dem Nutzer $FTPUSER und dem Passwort $FTPPASS anzumelden, die $CRYPTFILE auf dem Server unter dem Namen $FTPPATH/FTPFILE abzuspeichern und das letzte $BACKUPDATE in die Datei $CHECKFILE zu speichern.

Das ganze kann man nun zum Beispiel per Cron regelmäßig aufrufen lassen und schon hat man ein automatisiertes, regelmäßiges, verschlüsseltes Backup und die aktuellste Kopie immer noch auf einem zweiten Server gesichert. 🙂

Für Kommentare, Anregungen, Verbesserungen und Fragen bin ich jederzeit zu haben.
Automatisierte Grüße, Kenny

3 Kommentare » Schreibe einen Kommentar

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.