Duply
Ein einfaches Python-Script zur Erstellung von inkrementellen, symmetrisch verschlüsselten Backups auf Dateiebene.
Bescheibung
- Ist ein Frontend von duplicity.
- Erstellte Backups können sowohl lokal am gesicherten Rechner, als auch entfernt (remote) auf einem anderen System gespeichert werden.
- Unterstützt ftp, ssh, s3, rsync, cifs, webdav, http.
Installation
# apt install duply
Konfiguration
Schlüssel erstellen
Während der Erstellung des Keys ist es ratsam andere Arbeiten auf dem Host durchzuführen, um die Entropie am System zu erhöhen, z.B. durch schnelles Bewegen der Maus und/oder das Eintippen auf der Tastatur.
Dies beschleunigt das Erstellen des Keys, weil dem Host schneller Zufallswerte (Random) zur Verfügung stehen, die für das Erstellen des Keys benötigt werden.
# gpg --full-generate-key
gpg (GnuPG) 2.2.12; Copyright (C) 2018 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Bitte wählen Sie, welche Art von Schlüssel Sie möchten: (1) RSA und RSA (voreingestellt) (2) DSA und Elgamal (3) DSA (nur signieren/beglaubigen) (4) RSA (nur signieren/beglaubigen) Ihre Auswahl? 1 RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein. Welche Schlüssellänge wünschen Sie? (3072) 4096 Die verlangte Schlüssellänge beträgt 4096 Bit Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll. 0 = Schlüssel verfällt nie <n> = Schlüssel verfällt nach n Tagen <n>w = Schlüssel verfällt nach n Wochen <n>m = Schlüssel verfällt nach n Monaten <n>y = Schlüssel verfällt nach n Jahren Wie lange bleibt der Schlüssel gültig? (0) 0 Schlüssel verfällt nie Ist dies richtig? (j/N) j GnuPG erstellt eine User-ID, um Ihren Schlüssel identifizierbar zu machen. Ihr Name ("Vorname Nachname"): Bobby Hell Email-Adresse: xyz@abc.com Kommentar: Es grün so grün, wenn Spaniens Blüten blühn. Sie benutzen den Zeichensatz `utf-8' Sie haben diese User-ID gewählt: "Bobby Hell (Es grün so grün, wenn Spaniens Blüten blühn.) <xyz@abc.com>" Ändern: (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(A)bbrechen? F ┌──────────────────────────────────────────────────────┐ │ Bitte geben Sie die Passphrase ein, │ │ um Ihren Schlüssel zu schützen. │ │ │ │ Passphrase: **********______________________________ │ │ │ │ <OK> <Abbrechen> │ └──────────────────────────────────────────────────────┘ ┌──────────────────────────────────────────────────────┐ │ Bitte geben Sie die Passphrase noch einmal ein: │ │ │ │ Passphrase: **********______________________________ │ │ │ │ <OK> <Abbrechen> │ └──────────────────────────────────────────────────────┘ Wir müssen eine ganze Menge Zufallswerte erzeugen. Sie können dies unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen. gpg: Schlüssel C676563899DE35FA ist als ultimativ vertrauenswürdig gekennzeichnet gpg: Widerrufzertifikat wurde als '/root/.gnupg/openpgp-revocs.d/EECB4BABABB7D22094CDA142C676563899DE35FA.rev' gespeichert. Öffentlichen und geheimen Schlüssel erzeugt und signiert. pub rsa4096 2020-08-07 [SC] EECB4BABABB7D22094CDA142C676563899DE35FA uid Bobby Hell (Es grünt so grün, wenn Spaniens Blüten blühn.) <xyz@abc.com> sub rsa4096 2020-08-07 [E]
Passphrase wird nicht im Klartext angezeigt.
Als Passphrase wurde NerzManta9 eingegeben.
Profil erstellen
# duply <backupname> create
Ein duply-Profil wird im Home-Verzeichnis des Benutzers unter ~/.duply/ angelegt und besteht aus den folgenden Dateien:
- gpg-key.asc (nur wenn ein gpg-key exportiert wurde.)
- conf
- pre und post
- exclude
Konfiguration
Symmetrische Verschlüsselung einrichten
Voraussetzung
Key-ID und das Passwort des GPG-Keys müssen dafür hinterlegt werden.
GPG_KEY='_GPG_KEY_ID_' GPG_PW='_GPG_PASSWORD_'
Key-ID anzeigen lassen
Private-Key
gpg --list-secret-keys --keyid-format LONG
Konsole
root@linsrv01:~# gpg --list-secret-keys --keyid-format LONG gpg: "Trust-DB" wird überprüft gpg: marginals needed: 3 completes needed: 1 trust model: pgp gpg: Tiefe: 0 gültig: 1 signiert: 0 Vertrauen: 0-, 0q, 0n, 0m, 0f, 1u gpg: nächste "Trust-DB"-Pflichtüberprüfung am 2021-11-04 /root/.gnupg/pubring.kbx ------------------------ sec rsa4096/F47E1B7450082D11 2020-11-04 [SC] [verfällt: 2021-11-04] 60E3D3C9ED78CE4A40322BBAF47E1B7450082D11 uid [ ultimativ ] Robert Quies (Es grünt so grün, wenn Spaniens Blüten blühn.) <raqju@web.de> ssb rsa4096/B2E20485FF7FC772 2020-11-04 [E] [verfällt: 2021-11-04]
Public-Key
gpg --list-keys --keyid-format LONG
Konsole
root@linsrv01:~# gpg --list-keys --keyid-format LONG /root/.gnupg/pubring.kbx ------------------------ pub rsa4096/F47E1B7450082D11 2020-11-04 [SC] [verfällt: 2021-11-04] 60E3D3C9ED78CE4A40322BBAF47E1B7450082D11 uid [ ultimativ ] Robert Quies (Es grünt so grün, wenn Spaniens Blüten blühn.) <raqju@web.de> sub rsa4096/B2E20485FF7FC772 2020-11-04 [E] [verfällt: 2021-11-04]
Kompression und Art der Verschlüsselung festlegen
Zusätzlich können in GPG_OPTS= weitere Optionen zur Kompression und Art der Verschlüsselung gesetzt werden.
- Es soll mit dem freien Komprimierungsprogramm bzip2 komprimiert werden und dem symmetrischen Verschlüsselungsverfahren Advanced Encryption Standard, auch Rijndael-Algorithmus genannt, mit einer Schlüssellänge von 256 verschlüsselt werden.
GPG_OPTS='--compress-algo=bzip2 --personal-cipher-preferences AES256'
De-/Aktivieren der Überprüfung GPG-Key und GPG-Passphrase
duply prüft vor jeder Aktion ob der GPG-Key gültig ist und die Passphrase korrekt ist.
Dies kann durch die Option GPG_TEST='disabled' unterbunden werden.
Aktiviert
GPG_TEST='disabled'
Deaktiviert
# GPG_TEST='disabled'
Ziel und Quelle des Backups festlegen
Allgemeine Syntax des hosts
scheme://[user:password@]host[:port]/[/]path
Protokolle und Syntax zur Datenübertragung
duply versteht alle gängigen Protokolle zur Datenübertragung.
In der conf-Datei befindet sich meistens eine Liste der wichtigsten unterstützten Protokolle und deren Syntax.
# file://[/absolute_]path # ftp[s]://user[:password]@other.host[:port]/some_dir # hsi://user[:password]@other.host/some_dir # cf+http://container_name # imap[s]://user[:password]@host.com[/from_address_prefix] # rsync://user[:password]@other.host[:port]::/module/some_dir # # rsync over ssh (only keyauth) # rsync://user@other.host[:port]/relative_path # rsync://user@other.host[:port]//absolute_path # # for the s3 user/password are AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY # s3://[user:password]@host/bucket_name[/prefix] # s3+http://[user:password]@bucket_name[/prefix] # # scp and sftp are aliases for the ssh backend # ssh://user[:password]@other.host[:port]/some_dir # tahoe://alias/directory # webdav[s]://user[:password]@other.host/some_dir
Hier ist anzumerken, dass Sonderzeichen urlencoded eingetragen werden müssen, außer sie werden in den Parametern TARGET_USER, TARGET_PASS eingetragen.
Ziel des Backups festlegen
TARGET='scheme://user[:password]@host[:port]/[/]path'
- Es soll das Protokoll ssh zur Datenübertragung genutzt werden.
- Username: user
- Passwort: KohlIstKrempe969
- Host: foxtom.net
- Port: 22
- Pfad: home/user/backup_PC1
TARGET='ssh://user:KohlIstKrempe969@foxtom.net:22/home/user/backup_PC1'
Quelle des Backups festlegen
Root-Verzeichnis für das Backup setzen.
SOURCE=
Soll ein Backup aus mehreren Unterordnern von / bestehen (Bsp.: /etc /var /home sollen gesichert werden), so muss die SOURCE Variable auf / gesetzt werden.
SOURCE='/'
In der Regel wird SOURCE='/' gesetzt.
Dateien, die in die Sicherung aufgenommen oder von ihr ausgeschlossen werden, werden in der Datei exclude angegeben.
Maximales Alter eines Backups festlegen
Hier ist anzumerken, dass duply keine Backups löscht, sofern man es nicht anfordert.
Mit MAX_AGE wird das maximale Alter von Backups bestimmt. Das älteste Backup soll maximal ein Jahr alt sein.
MAX_AGE=1Y
Anzahl der vollständigen Backups festlegen
Mit MAX_FULL_BACKUPS kann bestimmt werden, wie viele Full-Backups duply maximal behält.
Es sollen fünf sein.
MAX_FULL_BACKUPS=5
Maximales Alter der vollständigen Backups festlegen
Alternativ kann mit MAX_FULLBKP_AGE spezifiert werden, wie alt ein Full-Backup sein darf, bevor ein neues Full-Backup erstellt wird.
Es soll zwei Wochen alt sein.
MAX_FULLBKP_AGE=2W DUPL_PARAMS="$DUPL_PARAMS --full-if-older-than $MAX_FULLBKP_AGE"
Größe der Backup-Pakete bei der Übertragung ändern
Um den durch eventuelle Übertragungsfehler entstehenden Zeitverlust einzuschränken, teilt duply standardmäßig seine Backups in 25 MB große Dateien.
Dies kann mit VOLSIZE geändert werden.
Backup-Pakete sollen 10 MB groß sein.
VOLSIZE=10 DUPL_PARAMS="$DUPL_PARAMS --volsize $VOLSIZE"
Anwendung
GPG_KEY='C676563899DE35FA' GPG_PW='NerzManta9' GPG_OPTS='--compress-algo=bzip2 --personal-cipher-preferences AES256' GPG_TEST='disabled' TARGET='ssh://user:KohlIstKrempe969@foxtom.net:22/home/user/backup_PC1' SOURCE='/' MAX_AGE=1Y MAX_FULL_BACKUPS=5 MAX_FULLBKP_AGE=2W DUPL_PARAMS="$DUPL_PARAMS --full-if-older-than $MAX_FULLBKP_AGE" VOLSIZE=10 DUPL_PARAMS="$DUPL_PARAMS --volsize $VOLSIZE"
Pre- und Post-Skripte
duply erlaubt die Verwendung von Pre- und Post-Skripten.
Das pre-Skript wird direkt vor dem Backup ausgeführt, das post-Skript direkt nach dem Backup.
Mit diesen Skripten können beispielsweise Snapshots von LVM-Volumes oder Dumps von SQL Datenbanken gemacht und in das Backup einbezogen werden.
Die files pre und post müssen im jeweiligen duply Verzeichnis liegen (Bsp.: /home/user/.duply/backup/) und ausführbar sein.
Werden die pre/post Scripte nicht wie erhofft ausgeführt (z.B. bei den Sicherchungs-Methoden "full/incr"), können diese explizit angegeben werden: pre_incr_post
Beispiel
Hier ein Beispiel für ein PRE/POST Skript welches vor dem Backup einen SQL-Dump aller Datenbanken erstellt und diesen nach dem Backup wieder löscht.
pre-Datei
/usr/bin/mysqldump --all-databases -u root -ppw> /tmp/sqldump-$(date '+%F')
post-Datei
/bin/rm /tmp/sqldump-$(date '+%F')
exclude
duply arbeitet standardmäßig mit einer Whitelist.
Um gewisse Verzeichnisse oder Dateien von einem Backup zu inkludieren muss die Datei exclude im duply Verzeichnis erstellt werden.
Die Syntax erlaubt das Hinzufügen von Verzeichnissen und Dateien mit einem + /pfad/zur/datei.
Um ein Verzeichnis zu exkludieren muss in der exclude ein - /pfad/zum/Verzeichnis eingefügt werden.
Zudem erlaubt duply die Verwendung von Wildcards.
Die hier dargestellte exclude Datei sichert die Verzeichnisse /etc/, /root/, /var/www/ und exkludiert alle anderen Verzeichnisse.
+ /etc/ + /root/ + /var/www/ - **
Parameter
duply bietet eine Vielzahl von Kommandozeilenparametern für die Sicherung und Wiederherstellung von Daten.
Die gesamte Liste ist in der Manpage von duply zu finden.
Beim Einsatz von mehreren Parameter werden diese durch einen Unterstrich (_) getrennt.
Mit /usr/bin/duply /root/.duply/test full_verify_purge --force wird ein volles Backup erstellt, verifiziert und alte Backups gelöscht.
Backups welche die MAX_AGE überschritten haben werden mit purge angezeigt und durch die zusätzliche Option --force gelöscht.
Der Befehl /usr/bin/duply /root/.duply/test incr führt ein inkrementelles Backup aus.
cronjob
Bei duply handelt es sich nicht um einen Dienst (Daemon), sondern um ein Skript, das z.B. regelmäßig via Cron ausgeführt werden kann.
Eine Beispielhafte cronjob-Konfiguration wäre:
0 0 * * 7 /usr/bin/duply /root/.duply/test full_verify_purge --force 0 0 * * 1-6 /usr/bin/duply /root/.duply/test incr
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.