Cifrar el archivo tar.gz en crear

33

Tengo un script que crea una copia de seguridad nocturna de varios directorios.

Se crea usando tar -czf, y la ruta del archivo tar.gz de destino está en un directorio de red montado. El archivo resultante es de aproximadamente 1,2 Gb de gran tamaño.

La velocidad de la red es razonablemente rápida (la copia de la unidad de red a la local se produce a ~ 28 MB / seg).

Ahora quiero usar el cifrado de clave pública para cifrar el archivo tar.gz antes de transferirlo a la unidad de red, y me gustaría saber cuál es la mejor manera de hacerlo.

¿Debo crear el archivo localmente primero, cifrarlo y luego copiarlo? ¿O hay una manera de "transmitir" la salida de alquitrán a través de un proceso de cifrado y escribir los resultados directamente en la unidad de red?

Joel L
fuente

Respuestas:

34

Paquete your_diren un archivo cifrado your_archive.tgz.gpg(cifrado simétrico):

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

Descomprimirlo:

gpg -d your_archive.tgz.gpg | tar xz

Vea los documentos de GPG para saber cómo usar el cifrado asimétrico en lugar de simétrico.

Florian Diesch
fuente
2
El uso de GPG parece crear claves en el titular de inicio del usuario y solicita una frase de contraseña. Básicamente, el proceso parece ser demasiado opaco para mi gusto ...
Joel L
¿Debería estar tar xzen el segundo conjunto de comandos en su tar -xzlugar?
Kenny Evitt
1
@KennyEvitt: Puedes usarlo con o sin el-
Florian Diesch
¡Esto también funciona para archivos cifrados con gpg-zip!
Trefex
2
gpg ya comprime archivos, no creo que la zopción agregue mucho
feklee
12

El siguiente proceso cifra primero el archivo en el disco local, y luego puede enviarse a través de la red (o almacenarse según sea necesario)


Primero, genere claves públicas y privadas (solo una vez):

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

Luego, en cada copia de seguridad:

  1. Genere una frase de contraseña aleatoria larga, guárdela en un archivo

    • echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
  2. cifrar archivo con passphase

    • openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
  3. cifrar frase de contraseña con clave pública

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

Luego guarde encrypted.dat Y enc.key.txt donde lo desee.


Para descifrar:

  1. Descifrar la frase de contraseña cifrada con clave privada

    • openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
  2. Descifrar archivo

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

Esto es mucho más largo que la respuesta de Florian, pero decidí usarlo para poder comprender mejor el proceso y no depender de las variables de configuración de GPG dependientes del servidor, etc. Tampoco pude encontrar ninguna documentación útil de GPG.

Joel L
fuente
1
La frase de contraseña aleatoria también se puede crear fácilmente con openssl así openssl rand 32 -out key.txt
Wolfgang
@Wolfgang: en realidad estoy generando la contraseña de una secuencia de comandos de Python (que ejecuta el proceso de copia de seguridad), ¡pero gracias por el consejo!
Joel L
2
FYI: ¿Por qué no deberías cifrar archivos con openssl? Stackoverflow.com/questions/28247821/…
Daniel Hiller
¿Qué es exactamente este archivo 'enc.key.txt'? Estoy viendo un proceso que hace una copia de seguridad de los archivos de mi servidor y solo quiero poder descifrar usando una clave que no esté almacenada en el servidor.
Alex Stewart
6

Hago esto con cifrado de clave asimétrica. Eso significa que tengo una clave pública (que puedo compartir con cualquier persona que me gustaría enviarme paquetes cifrados) que me permite cifrar el paquete. También tengo una clave privada (que no comparto) que me permite descifrar el paquete.

Mis comandos para cifrar el directorio de trabajo actual: el -e para cifrar, el -r para especificar un "destinatario" o una clave para usar, el -o para especificar el archivo de salida.

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

Y para descifrar el directorio de trabajo actual:

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

O para descifrarlo en un archivo tgz estándar para desempaquetarlo más tarde:

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

Por supuesto, esto solo funciona si ya he generado un par de claves pública-privada y lo he instalado con gpg. En mi caso, lo hice usando la guía de Digital Ocean en https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-on-an-ubuntu -12-04-vps . El ABCD1234 en el comando de cifrado se refiere a una de las claves públicas instaladas en mi sistema. Esta guía también cubre cómo compartir su clave pública e instalar las claves públicas de otros para enviar y recibir archivos cifrados.

mightypile
fuente
0

GnuPG es lo que he elegido usar para este proceso y porque has declarado que los pasos de descifrado se opacan (estoy de acuerdo en esta instancia de uso) también he trabajado en ese lado del problema. Consulte los registros de compilación de Travis-CI de los proyectos para ver qué características funcionan actualmente según lo diseñado y el archivo travis.yml para seguir junto con la salida de los registros. Básicamente necesitarás tres scripts de este proyecto; el script keygen, el script auxiliar de descifrado y el script de escucha de canalización con nombre. La secuencia de comandos keygen y la secuencia de comandos auxiliar de descifrado deben usarse en el dispositivo que realizará el descifrado y la secuencia de comandos de escucha de tubería nombrada debe estar en el cifrado de preformado del dispositivo.

La secuencia de comandos de escucha de canalización con nombre de cifrado acepta cadenas, rutas de archivo o rutas de directorio una vez configuradas y genera resultados cifrados de manera predecible.

A continuación hay ejemplos de comandos que se pueden colocar en su script de copia de seguridad nocturno para el cifrado y para la compresión + cifrado de directorios

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

Para el descifrado, querrá comprobar cómo se crean los scripts de compilación .travis-ci/script_decrypt.shy .travis-ci/test_search_script_decrypt.shcómo se recuperan las cadenas adjuntas de datos cifrados y cómo se restauran los archivos / directorios masivos.

Por supuesto, con cosas de este tipo experimental, es mejor no usar pares de claves primarias (por eso se escribió el script keygen) y no se debe usar en datos importantes hasta que esté seguro de cómo restaurarlo en forma legible.

S0AndS0
fuente