Verwendung von Duplicity mit GPG zum Sichern von Daten in DigitalOcean Spaces

Einführung

Duplicity ist ein in Python geschriebenes Befehlszeilenprogramm, das verschlüsselte Tar-Volumes zur Speicherung in einem lokalen oder Remote-Repository erstellt. Es verwendetGNU Privacy Guard (GPG) zum Verschlüsseln und Signieren seiner Archive und den rsync-Algorithmus zum Erstellen inkrementeller, platzsparender Sicherungen. Sicherungen können an eine Vielzahl von Repositorys übertragen werden, einschließlich lokalem Dateispeicher, SFTP- oder FTP-Servern und S3-kompatiblen Objektspeichern.

In diesem Tutorial werden wir Duplicity installieren und erläutern, wie Projektdaten in DigitalOcean Spaces, einem S3-kompatiblen Objektspeicherdienst, gesichert werden. Zu diesem Zweck erstellen wir ein Spaces-Repository und erläutern, wie Sie Daten manuell darauf sichern können. Schließlich werden wir diesen Prozess automatisieren, indem wir ein Skript erstellen, das inkrementelle und wöchentliche Zeitpläne für die vollständige Sicherung erstellt.

Voraussetzungen

Für dieses Tutorial benötigen Sie:

  • Ein Ubuntu 16.04-Server, der gemäß unserenInitial Server Setup with Ubuntu 16.04 tutorial eingerichtet wurde. Nachdem Sie dieses Tutorial befolgt haben, sollten Sie einen Benutzer ohne Rootberechtigung für sudo haben.

  • Ein DigitalOcean Space- und API-Schlüssel, der durch Folgen vonHow To Create a DigitalOcean Space and API Key erstellt wird. Achten Sie darauf, die folgenden Anmeldeinformationen für Ihren Space zu notieren:

    • Zugangsschlüssel

    • Geheimer Schlüssel

    • Leerzeichen-URL

    • Bucket-Name

Sobald Sie Ihren Space eingerichtet haben und diese Informationen zur Hand haben, können Sie mit der Installation von Duplicity fortfahren.

Installieren von Duplicity

Um eine aktuelle Version von Duplicity zu erhalten, können wir sie vonDuplicity releases Personal Package Archive (PPA) installieren:

sudo apt-add-repository ppa:duplicity-team/ppa

Wir werden auch das Paketpython-boto installieren, um Zugriff aufBoto zu erhalten, ein Python-Paket, das Schnittstellen zu Amazon Web Services bereitstellt. Auf diese Weise können wir die Interoperabilität von Spaces mit der AWS S3-API nutzen. Wir werdenpython-boto aus den offiziellen Ubuntu-Repositories installieren, da diese Version mit der Version von Python kompatibel ist, die mit unserem Ubuntu-Server-Image geliefert wird. Wenn SieBoto3 bevorzugen, können Sie es von der Quelle aus installieren, obwohl die Funktionskompatibilität mit Python 3.3+ noch in der Entwicklung ist.

Zusätzlich zupython-boto werden wir auchHaveged installieren, ein Tool, mit dem wir dieentropy generieren können, die zum Erstellen unserer GPG-Schlüssel erforderlich sind. Um diese Schlüssel zu erstellen, stützt sich GPG auf die Entropie oder Unvorhersehbarkeit in unserem System. Durch die Installation vonhaveged können wir den Schlüsselerstellungsprozess beschleunigen.

Aktualisieren Sie vor der Installation dieser Pakete den lokalen Repository-Index:

sudo apt-get update

Installieren Sie dannduplicity,python-boto undhaveged, indem Sie Folgendes eingeben:

sudo apt-get install duplicity haveged python-boto

Drücken Siey, wenn Sie aufgefordert werden, die Installation zu bestätigen. Wir haben jetzt Duplicity auf unserem System installiert und sind bereit, unsere Projektordner und Konfigurationsdateien zu erstellen.

Erstellen eines Sicherungsverzeichnisses

Um zu veranschaulichen, wie der Sicherungsvorgang funktioniert, erstellen wir ein Verzeichnis für unsere Sicherungen im Ausgangsverzeichnis des Nicht-Root-Benutzers sowie einige Beispieldaten. Wir werden unser Verzeichnissammy_backups aufrufen:

mkdir ~/sammy_backups

