[HowTo] Server-Backup mit rsync

miko93

Registered User
Während mein erstes Backup läuft, ein kleines How-To: Server-Backup mittels RSYNC

1. Das Ziel

Automatisches und möglichst komplettes Backup eines dedizierten Servers auf einen anderen.

2. Die Anfordungen

- Verwendung von rsync (wg. inkrementeller Schreibmöglichkeit; unveränderte Dateien werden nicht erneut kopiert).
- Datenübertragung mittels SSH (also kein laufender rsync-Server mit Port nach aussen - obwohl es damit sehr komfortabel geht. Aber die Daten sind während der Übertragung eben nicht verschlüsselt).
- SSH-Login für den Backup als user, nicht als root (kein Root-Zugang von aussen). Root-Rechte brauchen wir aber trotzdem, da sonst manche rsync-Features (z.B. Beibehaltung der ursprünglichen Owner) nicht funktionieren.
- Automatisierbar. Also keine Login-Abfragen.

3. Der Verbindungsweg einer Sicherung

Webserver -> rsync(client) -> SSH -> Internet -> SSH -> rsyn (servermode) -> Backupserver

4. Die einfachen Sachen

- sudo und visudo müssen installiert sein (zumindest auf dem Backup-Server)
(der gediegene Debian-User prüft mit dpkg -l sudo)
- rsync muss auf beiden Maschinen installiert sein (wer hätte es gedacht...)
(der gediegene Debian-User prüft mit ... jaja, ist ja gut)

5. Die nicht-mehr-ganz-so-einfachen Sachen

Zuerst benötigen wir einen User auf dem Backupserver, über den später der SSH-Login vom Webserver aus läuft. Also

z.B.

Useradd -m -p* Backupchef
passwd backupchef


Nun bekommt dieser User root-rechte für den rsync-Befehl:

visudo, dann eintragen:
Backupchef ALL=(root)NOPASSWD:/usr/bin/rsync

Das NOPASSWD soll später eine Abfrage im automatischen Betrieb verhindern. Anders hab' ich es nicht hinbekommen.

Der Login über SSH soll mittels Keys erfolgen. Also nicht über Passworteingabe. Und da schauen wir 'mal, wie die es hier machen:

http://servers.linux.com/servers/04/11/04/0346256.shtml?tid=119&tid=47

Also, auf dem Webserver (als root eingeloggt):

ssh-keygen -t dsa -b 2048 -f ~/rsync-key (bei den Abfragen nur RETURN drücken)

Es wurden nun 2 Dateien in /root erzeugt: rsync-key, rsync-key.pub

Nun kommt der Backup-Server dran:

Das auf dem Webserver erzeugte File rsync-key.pub muss nach /home/Backupchef (oder wie der User eben hiess) auf dem Backup-Server kopiert werden. Ich habe dort einfach mit vim eine neue Datei erzeugt, und den Inhalt 'reinkopiert

Dann cd /home/Backupchef, und wir klauen wir die Befehle aus dem o.g. Link:

mkdir ~/.ssh
chmod 700 ~/.ssh
mv ~/rsync-key.pub ~/.ssh/
cd ~/.ssh/
touch authorized_keys
chmod 600 authorized_keys
cat rsync-key.pub >> authorized_keys


Kleines Sicherheits-"Schmankerl":

vim /home/Backupchef/.ssh/authorized_keys

Ändern: "ssh-dss AAAAB3NzaC..." (das AAAAB3NzaC...ist der Key, der sieht bei Euch wohl dann anders aus) in

from="xxx.xx.xxx.xxx" ssh-dss AAAAB3NzaC...

Die IP ist die Adresse des Webservers, der sich später in den Backupserver einloggt. Damit kann sich nur dieser hier über die Keys einwählen. Die anderen müssen den Passwort-Login verwenden (und den kann man ggfs. auch noch abschalten...)

6. Das wilde Backup-Spript

Auf dem Webserver verwende ich ein Script wie das hier. Wie man sieht, werden die Verzeichnisse /proc /tmp /lost+found und /dev ausgespart. Ausserdem wird vor dem rsync'en noch ein mysqldump ausgeführt (hier evtl. noch den Pfad hinzufügen). User "Backupchef" loggt sich ein, und führt den eigentlichen rsync-Befehl mit sudo aus.

Code:
# miko 19.12.2004
# Backup Webserver nach Backupserver

#!/bin/sh

echo "-----------------------------------"
echo "/usr/local/rsync_backup.sh started."

BACKUPDIR=/
TARGETDIR=/home/Backupchef/backup/
E1=/proc
E2=/tmp
E3=/lost+found
E4=/dev

BACKUPSERVER=xxx.xxx.xxx.xx

