Verschlüsseln Sie die tar.gz-Datei beim Erstellen

33

Ich habe ein Skript, das eine nächtliche Sicherung mehrerer Verzeichnisse erstellt.

Es wird mit erstellt tar -czf, und der Pfad der Zieldatei tar.gz befindet sich in einem bereitgestellten Netzwerkverzeichnis. Die resultierende Datei ist ungefähr 1,2 GB groß.

Die Netzwerkgeschwindigkeit ist relativ hoch (das Kopieren vom Netzwerklaufwerk auf das lokale Laufwerk erfolgt mit ~ 28 MB / s).

Jetzt möchte ich die tar.gz-Datei vor dem Übertragen auf das Netzlaufwerk mithilfe der Verschlüsselung mit öffentlichem Schlüssel verschlüsseln und möchte wissen, wie dies am besten funktioniert.

Soll ich die Datei zuerst lokal erstellen, verschlüsseln und dann kopieren? Oder gibt es eine Möglichkeit, die Teerausgabe durch einen Verschlüsselungsprozess zu "streamen" und die Ergebnisse direkt auf das Netzlaufwerk zu schreiben?

Joel L
quelle

Antworten:

34

Packen Sie your_dirin einem verschlüsselten Archiv your_archive.tgz.gpg(symmetrische Verschlüsselung):

tar -cz your_dir | gpg -c -o your_archive.tgz.gpg

Pack es aus:

gpg -d your_archive.tgz.gpg | tar xz

In den Dokumenten von GPG finden Sie Informationen zur Verwendung der asymmetrischen anstelle der symmetrischen Verschlüsselung.

Florian Diesch
quelle
2
Die Verwendung von GPG erstellt anscheinend Schlüssel im Benutzer-Home-Inhaber und fordert zur Eingabe einer Passphrase auf. Grundsätzlich scheint der Prozess für meinen Geschmack zu undurchsichtig zu sein ...
Joel L
Sollte tar xzin der zweiten Reihe von Befehlen tar -xzstattdessen sein?
Kenny Evitt
1
@KennyEvitt: Du kannst es mit oder ohne-
Florian Diesch
Dies funktioniert auch für mit gpg-zip verschlüsselte Dateien!
Trefex
2
gpg komprimiert bereits Dateien, glaube nicht, dass die zOption viel
bringt
12

Der folgende Vorgang verschlüsselt die Datei zuerst auf der lokalen Festplatte und kann dann über das Netzwerk gesendet (oder gespeichert, aber benötigt) werden.


Generieren Sie zunächst öffentliche und private Schlüssel (nur einmal):

openssl genrsa -out key.pem 2048
openssl rsa -in key.pem -out key-public.pem -outform PEM -pubout

Dann bei jedem Backup:

  1. Erzeugen Sie eine lange zufällige Passphrase und speichern Sie sie in einer Datei

    • echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
  2. Datei mit Passphase verschlüsseln

    • openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
  3. Passphrase mit öffentlichem Schlüssel verschlüsseln

    • openssl rsautl -encrypt -pubin -inkey key-public.pem < key.txt > enc.key.txt

Speichern Sie anschließend encrypted.dat UND enc.key.txt an der gewünschten Stelle.


Zum Entschlüsseln:

  1. Verschlüsselte Passphrase mit privatem Schlüssel entschlüsseln

    • openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
  2. Datei entschlüsseln

    • openssl enc -aes-256-cbc -d -pass file:key.txt < encrypted.dat > UNENCRYPTED_FILE

Dies ist viel länger als Florians Antwort, aber ich habe mich für die Verwendung entschieden, um den Prozess besser zu verstehen und nicht von serverabhängigen GPG-Konfigurationsvariablen usw. abhängig zu sein. Ich konnte auch keine nützliche GPG-Dokumentation finden.

Joel L
quelle
1
Zufällige Passphrasen können auch einfach mit openssl erstellt werden openssl rand 32 -out key.txt
Wolfgang
@Wolfgang - Ich erstelle die Passphase aus einem Python-Skript (das den Backup-Prozess ausführt), aber danke für den Tipp!
Joel L
2
Zur Info
Daniel Hiller
Was genau ist diese Datei 'enc.key.txt'? Ich betrachte einen Prozess, der meine Serverdateien sichert und nur in der Lage sein möchte, mit einem Schlüssel zu entschlüsseln, der nicht auf dem Server gespeichert ist.
Alex Stewart
6