Erstellen Sie als Nächstes eine Beispielprojektdatei mit dem Namenhistorical_sharks.txt:

echo "The ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators." >> ~/sammy_backups/historical_sharks.txt

Mit unserem Sicherungsverzeichnis und den vorhandenen Testdaten können wir einen GPG-Schlüssel für unseren Nicht-Root-Benutzer generieren.

GPG-Schlüssel generieren

Als Nächstes generieren wir ein GPG-Schlüsselpaar für unseren Benutzer. Um die sichere Übertragung von Informationen zu gewährleisten, verwendet GPG die Verschlüsselung mit öffentlichen Schlüsseln. In unserem Kontext bedeutet dies, dass Daten mit unserem öffentlichen Schlüssel verschlüsselt und an unser Repository gesendet werden. Weitere Informationen zu GPG-Schlüsseln und Verschlüsselung finden Sie in unserem Tutorial zuHow To Use GPG to Sign and Encrypt Messages.

Unsere Schlüsselringe werden in unserem Benutzerkonto in einem Verzeichnis namens~/.gnupg gespeichert, das beim Generieren der Schlüssel erstellt wird. Wenn wir den Befehlduplicity verwenden, geben wir eine öffentliche Schlüsselkennung an, die auf unser Schlüsselpaar verweist. Durch die Verwendung dieser Kennung werden die Datenverschlüsselung und die Signatur aktiviert, die unseren Besitz des privaten Schlüssels bestätigen. Die verschlüsselten Daten werden an unser Repository übertragen, wo es schwierig sein wird, mehr als Dateigröße und Upload-Zeit aus den Dateien selbst abzuleiten. Dies schützt Ihre Daten, die unser Benutzer jederzeit mit dem privaten Schlüssel vollständig wiederherstellen kann.

GPG sollte standardmäßig auf unserem Server installiert sein. Um dies zu testen, geben Sie Folgendes ein:

gpg --version

Nachdem Sie überprüft haben, dass GPG installiert ist, können Sie wie folgt ein Schlüsselpaar generieren:

gpg --gen-key

Sie erhalten eine Reihe von Fragen zur Konfiguration Ihrer Schlüssel:

  • Art des Schlüssels. Wählen Sie(1) RSA and RSA (default).

  • Größe des Schlüssels. Durch Drücken vonENTER wird die Standardgröße von2048 Bits bestätigt.

  • Ablaufdatum des Schlüssels. Durch Eingabe von1y erstellen wir einen Schlüssel, der nach einem Jahr abläuft.

  • Bestätigen Sie Ihre Auswahl. Sie können dies tun, indem Siey eingeben.

  • Benutzer-ID / Realer Name. Geben Sieyour name ein.

  • E-Mail-Addresse. Geben Sieyour email address ein.

  • Kommentar. Hier können Sie einoptional commenteingeben, das mit Ihrer Signatur sichtbar wird.

  • Ändern Sie (N) ame, © omment, (E) mail oder (O) kay / (Q) uit? Geben SieO ein, wenn Sie fortfahren möchten.

  • Passphrase eingeben. Sie werden aufgefordert, hier einpassphraseeinzugeben. Be sure to take note of this passphrase. Wir werden im weiteren Verlauf dieses Tutorials alsyour-GPG-key-passphrase darauf zurückgreifen.

Nachdem Sie diese Einstellungen erstellt haben, generiertgpg die Schlüssel basierend auf der Entropiestufe im System. Da wirhaveged installiert haben, sollten unsere Schlüssel entweder sehr schnell oder sofort generiert werden. Es wird eine Ausgabe angezeigt, die Folgendes enthält:

Output...
gpg: /home/sammy/.gnupg/trustdb.gpg: trustdb created
gpg: key your-GPG-public-key-id marked as ultimately trusted
public and secret key created and signed.
...

Beachten Sieyour-GPG-public-key-id, da wir es im nächsten Abschnitt verwenden werden, um unsere lokalen Umgebungsvariablen zu konfigurieren.

Manuelle Backups erstellen

Wir werden jetzt Umgebungsvariablen festlegen, damit wir keine vertraulichen Informationen in die Befehlszeile eingeben müssen, während der Befehlduplicityausgeführt wird. Diese Variablen stehen dem Benutzer während unserer aktuellen Sitzung zur Verfügung und werden in einem versteckten Verzeichnis gespeichert, damit sie später verwendet werden können. Zu den Variablen, dieduplicity benötigen und die wir als Umgebungsvariablen definieren, gehören unser Spaces Access Key und Secret sowie unsere GPG Public Key ID und Passphrase.

