Erstellen Von Verschlüsselten FTP Backups Mit duplicity Und ftplicity Auf Debian Etch

Version 1.0
Author: Falko Timme


Wenn Du heutzutage einen bestimmten Server mietest, bieten Dir fast alle Anbieter einen FTP Speicherplatz für Sicherungen für Deinen Server auf einem der Sicherungssysteme des Anbieters an. Diese Anleitung veranschaulicht, wie Du duplicity und ftplicity dazu verwenden kannst, verschlüsselte (sodass jemand, der Zugriff auf Deinen Backup Server hat, die sensiblen Daten in Deinen Backups nicht lesen kann) Sicherungen auf dem entfernten Backup Server des Anbieters über FTP zu erstellen. ftplicity ist ein Wrapper Skript für duplicity (vom Deutschen Computer Magazin c't bereitgestellt), das es uns ermöglicht, duplicity nicht interaktiv zu verwenden (das heißt Du mußt keine Passwörter eintippen).

Ich übernehme keine Garantie, dass dies auch bei Dir funktionieren wird!

1 Vorbemerkung

In dieser Anleitung bezeichne ich den Backup Server backup.example.com auf dem ich ein FTP Konto mit dem Benutzernamen backupuser und dem Passwort secret habe. Auf meinem eigenen Server möchte ich das Verzeichnis /home/exampleuser sichern.

2 Installation von duplicity

Zuerst stellen wir sicher, dass unser System aktualisiert ist:

apt-get update

apt-get upgrade

Dann installieren wir duplicity wie folgt:

apt-get install duplicity


3 Unsere Erste Sicherung

Lass uns nun unsere erste Sicherung vornehmen:

FTP_PASSWORD=secret duplicity /home/exampleuser ftp://backupuser@backup.example.com/


server2:/home/exampleuser# FTP_PASSWORD=secret duplicity /home/exampleuser ftp://backupuser@backup.example.com/
GnuPG passphrase:
Retype to confirm:
No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1197306549.59 (Mon Dec 10 18:09:09 2007)
EndTime 1197306610.85 (Mon Dec 10 18:10:10 2007)
ElapsedTime 61.26 (1 minute 1.26 seconds)
SourceFiles 342
SourceFileSize 10545818 (10.1 MB)
NewFiles 342
NewFileSize 10545818 (10.1 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 342
RawDeltaSize 10513050 (10.0 MB)
TotalDestinationSizeChange 8968398 (8.55 MB)
Errors 0
-------------------------------------------------

server2:/home/exampleuser#

Wie Du siehst, wirst Du nach einem GnuPG Passwort gefragt. Du kannst ein Passwort Deiner Wahl eingeben; dies muss jedes Mal, wenn Du duplicity laufen lässt, vorgenommen werden. Die Sicherung wird mittels GnuPG verschlüsselt. Berechtigungen und Eigentümerschaften werden in der Sicherung aufbewahrt.

Um die Sicherung in einm Unterverzeichnis auf dem Backup Server zu erstellen, bearbeitest Du den Befehl wie folgt:

FTP_PASSWORD=secret duplicity /home/exampleuser ftp://backupuser@backup.example.com/subdirectory

Wenn Du duplicity erstmalig laufen lässt, wird es eine vollständige Sicherung erstellen; danach erstellt es eine inkrementelle Sicherung. Um wieder eine vollständige Sicherung herbeizuführen, kannst Du --full verwenden:

FTP_PASSWORD=secret duplicity --full /home/exampleuser ftp://backupuser@backup.example.com/

Um ein Verzeichnis von der Sicherung auszuschließen, z.B. /home/exampleuser/tmp, kannst Du --exclude verwenden:

FTP_PASSWORD=secret duplicity --exclude /home/exampleuser/tmp /home/exampleuser ftp://backupuser@backup.example.com/

Wenn Du das Root-Verzeichnis / sicherst, denke daran --exclude /proc auszuführen sonst wird duplicity abstürzen.

Um mehr über die Optionen von duplicity zu erfahren, sieh Dir Folgendes an

man duplicity


4 Eine Sicherung Wiederherstellen

Lass uns nun davon ausgehen, dass wir alles in /home/exampleuser gelöscht haben und es von unserer FTP Sicherung wiederherstellen wollen. So wird es gemacht:

FTP_PASSWORD=secret duplicity ftp://backupuser@backup.example.com/ /home/exampleuser

Bitte beachte, dass in diesem Fall das entfernte Verzeichnis vor dem lokalen Verzeichnis angegeben wird!

5 Automatische Sicherungen Mit ftplicity

Da duplicity jedes Mal, wenn wir es verwenden, nach einem GnuPG Passwort verlangt, ist es schwierig, es für automatische Sicherungen zu nutzen (z.B. via cron). Erfreulicherweise gibt es ftplicity, ein Wrapper Skript für duplicity, was uns ermöglicht, duplicity aufzurufen, ohne nach einem Passwort zu fragen.

Zunächst generieren wir einen GnuPG Key, den ftplicity verwenden wird (damit wir kein Passwort mehr eingeben müssen):

gpg –-gen-key


server2:/home/exampleuser# gpg --gen-key
gpg (GnuPG) 1.4.6; Copyright (C) 2006 Free Software Foundation, Inc.
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions. See the file COPYING for details.

Please select what kind of key you want:
(1) DSA and Elgamal (default)
(2) DSA (sign only)
(5) RSA (sign only)
Your selection? <-- ENTER
DSA keypair will have 1024 bits.
ELG-E keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) <-- ENTER
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) <-- ENTER
Key does not expire at all
Is this correct? (y/N) <-- y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: <-- your name, e.g. Falko Timme
Email address: <-- your email address, e.g. ft@falkotimme.com
Comment:
You selected this USER-ID:
"Falko Timme <ft@falkotimme.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? <-- O
You need a Passphrase to protect your secret key. <-- Type in your desired password (twice to confirm it)

