2008
09.19

Hier erkläre ich euch wie man ein automatisiertes Backup mit rsync über einen SSH Tunnel mit Key-Autologin zwischen zwei Linux / Mac Systemen erstellt.

Jeder muss selbst wissen was er an seinem Server / Router / Mac macht. Daher distanziere ich mich von allen Schäden die durch diese Anleitung entstehen könnten!

Ich nenne den zu Sichernden Server: “Produktiv-Server”
Ich nenne den Backupserver: “Backup-Server”

Die Voraussetzungen:

Auf beiden Servern muss rsync installiert sein.

apt-get install rsync

Nur für den “Backup-Server”:

Einen neuen Backupuser auf dem Backup-Server anlegen. Ich nenne den User “Produktivbackup”

useradd -m -p PASSWORT Produktivbackup

Als Passwort solltet Ihr ein sicheres wählen. ;) (nicht “backupuser1234″)

Dann dem User per sudo das Ausführen von rsync mit Root-Rechten erlauben.
Installation von sudo:

apt-get install sudo

Nun sudo beibringen, das der Benutzer “Produktivbackup” rsync mit Root-Rechten ausgeführen darf.

visudo

und folgdes einfügen

Produktivbackup ALL=(root)NOPASSWD:/usr/bin/rsync

Vorbereitung des Backup_servers für die Public-Key-Dateien vom “Produktiv-Server”

mkdir /home/Produktivbackup/.ssh
chown Produktivbackup:Produktivbackup /home/Produktivbackup/.ssh

So jetzt wechseln wir auf den “Produktiv-Server”

Die “Keys” zum automatischen Authentifizieren zwischen den beiden Servern erzeugen.
Bei der Abfrage “passphrase” einfach Enter drücken, denn sonst klappt der Autologin nicht.

mkdir /root/keys
ssh-keygen -t dsa -b 1024 -f /root/keys/rsync-key

Kopieren der rsync-key.pub zum “Backup-Server”
Kleine Anmerkung: Da hier per SCP Kopiert wird müsst Ihr euren SSH Port auf dem Backupserver kennen, die Angabe hinter dem “-P” ist der SSH-Port! Als Beispiel nehme ich den Standartport 22.

cd /root/keys
scp -P 22 rsync-key.pub Produktivbackup@IP-ODER-DNS-DES-BACKUPSERVERS:/home/Produktivbackup/.ssh

Wenn ihr Euch das erste mal zum Backupserver verbindet dann bitte die Abfrage mit “yes” Bestätigen.
Danach werdet Ihr nun nach dem Passwort des Benutzers “Produktivbackup” was Ihr eben vergebe habt gefragt.

Nach der Eingabe des Passwortes wird nun der “rsync-key.pub” in das Verzeichnis /home/Produktivbackup/.ssh kopiert.

Nun müssen wir noch einmal zurück zu unserem “Backup-Server”

Folgendes eingeben:

mv /home/Produktivbackup/.ssh/rsync-key.pub /home/Produktivbackup/.ssh/authorized_keys
chown -R Produktivbackup:Produktivbackup /home/Produktivbackup/.ssh
chmod 700 /home/Produktivbackup/.ssh
chmod 600 /home/Produktivbackup/.ssh/authorized_keys

Hier wird die rsync-key.pub in authrized_keys umbenennt und die Rechte angepasst, das nur der Backupbanutzer auf die Datei zugreifen darf.

Nun sollte eine Testverbindung vom “Produktiv” zum “Backup” nichts mehr im Wege stehen.

ssh -p 22 -i /root/keys/rsync-key  Produktivbackup@IP-ODER-DNS-DES-BACKUPSERVERS

Wenn alles gut läuft seid Ihr nun ohne Passwortabfrage auf der Shell vom “Backup-Server”. Mit “exit” verlasst ihr die Shell des “Backup-Servers” wieder.

Nun kommt mein Backupscript was ich z.Z. nutze.
Dies könnt Ihr in ein Verzeichnis eurer Wahl legen z.B. /root/scripte/

mkdir /root/scripte
nano backupscript.sh

und fügt folgendes ein:

#!/bin/sh

BACKUPDIR=/                                     #Ab hier wird gesynct
FILEEXCLUDE=/root/scripte/rsync_exclude.txt     #exclude Datei
SSHRSYNCKEY=/root/keys/rsync-key                #Keyfile für den Autologin
TARGETDIR=/home/Produktivbackup/                #oder ein anderes Verzeichnis was existieren muss
BACKUPSERVER=IP oder DNS Name                   #Adresse Backup-Server
USER=Produktivbackup                            #Benutzer Backupserver
SSHPORT=22	                                #oder EUER SSH-PORT vom "Backup-Server"
OPTIONS=-avze

