Logo - Japanese Zodiac Sign

Backup auf Strato root-Server

Automatische Backups auf einem Strato root-Server mit OpenBSD.

de en

Automatische Backups auf den Backup-FTP von Strato

Im allgemeinen sollten alle wichtigen Daten, die auf dem Server abgelegt sind regelmäßig gesichert werden. Hierzu bietet sich der von Strato angebotene FTP an.

Sicherheitshinweise

Sobald man sich für den Backup-Server angemeldet hat und dieser entsprechend konfiguriert wurde, sind die Zugangsdaten im Bereich Serverkonfiguration / BackupFTP abrufbar. Der Zugang zum Server funktioniert nicht von ausserhalb des Strato Rechenzentrums, es muß vom Server aus zugegriffen werden.

Die Daten scheinen daher ziemlich sicher vor fremden Augen zu sein. Allerdings sollte man, sofern man automatische Backups nutzen will, vor Augen führen, daß ein kompromitierter Server gleichzeitig die Login-Informationen für den Backup-FTP preisgeben kann.

Man sollte also sicher sein, den Server entsprechend aufgesetzt zu haben.

Die Werkzeuge

  • Da mittlerweile OpenBSD auf dem Server laufen sollte läßt sich der komfortable ftp Client aus der Basisinstallation zum Transfer der Daten auf den Backup-FTP nutzen. Dieser läßt sich auch per Skript steuern.
  • Als Backup-Programm bietet sich dump in Verbindung mit restore an. Zu beachten ist, daß das hier vorgestellte Verfahren einzelne Dateien sichert. Es ist natürlich auch möglich, ganze Slices mit dump zu sichern. In diesem Falle wäre ein inkrementelles Backup sinnvoll. Werden einzelne Dateien angegeben kann dump kein inkrementelles Backup erstellen.

Hätte ich fast vergessen: Ein bißchen Skripten müssen wir auch noch. Das läßt sich hervorragend mit der ebenfalls im Basissystem enthaltenen Korn Shell machen.

Vorraussetzungen

Als erstes sollte der Zugriff auf den Backup-FTP Server automatisiert werden. Dazu muß in der Datei .netrc im Home-Verzeichnis von root folgender Eintrag gemacht werden:

machine backup.serverkompetenz.de login USER password GEHEIM

Wobei USER und GEHEIM durch die von Strato vergebenen Loginname und das Passwort ersetzt werden. Der Login am Server sollte dann automatisch funktionieren. Auf dem FTP sollte ein Verzeichnis angelegt werden, in das die Backups geschrieben werden. Der Einfachheit halber habe ich es backup genannt. Sollte ein anderes Verzeichnis ausgewählt werden ist das unten abgebildete Skript entsprechend zu ändern.

Als nächstes müssen die Dateien, die gesichert werden sollen erfaßt und in einer Datei abgelegt werden. Zu beachten ist, daß wir für jedes Dateisystem eine eigene Datei ablegen müssen, da dump nicht über Dateisystemgrenzen arbeiten kann. Diese Dateien wurden von mir im Verzeichnis /root/data abgelegt. Der Name der Datei ist dann entsprechend gewählt: backup-root für /; backup-home für /home (Wenn /home als eigenständiges Slice angelegt wurde). Als Beispiel die ersten Einträge meiner Datei backup-root:

/root/.*
/root/*
/etc/boot.conf
/etc/fstab

Hiermit wird das Home-Verzeichnis von root sowie die Dateien boot.conf und fstab aus dem Verzeichnis /etc als zu sichern angegeben. Das folgende Skript baut aus dieser Datei eine Argumentenliste für dump und läßt dump in eine temporäre Datei sichern. Diese wird am Ende gelöscht:

Das Skript

#!/bin/sh

tstamp=$(date +%F)
expire_date=$(date -r $((`date +%s` - 2592000)) +%F)

if [ ! -d /root/data/ ]; then
        echo "ftpdump: /root/data/ does not exist."
        exit 1;
fi

for filelist in /root/data/*; do

        files=`cat ${filelist}`
        ftpfile=`echo $filelist | sed -e 's:/root/data/\(.*\):\1:'`

        tmp_file=`mktemp`

        /sbin/dump -a -f $tmp_file ${files}
        if [ $? == 0 ]; then
                /usr/bin/ftp <<-EOF
                        open backup.serverkompetenz.de
                        epsv
                        binary
                        verbose
                        put "|gzip -9 -c ${tmp_file}" backup/${ftpfile}-${tstamp}.gz
                        prompt
                        del backup/$ftpfile-${expire_date}.gz
                        close
                EOF
        fi

        rm ${tmp_file}
done

Aus dem aktuellen Datum wird noch ein Dateiname für das Backup erzeugt. Damit die Daten möglichst Platzsparend auf dem Server abgelegt werden werden sie zudem noch per gzip komprimiert.

Nachdem die Datei auf dem Server geschoben wurde wird überprüft, ob ein 30 Tage älteres Backup auf dem Server liegt. Eigentlich wird nicht überprüft, sondern es wird versucht diese Datei zu löschen. Existiert kein solches Backup wird vom ftp Client eine entsprechende Fehlermeldung ausgegeben, diese hat aber keinen Einfluß auf den weiteren Ablauf des Skripts.

Leider habe ich es nicht geschafft dump über eine Pipe mit ftp kommunizieren zu lassen. Daher sind im Augenblick noch ausreichend Platz im Verzeichnis /tmp zu reservieren, oder aber ein anderer Mechanismus zu implementieren um in temporäre Dateien zu sichern. Sollte jemand eine schönere Lösung kennen wäre ich dankbar diese zu verwenden.

Regelmäßig?

Wenn das Skript täglich ausgeführt werden soll muß nur noch ein Eintrag in die Crontab von root vorgenommen werden. Vorsicht: hier wird normalerweise HOME=/var/log gesetzt, wodurch sich die Datei .netrc in /root nicht mehr nutzen läßt. Daher sollte die Variable HOME bei Aufruf des Skripts entsprechend umgesetzt werden. Der Crontab eintrag sieht dann etwa so aus:

45	4	*	*	*	HOME=/root /bin/sh /root/bin/ftpdump

Somit würde jeden Morgen um 4:45 ein Backup gemacht und auf dem BackupFTP gelagert.