echo "Creating mysql-dump:  /usr/local/mysql_dump.sql.gz..."

PASSWD=mysqlrootpasswort
mysqldump -uroot -p$PASSWD --all-databases | gzip > /usr/local/mysql_dump.sql.gz

echo "...ready"

echo "Starting rsync to remote machine..."

rsync -a -z -e "ssh -i /root/rsync-key" --rsync-path='sudo /usr/bin/rsync' --bwlimit=200 --stats --delete 

--exclude=$E1 --exclude=$E2 --exclude=$E3 --exclude=$E4 $BACKUPDIR Backupchef@$BACKUPSERVER:$TARGETDIR

echo "...ready"

echo "/usr/local/rsync_backup.sh finished."
echo "-----------------------------------"

Und das sollte es gewesen sein.

...und nächste Woche: "Wie bekomme ich die Daten vom Backup-Server wieder 'runter ?" :p
 
Last edited by a moderator:

MasterTH

New Member
Ich hab einen Verbesserungsvorschlag. Man möchte das Skript als Cronjob starten lassen. Ich hab es nicht hinbekommen das das skript ohne passwordeingabe startet. Daher meine Vorgehensweise:

Am Source-Server mit dem Backupuser anmelden, dann folgende Befehle ausführen:
Code:
ssh-keygen -t rsa

Alles ohne Eingaben bestätigen.
Jetzt benutzen wir SSH um auf dem Zielserver das .ssh Verzeichnis im Homeverzeichnis des Backupusers anzulegen.

Code:
ssh Backupuser@Zielserver mkdir -p .ssh

Hier müssen wir noch das Kennwort des Backupusers eingeben.

Als nächstes schreiben wir den Schlüssel in die authorized_keys, diesmal auf wieder per ssh

Code:
cat .ssh/id_rsa.pub | ssh Backupuser@Zielserver 'cat >> .ssh/authorized_keys'
auch hier möchte SSH noch ein Kennwort, was auch nicht verwunderlich ist, denn erst jetzt hat er ja den Schlüssel.
der folgende Befehl funktioniert aber jetzt ohne Kennwort ;)
Code:
ssh Backupuser@Zielserver hostname


Ansonsten musste ich noch in der rsync-Zeile des Skripts eine Änderung durchführen

Code:
rsync -avze ssh --rsync-path='sudo /usr/bin/rsync' --bwlimit=200 --stats --delete --exclude=$E1 --exclude=$E2 --exclude=$E3 --exclude=$E4  $BACKUPDIR -r USER@$BACKUPSERVER:$TARGETDIR

Ansonsten hat das nicht mit dem authorized_key funktioniert. Auch musste ich nach dem $Backupdir noch das "-r" ranmachen da er ansonsten nicht die Unterverzeichnisse mitgesichert hätte


Wichtig ist noch zu sagen, die Zeile
Code:
Backupchef ALL=(root)NOPASSWD:/usr/bin/rsync

muss auf beiden Servern eingetragen werden.
 

michael-08

Blog Benutzer
Hallo, also das mit dem rsync ist eine nette Sache und teilweise kostet ein rootDS der genügend GB hat nicht arg soviel mehr als ein FTP!

Aber die Variante vom Backupserver aus zu connecten ist nochmal sicherer!

Einen Key auf dem Hauptserver anlegen, den public key zu den authorized Keys hinzufügen und den private key auf den Backupserver legen um sich mit dem rsync Benutzer ohne Passwort zu connecten! Die Backups sind zumindest dann mal sicher, falls der Hauptrechner in fremde Hände gerät!

Wenn jemand den Backupserver "hackt" und sich so Zutritt zum Hauptserver verschaffen kann ist dann wohl die umgekehrte Problematik! Hier würde es sich lohnen Beispielsweise auf dem Hauptserver ein Script auszuführen, dass einen Port öffnet wenn die rsync Prozedur beginnen soll und später per Script die Ports wieder schliesst! Wohl mit einem 2. SSH Server, sodass im Falle des Falles der Hauptserver mit einem anderen Port nicht so leicht zu erraten ist (Eventuell könnte man sogar die IP des Backupservers für den "offiziellen" port sperren, sodass man sich nur zu der Zeit während das Script den zweiten SSH Server aufmacht connecten kann)

Ist leider nicht mein erlerntes Gebiet, aber vielleicht gibt es noch eine bessere Alternative! Die Variante aber vom Backupserver aus zu connecten schlug mir einer aus #rsync vor der mit dieser Materie gut bewandert war
 
Last edited by a moderator:

wstuermer

Blog Benutzer
Prinzipiell schonmal ein guter Ansatz. Aber warum nicht die Daten schon vor dem eigentlichen Transfer verschlüsseln? Stichwort: gpg
 
Top