Nun wird der Key generiert. Es macht sich ganz gut eine zweite Console zu öffnen und ein paar Buchstaben einzugeben, sodass der Zufallszahlengenerator genügend Informationsgehalt erlangen kann:


We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
+++++.++++++++++++++++++++.++++++++++..++++++++++.++++++++++++++++++++.++++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++++++++>++++++++++.........................................+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
.....+++++...+++++.++++++++++.+++++.++++++++++..++++++++++.++++++++++++++++++++++++++++++.++++++++++.++++++++++++++++++++++++++++++.+++++++++++++++.+++++++++++++++>+++++...+++++>+++++>..+++++>+++++.........................<.+++++...................>+++++..................................................<+++++....................+++++^^^^^
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 7C6E958B marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
pub 1024D/7C6E958B 2007-12-10
Key fingerprint = 1FDC 60FB 8A27 90D8 553C 3C3E 8E1F 66F7 7C6E 958B
uid Falko Timme <ft@falkotimme.com>
sub 2048g/F1BB98F4 2007-12-10

server2:/home/exampleuser#

Ich habe den Key ID (7C6e958B) hervorgehoben, da wir ihn gleich brauchen werden.

Als Nächstes laden wir ftplicity runter und lassen es einmal laufen, damit es einige benötigte Dateien erstellen kann:

cd /tmp
wget ftp://ftp.heise.de/pub/ct/listings/0613-216.tar.gz
tar xvfz 0613-216.tar.gz
cp ftplicity-1.1.1/ftplicity /usr/local/bin
ftplicity

Die Ausgabe des letzten Befehls ist auf Deutsch; im Wesentlichen heißt es da, dass die ftplicity Konfiguration in der Datei /root/.ftplicity/conf ist.

server2:/tmp# ftplicity


