Tutorials

31.01.2008 14:07 Alter: 4 yrs

Automatische Backups unter Linux (Debian) mit rsync und SSH

Rubrik: Tutorials

Ausgangslage

Ein Unternehmen besitzt einen eigenen Linux-Server (in einem Rechenzentrum), dort werden E-Mails, Daten und Kundeninformationen gespeichert. Verständlicherweise dürfen diese Daten keinesfalls verloren gehen. Ein weiterer Rechner steht lokal zur Verfügung auf den das Backup der Daten gespielt werden kann. Eine kostengünstige und effiziente Lösung zur Sicherung der Daten kann daher implementiert werden.

Hierzu bietet Linux mit rsync eine sehr gute Lösungsmöglichkeit.

Um die Sicherung nicht nur lokal durchzuführen, sondern den Backup-Server per Internet erreichen zu können ist noch eine SSH-Verbindung nötig.

Zusammegefasst:
Das Backup soll über einen SSH-Tunnel durch das Internent von einem entfernten Rechner auf einen lokalen Rechner übertragen werden.

Benötigte Software installieren

Die beiden Programme rsync und openSSH müssen sowohl auf dem Server als auch auf dem Client installiert sein. Unter Debian Sarge lässt sich die benötigte Software einfach per apt-get installieren:

apt-get install openssh

und

apt-get install rsync

installieren die beiden Pakete automatisch. Für andere Distributionen finden sich ähnliche Installationspaket. Alternativ kann der Source-Code zum Kompilieren auf den folgenden Seiten heruntergeladen werden:

www.openssh.com

rsync.samba.org

Nach der Installation sind beide Pakete einsatzbereit.

SSH Konfiguration – Vorbereiten des passwortlosen Anmeldens

Nachdem die Software installiert ist, kann mit der Konfiguration begonnen werden. In unserem Beispiel gibt es einen entfernten Server und lokal (an der Maschine wird direkt gearbeitet) einen Backup-Server. Begonnen wird die Installation auf dem lokalen Rechner, bevor der entfernte Server konfiguriert wird.

Konfiguration des lokalen Backup-PCs

Im ersten Schritt müssen für den SSH-Zugang die nötigen Schlüssel generiert werden. Dies geschieht schnell und komfortable mit folgendem Befehl:

ssh-keygen -t dsa -b 2048 -f /pfad_zum_schluessel/rsync-key

Die verwendeten Parameter bedeuten dabei folgendes:

  • -t ist der Typ des Schlüssels in diesem Fall „dsa“

  • -b ist die Anzahl der Bits hier: 2048

  • -f legt die Datei fest in die der Schlüssel exportiert wird, hier „rsync-key“.

Natürlich muss „pfad_zum_schluessel“ durch ein existierendes Verzeichnis ersetzt werden :-)

Nun liegen in dem gewählten Verzeichnis zwei Dateien eine heißt „rsync-key“ und die zweite „rsync-key.pub“. Wichtig ist nun, dass die Rechte der beiden so restriktiv wie möglich gesetzt werden. Insbesondere der Privateschlüssel sollte nur von seinem Besitzer lesbar und änderbar sein.

Der öffentliche Schlüsselteil muss nun auf den entfernten Server gebracht werden, am besten so, dass kein Zugriff auf Ihn während der Übertragung möglich ist. Am besten verwendet man hierzu also auch eine verschlüsselte Verbindung. Beispielsweise lässt sich per „scp“ der Schlüssel problemlos und sicher übertragen.

Dazu genügt der folgende Befehl:

scp /pfad_zum_schluessel/rsync-key.pub BENUTZER@ENTFERNTERSERVER: /entferntes_verzeichnis

 

Nach Ausführung des Befehls wird das Passwort für den anzumeldenden Benutzer abgefragt. Der ausgewählte Benutzer muss natürlich auf dem Entfernten Server existieren. Anschließend ist die Datei sicher auf dem entfernten Server angekommen.

Konfiguration des Entfernten Servers

Jetzt ist der entfernte Server mit der Konfiguration an der Reihe. Also, dort anmelden und dann geht es los. Zunächst legen wir ein Verzeichnis .ssh an (im Heim-Verzeichnis des Nutzers). Dort erzeugen wir die Datei authorized_keys.

