Criptografar o arquivo tar.gz ao criar


33

Eu tenho um script que cria um backup noturno de vários diretórios.

Ele é criado usando tar -czfe o caminho do arquivo tar.gz de destino está em um diretório de rede montado. O arquivo resultante tem cerca de 1,2 GB de tamanho.

A velocidade da rede é razoavelmente rápida (a cópia da unidade de rede para o local ocorre em ~ 28 MB / s).

Agora, quero usar a criptografia de chave pública para criptografar o arquivo tar.gz antes de transferi-lo para a unidade de rede e gostaria de saber qual é a melhor maneira de fazer isso.

Devo criar o arquivo localmente primeiro, criptografá-lo e copiá-lo? Ou existe uma maneira de "transmitir" a saída do tar através de um processo de criptografia e gravar os resultados diretamente na unidade de rede?

Respostas:


34

Embale your_direm um arquivo criptografado your_archive.tgz.gpg(criptografia simétrica):

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

Descompacte:

gpg -d your_archive.tgz.gpg | tar xz

Consulte os documentos do GPG para saber como usar criptografia assimétrica, em vez de simétrica.


2
O uso do GPG parece criar chaves no proprietário do usuário e solicitar uma senha. Basicamente, o processo parece ser muito opaca para o meu gosto ...
Joel L

tar xzNo segundo conjunto de comandos, deveria ser tar -xz?
Kenny Evitt 29/05

1
@KennyEvitt: Você pode usá-lo com ou sem o-
Florian Diesch

Isso funciona para arquivos criptografados com o gpg-zip também!
Trefex

2
gpg já comprime arquivos, não acho que a zopção adicione muito
feklee

12

O processo a seguir criptografa o arquivo no disco local primeiro e pode ser enviado pela rede (ou armazenado conforme necessário)


Primeiro, gere chaves públicas e privadas (feitas apenas uma vez):

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

Em seguida, em cada backup:

  1. Gere uma senha longa e aleatória, salve no arquivo

    • echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
  2. criptografar arquivo com senha

    • openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
  3. criptografar senha com chave pública

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

Em seguida, salve encrypted.dat AND enc.key.txt onde desejar.


Para descriptografar:

  1. Descriptografar senha secreta criptografada com chave privada

    • openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
  2. Descriptografar arquivo

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

Isso é muito mais longo que o analisador de Florian, mas eu decidi usá-lo para entender melhor o processo e não depender das variáveis ​​de configuração do GPG dependentes do servidor, etc. Também não consegui encontrar nenhuma documentação útil do GPG.


1
Aleatório senha também podem ser criados facilmente com openssl como assim openssl rand 32 -out key.txt
Wolfgang

@ Wolfgang - Na verdade, estou gerando a fase de passagem a partir de um script python (que executa o processo de backup), mas obrigado pela dica!
Joel L

2
FYI: Por que você não deve criptografar arquivos com openssl: stackoverflow.com/questions/28247821/...
Daniel Hiller

O que exatamente é este arquivo 'enc.key.txt'? Estou analisando um processo que faz backup dos arquivos do meu servidor e só quero descriptografar usando uma chave não armazenada no servidor.
Alex Stewart

6

Eu faço isso com criptografia de chave assimétrica. Isso significa que eu tenho uma chave pública (que eu posso compartilhar com qualquer pessoa que gostaria de me enviar pacotes criptografados), o que me permite criptografar o pacote. Também tenho uma chave privada (que não compartilho) que me permite descriptografar o pacote.

Meus comandos para criptografar o diretório de trabalho atual: o -e para criptografar, o -r para especificar um "destinatário" ou chave a ser usada, o -o para especificar o arquivo de saída.

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

E para descriptografar para o diretório de trabalho atual:

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

Ou para descriptografar para um arquivo tgz padrão para descompactar posteriormente:

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

Obviamente, isso só funciona se eu já tiver gerado um par de chaves público-privado e o instalado com o gpg. No meu caso, fiz isso usando o guia da Digital Ocean em https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-on-an-ubuntu -12-04-vps . O ABCD1234 no comando de criptografia refere-se a uma das chaves públicas instaladas no meu sistema. Este guia também aborda como compartilhar sua chave pública e instalar chaves públicas de outras pessoas para enviar e receber arquivos criptografados.


0

GnuPG é o que eu escolhi usar para esse processo e porque você declarou que as etapas de descriptografia são opacas (eu concordo nesta instância de uso). Também trabalhei nesse lado do problema. Verifique os logs de construção do Travis-CI dos projetos para saber quais recursos atualmente funcionam como projetados e o arquivo travis.yml para acompanhar os resultados dos logs. Basicamente, você precisará de três scripts deste projeto; o script keygen, script auxiliar de descriptografia e script do listener de pipe nomeado. O script keygen script e o script auxiliar de descriptografia devem ser usados ​​no dispositivo que realizará a descriptografia e o script do listener de pipe nomeado deverá estar na criptografia de pré-formas do dispositivo.

O script de ouvinte de pipe nomeado de criptografia aceita cadeias de caracteres, caminhos de arquivo ou caminhos de diretório, uma vez configurados e emitidos resultados criptografados de maneira previsível.

Abaixo estão exemplos de comandos que podem ser colocados no seu script de backup noturno para criptografia e compressão de diretórios + criptografia

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 descriptografia, você deve verificar como os scripts de compilação .travis-ci/script_decrypt.she .travis-ci/test_search_script_decrypt.shcomo as seqüências anexadas de dados criptografados são recuperadas e como os arquivos / diretórios em massa são restaurados.

É claro que, com as coisas deste experimento, é melhor não usar pares de chaves primárias (meio por que o script keygen foi escrito) e não deve ser usado em dados importantes até que você tenha certeza de como restaurá-lo para a forma legível.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.