Offenbar benutzen Sie ftplicity zum ersten Mal. Eine vorlaeufige
Konfigurationsdatei wurde unter /root/.ftplicity/conf erstellt.
Sie muessen dort die Daten des verwendeten GPG-Schluessels sowie
die Zugangsdaten fuer den FTP-Server eintragen, bevor Sie mit dem
Backup fortfahren koennen.

WICHTIG:
Sichern Sie das komplette Konfigurationsverzeichnis nach dem
ersten erfolgreichen Backup unbedingt auf einen vertrauenswuerdi-
gen externen Rechner und schuetzen Sie es vor unbefugtem Zugriff.

server2:/tmp#


Nun bearbeiten wir /root/.ftplicity/conf. Sie enthält folgende Variablen:
  • GPG_KEY: die ID unseres GnuPG Keys;
  • GPG_PW: das Passwort, das wir eingegeben haben, als wir den GnuPG Key erstellt haben;
  • ZIEL: der Backup Server (inkl. des FTP Benutzernamens);
  • ZIEL_PW: das FTP Passwort im Backup Server;
  • QUELLE: das Quellverzeichnis (das heißt das Verzeichnis, das gesichert werden soll);
  • HOECHSTALTER: das Alter der letzten Sicherung; ältere Sicherungen werden gelöscht;
  • VERBOSITY: Menge an Information, die auf dem Screen von ftplicity angezeigt wird;
  • TEMP_DIR: ein Verzeichnis für temporäre Dateien; wenn Du eine Sicherung wiederherstellst, muss dieses Verzeichnis zumindest genug Speicherplatz für die größte Datei in der Sicherung haben.

vi /root/.ftplicity/conf


# Daten fuer GPG-Schluessel
GPG_KEY=7C6E958B GPG_PW='gpg_key_password' # Zugangsdaten fuer FTP-Server (URL-Format) ZIEL='ftp://backupuser@backup.example.com/' ZIEL_PW='secret' # Basisverzeichnis fuers Backup QUELLE='/home/exampleuser' # aeltester Wiederherstellungszeitpunkt HOECHSTALTER=1M # Ausfuehrlichkeit der Bildschirmausgaben (9 fuer Fehlersuche) VERBOSITY=4 # Verzeichnis fuer temporaere Dateien. Beim Restore muss dort # mindestens Patz fuer die groesste Datei im Backup sein TEMP_DIR=/tmp
Danach ändern wir die Berechtigungen der Datei, sodass nur Root Lese-und Schreibberechtigungen hat:

chmod 600 /root/.ftplicity/conf

Nun können wir drei andere Dateien erstellen, obwohl dies ganz optional ist:
  • /root/.ftplicity/exclude: beinhaltet eine Liste von Verzeichnissen, die von der Sicherung ausgeschlossen werden (ein Verzeichnis pro Zeile);
  • /root/.ftplicity/pre: beinhaltet Befehle, die vor der Sicherung ausgeführt werden sollen (z.B. eine MySQL Datenbankausgabe erstellen);
  • /root/.ftplicity/post: beinhaltet Befehle, die nach der Sicherung ausgeführt werden sollen.
Hier ist ein Muster /root/.ftplicity/exclude und /root/.ftplicity/pre Datei (der Syntax von /root/.ftplicity/post ist der gleiche wie in /root/.ftplicity/pre):

vi /root/.ftplicity/exclude


/proc
/dev /sys

chmod 600 /root/.ftplicity/exclude

vi /root/.ftplicity/pre


/usr/bin/mysqldump –-all-databases -u root -pyourrootsqlpassword > /home/exampleuser/db.sql
(Beachte, dass die Datenbank während dem Erstellen von SQL dump gesperrt wird; das muss kein Problem für kleine Webseiten sein, es kann aber eins für vielbesuchte Seiten werden - Deine Besucher werden nicht in der Lage sein, während des mysqldump Datenbank basierte Seiten zu erreichen. Hier ist ein Link zu einer störungsfreien MySQL Sicherungsmethode: How To Back Up MySQL Databases Without Interrupting MySQL)