echo "Starte Rsync nach $BACKUPSERVER an Port $SSHPORT in das
 Zielverzechnis $TARGETDIR die aktuellen Rsync Optionen $OPTIONS"

rsync $OPTIONS "ssh -p $SSHPORT -i $SSHRSYNCKEY" --rsync-path='sudo /usr/bin/rsync'
 --stats -–numeric-ids --exclude-from=$FILEEXCLUDE $BACKUPDIR $USER@$BACKUPSERVER:$TARGETDIR

echo "...ready"

Eine Datei fehlt noch bevor Ihr loslegen könnt, das ist die “rsync_exclude.txt” die bei mir auch unter /root/scripte/ liegt.

Datei anlegen:

nano /root/scripte/rsync_exclude.txt

Als Beispiel könnt ihr meinen Inhalt der Datei einfügen:

- /lib
- /bin
- /opt
- /sys
- /proc
- /tmp
- /lost+found
- /dev
- /media
- /cdrom

Nun noch das Script in die in die “crontab” einfügen.

In der Shell:

crontab -e

und folgendes für eine tägliche Syncronisation nachts um 2 Uhr eingeben:

2     0     *     *     *  sh /root/scripte/backupscript.sh

Fertig, nun wird jede Nacht ein Backup / Syncronisation gestartet.

Hier könnt ihr die Dateien herunterladen:
backupscript.sh
rsync_exclude.txt

Viel erfolg beim nachbasteln ;) !

7 comments so far

Kommentieren
  1. [...] kein Backup sind aber mich deutlich ruhiger schlafen lassen. Habe mich für die Anleitung auf rxtx-server entschieden und ein wenig angepasst. Für das Backup meiner Blender Datein schloss ich [...]

  2. Hi, danke dir für das Lob!
    Zu deinen drei Punkten:
    - 1. Werd ich nachholen
    - 2. wird eingefügt
    - 3. “–rsync-path=’sudo /usr/bin/rsync’” das steht dabei damit rsync auf der Remotemaschiene mit sudo ausgeführt wird denn der Anmeldebenutzer ist nur ein Benutzer ohne Rechte, er darf nur rsync mit sudo ausführen, zudem wird rsync mit “/usr/bin/rsync” gesagt wo es sich auf dem system befindet. Das kann aber jeder Stricken wie er es natürlich möchte.
    Gruß
    Philipp

  3. Genau das, was ich gesucht habe :D

    Sehr schön und klar dargestellt, ideal für mich Frischling.
    Danke für die Darstellung. :)

    Drei Schönheitsfehler:
    1. In der runterladbaren Version vom backup-script ist noch kein –numeric-ids eingefügt
    2. oben ist der eine Bindestrich bei –numeric-ids ein Sonderzeichen (geringfügiges copy&paste-Problem)
    3. im Script steht –rsync-path=’sudo /usr/bin/rsync’… hab das sudo bei mir entfernt…

  4. Prima, musste ich mir die Zeilen nicht selber zusammenbauen ;)

  5. :-) Da kann ich nicht mithalten mit meinen gerad mal 192kb/s.

    Nur noch eine kleine Korrektur, da dummerweise der zweite Strich vom Input-Feld geschluckt wurde. Mach den jetzt mal mit einem Leerzeichen, dann sollte es geht. “- – nummeric-ids”

  6. Hallo Ronin,
    danke für deinen Verbesserungsvorschlag!
    Ich habe die Option “–numeric-ids” mit in das Script eingebaut. Zu dem Upstream-Problem, ich habe ca 550kb/s Upload und komme damit gut zurecht, aber zum Glück benötige ich das Backup nicht so oft ;)
    Die beste Lösung ist natürlich von einem Server zum anderen zu Syncen so hat man in beide Richtungen die beste Performance.

  7. Super Erklärung. Vielen Dank.

    Ich fand einige Anleitungen im Netz, die den Weg ein wenig anders gingen (Backup stößt der Backup-Server auf dem Produktivserver an, nicht wie hier, Produktivserver startet das Script und verbindet sich mit dem Backup).

    Dies hatte dann leider den Nachteil, dass sämtliche Original-Dateibesitzer und Gruppen verloren gingen, da nach dem rsync alle Dateien dem Backup-Server gehörten.

    Man sollte aber eventuell aus dieser Problematik heraus erwähnen, dass Deine rsync-Zeile die Option “–numeric-ids” enthalten sollte, denn mit dieser kann man alle Benutzer und Gruppen beibehalten, auch wenn diese nicht auf dem Backup-Server existieren.

    Im Ernstfall dann auch wieder mit –numeric-ids zurück-synchronisieren und alles stimmt wieder.

    Nur ein kleiner Wehrmutstropfen bei dieser/Deiner Lösung: Man nutzt den Upstream, der bei asynchronem DSL leider sehr viel langsamer ist.

Dein Kommentar