da ich bei einem neuen Debianserver gerade das ganze Backupsystem umstelle, dachte ich mir dokumentiere ich meine Arbeit... Ich hoffe, dass der eine oder andere einen Nutzen daraus ziehen kann :)
Haftung übernehme ich selbstverständlich keine - ihr seid selbst verantwortlich für das, was ihr in eure Maschine eintippt :evil:
Meine Anforderungen an das Backupsystem waren:
- Backup auf einen anderen, über Internet erreichbaren Server (kein Backupspace wie bei 1&1 bspw.)
- Inkrementelle Sicherungen aller wichtigen Daten
- Natürlich möglichst geringer Space- und Trafficverbrauch
- Alle Attribute wie Links, uid, gid etc müssen erhalten bleiben
- Automatische, tägliche Sicherung in der Nacht
- Sicherheit für die Backupdaten bei der Ã?bertragung und danach
- Zugriff aller Dateien in einem Zustand eines bestimmten Datums
Hauptsächlich aufgrund des letzten Punkts, habe ich mich für 'rdiff-backup' als Backup-Programm entschieden (Mehr auf http://rdiff-backup.stanford.edu), da es alle gewünschten Funktionen bietet, eine sicher Ã?bertragung per ssh ermöglicht und bei Debian als Paket verfügbar ist.
1. Installation
Bei Debian woody ist leider eine ziemlich veraltete Version von rdiff-backup dabei, aber erfreulicherweise gibt es Backports dazu. Ich habe mich für diese entschieden, da zwischen v0.6.0 und v0.12.5 doch markante Unterschiede bestehen, insbesondere bezüglich der Benutzerfreundlichkeit. Eigentlich wäre die aktuellste Version des Backports v0.13.3, aber mit dieser Version hat das Ã?berschreiben vorhandener Dateien durchwegs in einem AssertionError geendet - sollte jemand hierzu Abhilfe wissen, würde ich mich über eine PM freuen. Die Unterschiede sind allerdings sowieso ziemlich gering - also los geht's.
Zuerst loggen wir uns auf dem Produktiv- und dem Backupserver ein, wechseln zu root, ziehen uns die Backports und installieren die benötigten Pakete:
Code: Select all
flaky:~> su
Password:
flaky:/home/manus# wget http://debian.jones.dk/ida/pool/sid-jones/rdiff-backup/rdiff-backup_0.12.5-1.99.jones.0_i386.deb
flaky:/home/manus# wget http://debian.jones.dk/ida/pool/sid/librsync/librsync1_0.9.6-6.99.jones.1_i386.deb
flaky:/home/manus# dpkg -i librsync1_0.9.6-6.99.jones.1_i386.deb
flaky:/home/manus# apt-get install rdiff
flaky:/home/manus# dpkg -i rdiff-backup_0.12.5-1.99.jones.0_i386.deb
Code: Select all
flaky:/home/manus# apt-get install sudo
flaky:/home/manus# visudoCode: Select all
rdiff ALL = NOPASSWD: /usr/bin/rdiff-backup2. Benutzer
Auf dem Backupserver richten wir einen neuen Benutzer für das Backup an.
Code: Select all
shifty:/home/manus# adduser --disabled-login --home /var/backups/rdiff rdiffAuf dem Produktivserver wird ebenfalls ein neuer Benutzer erstellt. Danach zu diesem gewechselt und ein neuer RSA-Key erzeugt, damit später ein Login ohne Passwort möglich ist:
Code: Select all
flaky:/home/manus# adduser --disabled-password rdiff
flaky:/home/manus# su rdiff
rdiff@flaky:/home/manus$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/rdiff/.ssh/id_rsa):
Created directory '/home/rdiff/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/rdiff/.ssh/id_rsa.
Your public key has been saved in /home/rdiff/.ssh/id_rsa.pub.
The key fingerprint is:
aa:a1:fe:22:71:4c:be:a3:5e:37:37:d6:46:d6:f0:e2 rdiff@flaky
rdiff@flaky:/home/manus$ cd ~/.ssh/
rdiff@flaky:~/.ssh$ mv id_rsa.pub authorized_keys
rdiff@flaky:~/.ssh$ chmod 600 authorized_keysNun müssen wir den eben erzeugten Private Key noch auf den Backupserver übertragen. Auf dem Produktivserver:
Code: Select all
rdiff@flaky:/home/manus$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIICWgIBAAKBgQDSLKnBsrIWLGhPQ/jcMwhDLMpRJ7n5ykUo4CG+Pxv4PoDVK4+S
[snip]
HmbokVr6tYoZKsv+fa/iCzUwbUaOA5HWv3t+mzWd
-----END RSA PRIVATE KEY-----
Code: Select all
shifty:/home/manus# su rdiff
rdiff@shifty:/home/manus$ mkdir ~/.ssh
rdiff@shifty:/home/manus$ cd ~/.ssh/
rdiff@shifty:~/.ssh$ touch id_rsa
rdiff@shifty:~/.ssh$ chmod 600 id_rsa
rdiff@shifty:~/.ssh$ vi id_rsa 3. Das Backup
Das Grundsystem haben wir somit installiert, jetzt geht's an das eigentliche Backup. Dazu erstellen ich auf dem Backupserver eine Datei in der alle Pfade stehen, die ich nicht im Backup drin haben möchten. Alternativ müssten alle Directories angegeben werden, die man im Backup haben will. Wer es lieber umgekehrt mag, kann das natürlich auch machen.
Code: Select all
rdiff@shifty:~/.ssh$ vi ~/exclude_listCode: Select all
/bin
/boot
/dev
/lib
/mnt
/proc
/tmp
/vmlinuz
Nun geht's an den ersten Synchronisationsversuch, dazu gehen wir zuerst in unser Homedir und erstellen ein neues Verzeichnis für das Backup, dieser Schritt ist wichtig! Sichert man direkt in das Homeverzeichnis von 'rdiff' geht sonst bei jedem Backup auch der Ordner .ssh verloren. Ausserdem ist wichtig, dass rdiff-backup durch Root ausgeführt wird, da sonst uid/gid und die Rechte nicht mitgesichert werden:
Code: Select all
rdiff@shifty:~/.ssh$ cd
rdiff@shifty:~$ mkdir data
rdiff@shifty:~$ su
Password:
shifty:/var/backups/rdiff# rdiff-backup --exclude-filelist exclude_list --print-statistics --remote-schema 'ssh -i ~rdiff/.ssh/id_rsa %s sudo rdiff-backup --server' rdiff@124.124.124.124::/ data/
4. Statistiken
'rdiff-backup' bietet interessante und hilfreiche Features:
Code: Select all
shifty:/var/backups/rdiff# rdiff-backup --list-changed-since 4h data/Weitere Möglichkeiten stehen in 'man rdiff-backup'.
Im Ordner ~rdiff/data/rdiff-backup-data/ finden sich Informationen zu jeder Backupsession, wie bspw. wieviel neue Files dazugekommen sind, wieviele gelöscht wurden, wieviele MB übertragen. Ausserdem Statistiken über jeden Restore einer Datei usw. Wenn man diese Statistiken direkt nach dem Backup sehen will, kann man --print-statistics an den Backupcmd anfügen.
Diese kann zum Beispiel so aussehen:
Code: Select all
--------------[ Session statistics ]--------------
StartTime 1079899715.00 (Sun Mar 21 21:08:35 2004)
EndTime 1079899764.83 (Sun Mar 21 21:09:24 2004)
ElapsedTime 49.83 (49.83 seconds)
SourceFiles 1091
SourceFileSize 8433023 (8.04 MB)
MirrorFiles 985
MirrorFileSize 5037284 (4.80 MB)
NewFiles 106
NewFileSize 3395739 (3.24 MB)
DeletedFiles 0
DeletedFileSize 0 (0 bytes)
ChangedFiles 2
ChangedSourceSize 0 (0 bytes)
ChangedMirrorSize 0 (0 bytes)
IncrementFiles 108
IncrementFileSize 0 (0 bytes)
TotalDestinationSizeChange 3395739 (3.24 MB)
Errors 0
--------------------------------------------------
Das beste Backup nützt uns nichts, wenn wir nicht wissen wie wir die Daten wieder herstellen können. Dank 'rdiff-backup' ist das aber ein ziemlich einfacher Prozess. Angenommen wir wollten unseren FTP Daemon neu konfigurieren, als aber gar nichts mehr funktioniert, möchten wir wieder die Version vor 1 Stunde zurückhaben:
Code: Select all
shifty:/var/backups/rdiff# cd data
shifty:/var/backups/rdiff/data# rdiff-backup --force -r 1h --remote-schema 'ssh -i ~rdiff/.ssh/id_rsa %s sudo rdiff-backup --server' etc/proftpd.conf rdiff@124.124.124.124::/etc/proftpd.conf
6. Automatisation
Auf dem Backupserver, öffnen wir die Datei /etc/crontab:
Code: Select all
shifty:/var/backups/rdiff/data# vi /etc/crontabCode: Select all
0 6 * * * root /usr/bin/rdiff-backup --exclude-filelist ~rdiff/exclude_list --print-statistics --remote-schema 'ssh -i ~rdiff/.ssh/id_rsa %s sudo rdiff-backup --server' rdiff@124.124.124.124::/ ~rdiff/data/7. Sicherheitsüberlegungen
Seid euch bitte bewusst, dass diese Backupmethode nicht ganz ungefährlich ist. Ihr arbeitet Lokal und Remote als Root, d.h. kontrolliert doppelt bevor ihr einen Befehl ausführt. Ich habe während dem schreiben des HowTo's ein versehentliches Leerzeichen zuviel geschrieben und schon hatte ich auf dem Remoterechner / überschrieben -> Da funktionierte dann natürlich erstmal gar nix mehr!
Ein Vorteil dieser Methode ist allerdings, dass der Produktivserver keinerlei Zugriff auf den Backupserver hat, sollte dieser also bspw. gecrackt werden ist es deutlich schwieriger auch noch an das Backup ran zu kommen.
Beachtet ausserdem, dass der Benutzer rdiff auf dem Server durch sudo root Rechte für 'rdiff-backup' erhält, er hat damit kompletten Lese- und Schreibzugriff auf dem System!
.static