/root/.ftplicity/pre muss ausführbar sein (genauso wie /root/.ftplicity/post wenn Du eine erstellen willst):

chmod 700 /root/.ftplicity/pre

Wie ich bereits erwähnt habe, brauchst Du nur /root/.ftplicity/conf; die anderen Dateien sind optional.

Nun ist ftplicity für den Gebrauch bereit; um unsere Sicherung zu erstellen, lassen wir einfach Folgendes laufen

ftplicity backup

Wenn alles gut läuft, wirst Du nicht nach einem Passwort aufgefordert:

server2:~# ftplicity backup
Reading globbing filelist /root/.ftplicity/exclude
No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1197309836.07 (Mon Dec 10 19:03:56 2007)
EndTime 1197309909.96 (Mon Dec 10 19:05:09 2007)
ElapsedTime 73.90 (1 minute 13.90 seconds)
SourceFiles 343
SourceFileSize 10859083 (10.4 MB)
NewFiles 343
NewFileSize 10859083 (10.4 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 343
RawDeltaSize 10826315 (10.3 MB)
TotalDestinationSizeChange 9052110 (8.63 MB)
Errors 0
-------------------------------------------------

server2:~#

Um die Sicherungen zu automatisieren, können wir einen Cron Job erstellen (ich erstelle zwei Cron Jobs, einen, der täglick läuft und inkrementelle Sicherungen erstellt, und einen, der einmal im Monat läuft und eine vollständige Sicherung erstellt und alte Dateien löscht):

crontab -e


# run the (incremental) backup each night at 03:23h
23 3 * * * /usr/local/bin/ftplicity backup # do a full backup once per month & delete old backups 47 4 1 * * /usr/local/bin/ftplicity full && /usr/local/bin/ftplicity purge –-force

6 Eine Sicherung Mit ftplicity Wiederherstellen

Natürlich kannst Du ftplicity auch dafür verwenden, Sicherungen wiederherzustellen (Du wirst nicht nach einem Passwort gefragt). Der Syntax ist sehr einfach:

ftplicity restore /home/exampleuser

Sieh Dir die ftplicity Hilfe an um zu erfahren, welche anderen Optionen Du hast:

ftplicity --help


server2:~# ftplicity --help
Usage: ftplicity <Kommando> [<Optionen> ...]

Kommandos:
backup: inkrementelles Backup
full: vollstaendiges Backup erzwingen
list: Dateien im Backup auflisten
verify: Backup pruefen und Aenderungen anzeigen
purge [--force]:
veraltete Backup-Archive anzeigen [und loeschen]
cleanup [--force]:
Backup-Verzeichnis aufraeumen (nach Programmabbruch)
restore <Zielpfad> [<Alter>]:
Backup nach <Zielpfad> restaurieren [vom Stand <Alter>]
fetch <Datei/Verzeichnis> <Ziel> [<Alter>]
Datei/Verzeichnis einzeln restaurieren (siehe Beispiel)

Beispiele:
Veraltete Backup-Archive anzeigen und loeschen:
ftplicity purge --force
Vollstaendiges Backup nach /mnt zurueckspielen:
ftplicity restore /mnt
Datei /etc/passwd nach /root/pw restaurieren, Stand vor 4 Tagen:
ftplicity fetch etc/passwd /root/pw 4D
(siehe "man duplicity", Abschnitt TIME FORMATS)

Dateien in /root/.ftplicity
conf Haupt-Konfigurationsdatei
pre wird vor einem Backup ausgefuehrt
post wird nach einem Backup ausgefuehrt
gpgkey enthaelt exportierten GPG-Schluessel
exclude Liste ausgeschlossener Dateien und Verzeichnisse
(siehe "man duplicity", Abschnitt FILE SELECTION)

server2:~#


7 Links