Zunächst erstellen wir ein verstecktes Verzeichnis im Ausgangsverzeichnis unseres Benutzers, in dem die Konfigurationsdatei gespeichert wird:

mkdir ~/.duplicity

Als Nächstes erstellen wir eine Datei mit dem Namen.env_variables.conf, um unsere Variablen zu definieren. Dazu verwenden wir die Anweisungen vonexport. Diese Anweisungen stellen die Variablen Programmen zur späteren Verwendung zur Verfügung. Öffnen Sie die Datei, indem Sie Folgendes eingeben:

nano ~/.duplicity/.env_variables.conf

Legen Sie in der Datei Ihren Spaces Access Key und Secret sowie Ihre GPG Public Key ID und Passphrase fest:

~/.duplicity/.env_variables.conf

export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
export GPG_KEY="your-GPG-public-key-id"
export PASSPHRASE="your-GPG-key-passphrase"

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Wir können jetzt Berechtigungen für die Datei festlegen, um sicherzustellen, dass nur unser aktueller Nicht-Root-Benutzer Lese- und Schreibzugriff hat:

chmod 0600 ~/.duplicity/.env_variables.conf

Stellen Sie diese Variablen für die Verwendung in der aktuellen Bash-Sitzung zur Verfügung, indem Sie Folgendes eingeben:

source ~/.duplicity/.env_variables.conf

Als Nächstes führen wirduplicity aus, um eine manuelle, vollständige Sicherung unseres~/sammy_backups-Verzeichnisses zu erstellen. Wenn Sieduplicity ohne die Aktionfull ausführen, wird eine erste vollständige Sicherung erstellt, gefolgt von inkrementellen Sicherungen. Wir werden bei unserer ersten Verwendung des Befehls eine vollständige Sicherung erstellen. Wenn Sie jedoch eine weitere vollständige manuelle Sicherung dieses Verzeichnisses erstellen möchten, müssen Sie die Aktionfullangeben.

Weitere Optionen, die wir in unserem Befehl definieren, sind:

  • --verbosity: Hiermit wird der Informationsstand angegeben, den wir in unserer Ausgabe wünschen. Wir werdeninfo angeben, die detaillierter sind als die Standardeinstellung vonnotice.

  • --encrypt-sign-key: Hiermit wirdduplicity angewiesen, den öffentlichen Schlüssel in dem Paar zu verschlüsseln, das wir mityour-GPG-public-key-id in der VariablenGPG_KEY identifiziert haben. Außerdem wirdduplicity angewiesen, denselben Bezeichner zu verwenden, um die Signaturfunktion zu aktivieren.

  • --log-file: Diese Option gibt einen Speicherort für die Protokolldateien an, der auch anderen Programmen zur Verfügung steht. Dies gibt uns einen einfachen Ort, an dem wir nach Fehlern suchen können. Wir werden den Speicherort der Protokolldatei als/home/sammy/.duplicity/info.log angeben.

Zuletzt geben wir das Verzeichnis, das wir sichern, und unseren Repository-Endpunkt an. Wir sichern das Verzeichnis~/sammy_backupsim Home-Verzeichnis unseres Benutzers. Unser Repository wird unser Space sein, den wir anhand der folgenden Informationen definieren:s3://spaces_endpoint/bucket_name/. Sie können Ihren Endpunkt- und Bucket-Namen wie folgt bestimmen: Wenn die URL Ihres Spacehttps://sammys-bucket.nyc3.digitaloceanspaces.com lautet, istsammys-bucket Ihr Bucket-Name undnyc3.digitaloceanspaces.com Ihr Endpunkt.

Der Befehlduplicityieht letztendlich so aus:

duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log /home/sammy/sammy_backups \
s3://nyc3.digitaloceanspaces.com/sammys-bucket/

Nach dem Ausführen dieses Befehls sehen wir die Ausgabe wie folgt:

Output...
--------------[ Backup Statistics ]--------------
StartTime 1522417021.39 (Fri Mar 30 13:37:01 2018)
EndTime 1522417021.40 (Fri Mar 30 13:37:01 2018)
ElapsedTime 0.01 (0.01 seconds)
SourceFiles 2
SourceFileSize 4226 (4.13 KB)
NewFiles 2
NewFileSize 4226 (4.13 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 2
RawDeltaSize 130 (130 bytes)
TotalDestinationSizeChange 955 (955 bytes)
Errors 0
-------------------------------------------------

Um zu überprüfen, ob die Dateien wie beabsichtigt in Ihren Space hochgeladen wurden, können Sie zuSpaces page in the DigitalOcean control panel navigieren, um zu überprüfen, ob sie vorhanden sind.

Daten wiederherstellen

Um zu testen, ob wir unsere Daten wiederherstellen können, entfernen wir jetzt unsere Beispieldatei und stellen sie aus unserem Repository wieder her. Um Dateien mit Duplicity wiederherzustellen, können Sie die Option--file-to-restore verwenden. Es ist auch erforderlich, die Reihenfolge der Elemente in unserem Befehlduplicityumzukehren: Unsere Repository-URL fungiert jetzt als Ursprung, und unser Sicherungsverzeichnis ist das Ziel für unsere wiederhergestellte Datei.

Entfernen Sie die Datei, indem Sie Folgendes eingeben:

rm ~/sammy_backups/historical_sharks.txt

Stellen Sie sicher, dass die Datei entfernt wurde:

cat ~/sammy_backups/historical_sharks.txt

Sie sollten die folgende Ausgabe sehen:

Outputcat: /home/sammy/sammy_backups/historical_sharks.txt: No such file or directory

Als nächstes stellen wir diese Datei aus unserem Space wieder her. Mit der Option--file-to-restore können wir den Pfad der Datei angeben, die wiederhergestellt werden soll. Dieser Pfad sollte relativ zu dem Verzeichnis sein, das wir gesichert haben. In unserem Fall beträgt unser relativer Pfadhistorical_sharks.txt. Wir werden auch die Reihenfolge unserer Space-URL und unseres Sicherungsverzeichnisses umkehren, um anzuzeigen, dass wir die Datei aus unserem Repository wiederherstellen:

duplicity --verbosity info --encrypt-sign-key=$GPG_KEY --log-file /home/sammy/.duplicity/info.log --file-to-restore historical_sharks.txt \
s3://nyc3.digitaloceanspaces.com/sammys-bucket /home/sammy/sammy_backups/historical_sharks.txt

Sie sehen die Ausgabe wie folgt:

Output...
Processing local manifest /home/sammy/.cache/duplicity/d9911d387bb9ee345a171141106ab714/duplicity-full.20180402T170008Z.manifest (195)
Found 1 volumes in manifest
Deleting /tmp/duplicity-e66MEL-tempdir/mktemp-_A24DP-6
Processed volume 1 of 1

Wenn Siecat erneut ausführen, wird der Inhalt der wiederhergestelltenhistorical_sharks.txt-Datei ausgegeben:

cat ~/sammy_backups/historical_sharks.txt
OutputThe ancient Megalodon shark reached lengths of up to 59 feet, and is widely regarded as one of history's most fearsome predators.

Nachdem wir eine manuelle Sicherung des Verzeichnisses~/sammy_backupserstellt und Daten aus unserem Repository wiederhergestellt haben, können wir mit der Automatisierung des Sicherungsprozesses fortfahren.

Backups automatisieren

Durch die Automatisierung des Sicherungsprozesses kann sichergestellt werden, dass die Daten in unserem Verzeichnis~/sammy_backupswiederherstellbar und aktuell bleiben. Wir können den Job Scheduler voncronverwenden, um einen Sicherungsplan zu erstellen, der jede Woche eine vollständige Sicherung und ansonsten inkrementelle Sicherungen enthält. Weitere Informationen zur Verwendung voncron zum Planen von Aufgaben finden Sie in unserem Lernprogramm zuHow To Schedule Routine Tasks With Cron and Anacron on a VPS.

Erstellen wir zunächst ein Sicherungsskript in unserem Verzeichnis~/.duplicity:

nano ~/.duplicity/.backup.sh

In dieser Datei legen wir zunächst fest, dass dieses Skript von der Bash-Shell ausgeführt wird:

~/.duplicity/.backup.sh

#!/bin/bash

Als Nächstes erstellen wir eine VariableHOME, die mit unseren Befehlensource undduplicity verwendet wird. Achten Sie darauf, den hervorgehobenen Benutzernamen, das Sicherungsverzeichnis und den Bucket-Namen durch Ihre Informationen zu ersetzen:

~/.duplicity/.backup.sh

...
HOME="/home/sammy"

source "$HOME/.duplicity/.env_variables.conf"

duplicity \
    --verbosity info \
    --encrypt-sign-key="$GPG_KEY" \
    --full-if-older-than 7D \
    --log-file "$HOME/.duplicity/info.log" \
    /home/sammy/sammy_backups \
    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

Die Befehlesource undduplicity funktionieren hier genauso wie beim Erstellen unserer manuellen Sicherung:source lädt unsere Umgebungsvariablen in den aktuellen Kontext, währendduplicity verschlüsselt erstellt Teervolumen, die an unser Repository gesendet werden sollen. Unsere Optionen bleiben alle gleich, mit Ausnahme der Option--full-if-older-than. Diese Option ist auf7D eingestellt und gibt an, dass jede Woche eine vollständige Sicherung durchgeführt wird, sobald die letzte vollständige Sicherung älter als sieben Tage ist.

Die letzten Elemente in unserem Skript sindunset Befehle, mit denen unsere Umgebungsvariablen als Sicherheitsmaßnahme entfernt werden:

~/.duplicity/.backup.sh

...
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

Das vollständige Skript sieht folgendermaßen aus:

~/.duplicity/.backup.sh

#!/bin/bash

HOME="/home/sammy"

source "$HOME/.duplicity/.env_variables.conf"

duplicity \
    --verbosity info \
    --encrypt-sign-key="$GPG_KEY" \
    --full-if-older-than 7D \
    --log-file "$HOME/.duplicity/info.log" \
    /home/sammy/sammy_backups \
    s3://nyc3.digitaloceanspaces.com/sammys-bucket/

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset GPG_KEY
unset PASSPHRASE

Wenn Sie mit dem Skript zufrieden sind, können Sie die Datei speichern und schließen. Wir werden auch Berechtigungen festlegen, um sicherzustellen, dass nur unser aktueller Nicht-Sudo-Benutzer die Datei lesen, schreiben und ausführen kann:

chmod 0700 ~/.duplicity/.backup.sh

Schließlich können wir unseren Sicherungszeitplan automatisieren, indem wir diecrontab-Datei unseres Benutzers bearbeiten. Öffnen Sie diese Datei zum Bearbeiten, indem Sie Folgendes eingeben:

crontab -e

Da wir diese Datei zum ersten Mal bearbeiten, werden wir gebeten, einen Editor auszuwählen:

crontab

no crontab for root - using an empty one
Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny
Choose 1-4 [2]:
...

Sie können2 für Nano auswählen oder die Nummer eingeben, die dem Editor Ihrer Wahl entspricht.

Am Ende der Datei fügen wir eine Zeile hinzu, um anzugeben, wie oft unser Skript ausgeführt werden soll. Um die Funktionalität zu testen, können wir unser Zeitintervall wie folgt auf zwei Minuten einstellen:

crontab

...

*/2 * * * * /home/sammy/.duplicity/.backup.sh

Speichern und schließen Sie die Datei. Nach zwei Minuten können Sie zuSpaces page in the DigitalOcean control panel navigieren, wo Sie inkrementelle Sicherungsdateien sehen sollten. Sie können jetzt diecrontab-Datei ändern, um das Zeitintervall anzugeben, das Sie für Ihre inkrementellen Sicherungen verwenden möchten.

Fazit

In diesem Lernprogramm wurde erläutert, wie der Inhalt eines bestimmten Verzeichnisses in einem Spaces-Repository gesichert wird. Unter Verwendung einer Konfigurationsdatei zum Speichern unserer Repository-Informationen haben wir eine manuelle Sicherung unserer Daten erstellt, die wir durch Wiederherstellen einer Beispieldatei getestet haben, und einen automatisierten Sicherungszeitplan erstellt.

Weitere Informationen zur Duplizität finden Sie sowohl inproject websiteals auch induplicity man page. Diese Dokumentation behandelt die zahlreichen Funktionen von Duplicity und bietet Anleitungen zum Erstellen vollständiger Systemsicherungen.