Crittografa il file tar.gz al momento della creazione


33

Ho una sceneggiatura che crea un backup notturno di diverse directory.

Viene creato utilizzando tar -czfe il percorso del file tar.gz di destinazione si trova su una directory di rete montata. Il file risultante è grande circa 1,2 GB.

La velocità della rete è ragionevolmente veloce (la copia dall'unità di rete al locale avviene a ~ 28 MB / sec).

Ora voglio usare la crittografia a chiave pubblica per crittografare il file tar.gz prima di trasferirlo sull'unità di rete e vorrei sapere qual è il modo migliore per farlo.

Devo prima creare il file localmente, crittografarlo e quindi copiarlo? Oppure esiste un modo per "trasmettere" l'output tar attraverso un processo di crittografia e scrivere i risultati direttamente sull'unità di rete?

Risposte:


34

Comprimi your_dirin un archivio crittografato your_archive.tgz.gpg(crittografia simmetrica):

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

Disimballalo:

gpg -d your_archive.tgz.gpg | tar xz

Consulta i documenti di GPG su come utilizzare la crittografia asimmetrica anziché simmetrica.


2
L'utilizzo di GPG sembra creare le chiavi nel supporto utente dell'utente e richiede una passphrase. Fondamentalmente, il processo sembra essere troppo opaco per i miei gusti ...
Joel L

Dovrebbe tar xznel secondo insieme di comandi essere tar -xzinvece?
Kenny Evitt,

1
@KennyEvitt: puoi usarlo con o senza-
Florian Diesch,

Funziona anche con file crittografati con gpg-zip!
Trefex,

2
gpg comprime già i file, non pensare che l' zopzione aggiunga molto
feklee

12

Il seguente processo crittografa prima il file sul disco locale e può quindi essere inviato sulla rete (o archiviato, se necessario)


Innanzitutto, genera chiavi pubbliche e private (eseguite una sola volta):

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

Quindi, ad ogni backup:

  1. Genera passphrase casuale lunga, salva nel file

    • echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
  2. crittografare il file con passphase

    • openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
  3. crittografare la passphrase con chiave pubblica

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

Quindi salvare crittografato.dat E enc.key.txt dove desiderato.


Per decifrare:

  1. Decifrare la passphrase crittografata con chiave privata

    • openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
  2. Decifrare il file

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

Questo è molto più lungo di quello di Florian, ma ho deciso di usarlo per capire meglio il processo e non dipendere dalle variabili di configurazione GPG dipendenti dal server, ecc. Inoltre non sono riuscito a trovare alcuna documentazione GPG utile.


1
La passphrase casuale può anche essere creata facilmente con openssl in questo modo openssl rand 32 -out key.txt
Wolfgang

@ Wolfgang - In realtà sto generando la passphase da uno script Python (che esegue il processo di backup), ma grazie per il suggerimento!
Gioele L

2
FYI: Perché non dovresti crittografare i file con openssl: stackoverflow.com/questions/28247821/…
Daniel Hiller,

Che cos'è esattamente questo file 'enc.key.txt'? Sto osservando un processo che esegue il backup dei file del mio server e voglio solo essere in grado di decrittografare utilizzando una chiave non memorizzata sul server.
Alex Stewart,

6

Lo faccio con la crittografia a chiave asimmetrica. Ciò significa che ho una chiave pubblica (che posso condividere con chiunque mi piacerebbe inviarmi pacchetti crittografati) che mi consente di crittografare il pacchetto. Ho anche una chiave privata (che non condivido) che mi consente di decrittografare il pacchetto.

I miei comandi per crittografare la directory di lavoro corrente: -e per crittografare, -r per specificare un "destinatario" o una chiave da utilizzare, -o per specificare il file di output.

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

E per decrittografare nella directory di lavoro corrente:

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

O per decrittografare in un file tgz standard per il successivo disimballaggio:

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

Ovviamente, questo funziona solo se ho già generato una coppia di chiavi pubblica-privata e l'ho installata con gpg. Nel mio caso, l'ho fatto usando la guida di Digital Ocean su https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-on-an-ubuntu -12-04-vps . L'ABCD1234 nel comando di crittografia fa riferimento a una delle chiavi pubbliche installate sul mio sistema. Questa guida illustra anche come condividere la chiave pubblica e installare le chiavi pubbliche di altri per inviare e ricevere file crittografati.


0

GnuPG è quello che ho scelto di utilizzare per questo processo e poiché hai dichiarato che i passaggi di decrittazione dove opacizzare (sono d'accordo in questa istanza di utilizzo) ho lavorato anche su quel lato del problema. Controllare i registri di costruzione Travis-CI dei progetti per quali funzioni funzionano attualmente come progettato e il file travis.yml da seguire insieme all'output dei registri. Fondamentalmente avrai bisogno di tre script da questo progetto; lo script keygen, lo script helper di decrittazione e lo script listener di nome pipe. Lo script keygen e lo script dell'helper di decrittografia devono essere utilizzati sul dispositivo che preformerà la decrittografia e lo script listener di pipe denominato dovrebbe trovarsi sul dispositivo di crittografia di preformatura.

Lo script del listener di pipe con nome crittografato accetta stringhe, percorsi di file o percorsi di directory una volta impostati e genera risultati crittografati in modo prevedibile.

Di seguito sono riportati alcuni comandi che potrebbero essere inseriti nello script di backup notturno per la crittografia e per la compressione delle directory + crittografia

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

Per la decrittazione ti consigliamo di controllare come vengono recuperati gli script di build .travis-ci/script_decrypt.she .travis-ci/test_search_script_decrypt.shcome vengono recuperate le stringhe aggiunte di dati crittografati e come vengono ripristinati file / directory di massa.

Naturalmente con cose così sperimentali è meglio non usare le chiavi primarie (un po 'perché lo script keygen è stato scritto) e non dovrebbe essere usato su dati importanti fino a quando non si è sicuri su come ripristinarlo in forma leggibile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.