Der Amazon (AWS) S3 Speicher wird gerne als unkompliziertes Backup für seine Daten verwendet.
Allerdings sollte dann -da die Daten auf fremden Servern gespeichert sind- auf jeden Fall verschlüsselt erfolgen.
Mit Duply, welches ein Wrapper für Duplicity ist geht das ganz einfach.
Inhalt
Bucket anlegen
Als erstes muss bei Amazon (oder einem anderen S3-Storage Anbieter) ein Bucket angelegt- und der Access-/Secret Key notiert werden.
GPG key generieren
Zunächst muss ein GPG key für die Verschlüsselung generiert werden.
Und um genügend entropy dafür zu haben wird es in den meisten Fällen nötig sein die rng-tools zu installieren.
yum install gpg rng-tools gpg --gen-key
Bei der Ausgabe ist „XXXXXXXX“ der GPY key; das Passwort ist die eingegebene Passphrase:
gpg: key XXXXXXXX marked as ultimately trusted
[stextbox id=“note“ caption=“Hinweis“]
Falls später beim Backup die Meldung erscheint:
Volume was signed by key XXXXXXXXXXXXXXXX, not YYYYYYYY
dann muss man in der duply-Konfiguration weiter unten als GPG_KEY die ersten 16 Zeichen des Wertes für: „Key fingerprint“ angeben.
[/stextbox]
Installation
Nun müssen die Pakete Duplicity und Duply installiert werden:
yum install duply duplicity
Konfiguration
Profil erstellen
duply 'backup' create
In der nun erstellten Datei: /etc/duply/backup/conf müssen die folgenden Werte angepasst werden:
GPG_KEY='_KEY_ID_' GPG_PW='_GPG_PASSWORD_' TARGET='s3://aws.amazon.com/backup' export AWS_ACCESS_KEY_ID='_ACCESS_KEY_' export AWS_SECRET_ACCESS_KEY='_SECRET_KEY_' SOURCE='/backup/path' MAX_AGE=1M MAX_FULL_BACKUPS=4 MAX_FULLS_WITH_INCRS=1
Zuletzt sollte noch eine exclude Liste (z.B. für /sys/, /proc/, /mnt/, usw.) angelegt werden:
/etc/duply/backup/exclude
- /proc/* - /sys/* - /mnt/*
Cronjob
Für das regelmässige Backup muss nun noch ein cronjob erstellt werden:
0 0 * * 7 /usr/bin/duply backup full_verify_purge --force > /var/log/duply.log 2>&1 0 0 * * 1-6 /usr/bin/duply backup incr > /var/log/duply.log 2>&1
[stextbox id=“note“ caption=“Hinweis“]
Das: „full_verify_purge“ ist in duplicity ein „neutral separator“ (es wird also nicht der Task „full_verify_purge“ ausgeführt, sondern die DREI Tasks: full, verify und purge nacheinander) und würde sich in bash so übersetzen lassen:
duply backup full ; duply backup verify ; duply backup purge –force
Damit ist auch ein sogenanntes „conditional OR“ möglich, indem man die Minuszeichen durch underscores (_) ersetzen würde.
Beispielsweise: full_verify_purge würde sich in bash so übersetzen lassen:
duply backup full || duply backup verify || duply backup purge
Ein Pluszeichen (+) wäre demzufolge ein „conditional AND“ (wird nur ausgeführt wenn der letzte Befehl erfolgreich war) und entspräche in der bash dem „&&“.
[/stextbox]
In dieser Konfiguration wird Sonntags um 0:00 ein Full-Backup erstellt und alte Backups gelöscht. Montag bis Samstag wird jeden Tag ein inkrementelles Backup durchgeführt. Neue Cronjobs können mit crontab -e erstellt werden. Hier ist anzumerken, dass für alle Kommandos und Konfigurationsdateien der absolute Pfad angegeben werden muss.
[stextbox id=“note“ caption=“Hinweis“]
Anstelle des Profils (backup) könnte man auch den komplette Pfad zur Konfiguration angeben, z.B.:
0 0 * * 7 /usr/bin/duply /root/.duply/backup full_verify_purge –force
[/stextbox]
Wiederherstellung
Zum Wiederherstellen (restore) können folgende Befehle verwendet werden:
Das letzte Backup nach /tmp/duply-restore/ wiederherstellen:
duply backup restore /tmp/duply-restore/
Die Datei /etc/passwd von vor 4 Tagen nach /tmp/duply-restore/ wiederherstellen:
duply backup fetch etc/passwd /tmp/duply-restore/ 4D
Monitoring
Der Status des backups kann mittels:
duply backup status
abgefragt werden.
Für das Überwachen mit icinga kann das Script check_duply verwendet werden.
Hallo Steven,
danke für Dein Tutorial.
Ich hätte jedoch einen Hinweis/Rückfrage zu Deinem Hinweiskasten bzgl. der Cron-Jobs. Du schreibst, dass „Das: full_verify_purge ist in duplicity ein conditional OR (wird also nur ausgeführt wenn der vorherige Aufruf fehlgeschlagen ist)“. Bist Du Dir da sicher? Lt. man-Page ist der Underscore:
_ (underscore)
neutral separator
Ein conditional OR wäre das Minus-Zeichen:
– (minus sign), _or_
conditional OR; the next command will only be executed if the previous failed
Zumal Du ja auch schreibst, dass sonntags „ein Full-Backup erstellt und alte Backups gelöscht“ werden. Das Löschen/purge würde jedoch bei ‚conditional OR‘ und einem erfolgreich verlaufendem Full-Backup ja gar nicht stattfinden.
Danke für den Hinweis! Du hast natürlich recht mit den Separators, ich habe den Hinweis entsprechend angepasst. 🙂