mkdir .ssh
touch authorized_keys

Jetzt müssen wir den vorhin auf den Server kopierten öffentlichen Schlüssel in die soeben erstellte Datei einfügen.

cat entferntes_Verzeichnis >> authorized_keys

Damit ist nun eine Datei authorized_keys erstellt, die die gültigen Schlüssel enthält.

Test der SSH-Konfiguration

Einem ersten Test der bisherigen Bemühungen steht nichts mehr im Wege. Los geht’s!

ssh -i /pfad_zum_schluessel/rsync-key BENUTZER@ENTFERNTERSERVER

Wenn alles geklappt hat steht jetzt eine Verbindung zum entfernten Server – und das Ganze ohne die Eingabe eines Passwortes.

Was für den Zweck eines automatischen Backups erwünscht ist, birgt ein nicht unerhebliches Sicherheitsrisiko: Der Besitzer des Schlüssels kann sich (wie auch im Leben ausserhalb der Software :-) ) Zugang zu allen Systemen verschaffen.

Das Backup

Endlich geht es nach den Vorbereitungen nun zum eigentlichen Backup. Hierfür wird rsync verwendet und das ganze in ein kleines Skript verpackt, dies ist insbsondere deshalb sehr angenehm, da das Skript einfach anzupassen ist und den Aufruf des Backups entsprechend erleichtert.

# Konfigurationsteil
DAY=`date +%a`
RSYNC=/usr/bin/rsync
SSH=/usr/bin/ssh
SCHLUESSEL=/home/rsync-sshkey
ENTFERNTERNUTZER=Backup-User
ENTFERNTERSERVER=Weitweg.de
ZUSICHERNDERPFAD=/bup/
ZIELPFAD=/home/bup/
PARAMETER=“azvh --human-readable --stats –progress –delete“

# Befehlsaufruf
$RSYNC -$PARAMETER -e "$SSH -i $SCHLUESSEL" $ENTFERNTERBENUTZER@$ENTFERNERSERVER:$ZUSICHERNDERPFAD $ZIELPFAD > /Verzeichnis_fuer_LOGS/backuplog.$DAY


# kleine Kontrolle des Ergebnisses
if [ $? = 0 -o $? = 24 ]
then echo alles gut!
else
echo $?
fi

Das Skript besteht aus zwei Teilen, zunächst werden die Variablen für den Aufruf des Befehls definiert, danach der Befehl mit den Parametern aufgerufen.

Welche Parameter werden verwendet (Eintrag Parameter):

  • -a bedeutet „archive“ damit werden alle Dateien rekursive und mit Ihren Rechten usw. gesichert.

  • -z bedeutet „compress“ die Daten werden während der Übertragung komprimiert.

  • -v bedeutet „verbose“ also geschwätzig und liefert zusätzliche Informationen, je mehr „v“ eingetragen werden, umso mehr Informationen werden ausgegeben.

  • -h --human-readable --progress liefert Informationen in lesbarer Form und Informationen zum Fortschritt.

Weitere Informationen zu den Parametern liefert die Website rsync.samba.org und der Befehl "man rsync".

Am Ende des Skriptes findet sich ein kleine Kontrollstruktur, die eigentlich nur für den manuellen Aufruf sinnvoll ist, sofern man nicht den gesamten Aufruf in eine Datei umleitet (dann kann aber die erste Umleitung entfallen s. nächster Abschnitt). Wenn kein großer Fehler auftritt, wird „Alles gut!“ ausgegeben; andernfalls der entsprechende Fehlercode.

Backup-Aktivität protokollieren

Die Ausgabe des rsync-Befehls wird in die Datei backuplog.$DAY umgeleitet wobei $DAY den abgekürzten Wochentag z.b. „Di“ für Dienstag darstellt. Somit gibt es für jeden Sicherungstag eine eigene Log-Datei und diese wird erst am nächsten „Di“ wieder überschrieben.

Sichern von Datenbanken