Ich mache das mit asymmetrischer Schlüsselverschlüsselung. Das bedeutet, dass ich einen öffentlichen Schlüssel habe (den ich mit jedem teilen kann, dem ich verschlüsselte Pakete senden möchte), mit dem ich das Paket verschlüsseln kann. Ich habe auch einen privaten Schlüssel (den ich nicht teile), mit dem ich das Paket entschlüsseln kann.

Meine Befehle zum Verschlüsseln des aktuellen Arbeitsverzeichnisses: das -e zum Verschlüsseln, das -r zum Angeben eines "Empfängers" oder Schlüssels, das -o zum Angeben der Ausgabedatei.

$ tar -cvz . | gpg -e -r ABCD1234 -o backup.tgz.gpg

Und um in das aktuelle Arbeitsverzeichnis zu entschlüsseln:

$ gpg -d backup.tgz.gpg | tar -xz

Oder zum Entschlüsseln in eine Standard-TGZ-Datei zum späteren Entpacken:

$ gpg -o backup.tgz -d backup.tgz.gpg

Dies funktioniert natürlich nur, wenn ich bereits ein öffentlich-privates Schlüsselpaar erstellt und mit gpg installiert habe. In meinem Fall habe ich den Leitfaden von Digital Ocean unter https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-on-an-ubuntu verwendet -12-04-vps . Das ABCD1234 im Verschlüsselungsbefehl verweist auf einen der auf meinem System installierten öffentlichen Schlüssel. In diesem Handbuch wird auch erläutert, wie Sie Ihren öffentlichen Schlüssel freigeben und die öffentlichen Schlüssel anderer installieren, um verschlüsselte Dateien zu senden und zu empfangen.

mächtigstapel
quelle
0

GnuPG ist das, was ich für diesen Prozess ausgewählt habe, und da Sie angegeben haben, dass Entschlüsselungsschritte zu undurchsichtig sind (ich stimme in dieser Verwendungsinstanz zu), habe ich auch auf dieser Seite des Problems gearbeitet. Überprüfen Sie in den Travis-CI- Erstellungsprotokollen der Projekte, welche Funktionen derzeit wie geplant funktionieren, und in der Datei travis.yml , um die Protokollausgaben zu verfolgen . Grundsätzlich benötigen Sie drei Skripte aus diesem Projekt; das keygen-Skript, das Entschlüsselungshilfsskript und das Named-Pipe-Listener-Skript. Das Hilfsskript keygen script & decryption sollte auf dem Gerät verwendet werden, das die Entschlüsselung vornimmt, und das Skript named pipe listener sollte sich auf dem Gerät befinden, das die Verschlüsselung vornimmt.

Das verschlüsselnde Named-Pipe-Listener-Skript akzeptiert nach der Einrichtung Zeichenfolgen, Dateipfade oder Verzeichnispfade und gibt verschlüsselte Ergebnisse auf vorhersehbare Weise aus.

Im Folgenden finden Sie Beispielbefehle, die zur Verschlüsselung und zur Komprimierung und Verschlüsselung von Verzeichnissen in Ihr nächtliches Sicherungsskript eingefügt werden können

echo "some messages text" > /path/to/named.pipe
## Message text is ASCII armor encrypted and appended to specified file when script was stated
echo "${HOME}/Documents" > /path/to/named.pipe
## Directories are compressed with tar and encrypted with output to time stamped file in bulk output directory
echo "${HOME}/.bash_history"  > /path/to/named.pipe

Zur Entschlüsselung sollten Sie überprüfen, wie die Build-Skripte .travis-ci/script_decrypt.shund .travis-ci/test_search_script_decrypt.shdie angehängten Zeichenfolgen verschlüsselter Daten wiederhergestellt werden und wie Massendateien / -verzeichnisse wiederhergestellt werden.

Natürlich ist es bei diesem experimentellen Material am besten, keine Primärschlüssel-Pares zu verwenden (irgendwie, warum das keygen-Skript geschrieben wurde) und es sollte nicht für wichtige Daten verwendet werden, bis Sie sicher sind, wie Sie es in lesbarer Form wiederherstellen können.

S0AndS0
quelle