Bei Datenbanken stellt sich ein weiteres Problem, da ein Backup dieser Dateien einige Zeit dauern kann und sie während des Backups verändert werden können, sollte die Datenbank mit mysqldump in ein eigenes Verzeichnis gesichert werden und dieses in das Backup einbezogen werden.

#Konfigurationsteil
DAY=`date +%a`
benutzer=Name_des_Datenbankbenutzers
PW=GEHEIM

#Befehlsaufruf
mysqldump --user=$benutzer --password=$PW --all-databases | bzip2 -c > /DAS_BACKUPVERZEICHNIS/DATEINAME.$DAY

Hierfür wurde wiederum wegen der leichteren Wartbarkeit ein Skript erstellt. Der Befehl leitet schließlich die Ausgabe des MySQLdump in eine Datei um. Diese kann dann im Backup einbezogen werden und bei Bedarf wieder in die Datenbank zurückgeschrieben werden.

Cron-Job konfigurieren

Um nun noch die bis jetzt erreichte Automatisierung zu komplettieren, wird in der Datei crontab (im Verzeichnis /etc/) ein Verweis auf die neue Skriptdatei gesetzt und der Startzeitpunkt eingestellt. Ab dann startet das Backup-Skript jeweils um 21:15 an jedem Tag. Cron Jobs werden nicht nachgeholt. Sollte der PC als nicht laufen, wenn ein Cron-Job ansteht, ist ein manueller aufruf nötig, oder aber der Auftrag wird nicht nachgeholt.

 

#Min Std Tage Monat Wochentag Benutzer Pfad
15 21 * * * root Pfad_z._Skript/Name_des_Skripts

Die Bedeutung der einzelnen Parameter:

  • Min steht für Minute

  • Std steht für Stunde

  • Tage sind die Tage eines Monates

  • Monat legt den Monat fest

  • Wochentag der entsprechende Wochentag

  • Benutzer legt den Benutzer fest

  • Pfad legt den Pfad zum Skript fest und anschließend die Datei

 

Weitere Hinweise bietet (wie immer) „man cron“.

 

Mögliche Werte für den Cron Job

  • Min 0 -60

  • Std 0-23

  • Tage 1-31

  • Monate 0-12 oder January, Januar (letzteres ist von den lokalen Einstellungen abhängig).

  • Wochentag 0 – 6 (0 = Sonntag) oder Monday, Montag (letzteres ist von den lokalen Einstellungen abhängig).

 

Weitere Einstellungswerte 

  • * immer ausführen

  • 1-4 immer wenn 1 bis 4 zutrifft, z.B. vom 1. bis zum 4. eines Monats.

  • 1-4/2 Schrittweise also 1 und 3, wobei „/2“ die Schrittweite definiert.

  • 1,15,30 Aufzählung; z.B. am 1. und 15. und 30. eines Monats.

  • 1-7,10-15 Aufzählung und Bereiche kombiniert.

  • */2 Jedes zweite Mal, z.b. jeden zweiten Tag.

 

Mit all diesen Hinweisen steht nun einer regelmäßigen Datensicherung nichts mehr im Weg.

 

Der Artikel ist ein Auszug aus von der ilexius GmbH genutzten Verfahren, er erhebte keinen Anspruch auf Vollständigkeit und insbesondere Sicherheitsaspekte sind nur oberflächlich angesprochen!

 

Ansprechpartner zu diesem Artikel: 

ilexius GmbH
Herr Sebastian Koch
Herr Thomas Schlüter
Diese E-Mail Adresse ist gegen Spam Bots geschützt, Sie müssen Javascript aktivieren, damit Sie es sehen können info@ilexius.de  

Weitere Anleitungen zu verschiedenen Themen finden sich unter:
http://www.ilexius.de

Rechtliches

Jegliche Haftung der ilexius GmbH bei Verwendung der dargestellten Software oder Vorgehensweisen ist ausgeschlossen. Die ilexius GmbH haftet nicht für mögliche Schäden die durch die Verwendung dieses Dokuments entstehen.

Das Dokument unterliegt dem Copyright der ilexius GmbH. Sollten Sie unsicher sein bzgl. der Nutzung dieses Dokuments wenden Sie sich an die Ansprechpartner des Dokuments.